Programavimas

Saugumas ir klasės tikrintojas

Šio mėnesio straipsnyje tęsiama „Java“ saugumo modelio diskusija, pradėta rugpjūčio mėnesio „Po gaubtu“. Tame straipsnyje aš apžvelgiau saugos mechanizmus, įmontuotus „Java“ virtualioje mašinoje (JVM). Aš taip pat atidžiai išnagrinėjau vieną šių saugumo mechanizmų aspektą: JVM įmontuotas saugos funkcijas. Rugsėjo mėn. „Po gaubtu“ išnagrinėjau klasės krautuvų architektūrą - dar vieną JVM integruotų saugumo mechanizmų aspektą. Šį mėnesį daugiausia dėmesio skirsiu trečiajai JVM saugumo strategijos daliai: klasės tikrintojui.

Klasės bylos tikrintojas

Kiekvienoje „Java“ virtualioje mašinoje yra klasės failų tikrintuvas, kuris užtikrina, kad pakrautų klasės failų vidinė struktūra būtų tinkama. Jei klasės failo tikrintojas aptinka klasės failo problemą, jis sukuria išimtį. Kadangi klasės failas yra tik dvejetainių duomenų seka, virtuali mašina negali žinoti, ar tam tikrą klasės failą sugeneravo geranoriškas „Java“ kompiliatorius, ar šešėliniai krekeriai, linkę pažeisti virtualiosios mašinos vientisumą. Todėl visi JVM diegimai turi klasės failų tikrintuvą, kuriuo galima pasinaudoti nepatikimose klasėse, kad būtų užtikrinta, jog klases yra saugu naudoti.

Vienas iš saugos tikslų, kurį padeda pasiekti klasės failų tikrintuvas, yra programos tvirtumas. Jei klaidus kompiliatorius ar nuovokus krekerius sugeneravo klasės failą, kuriame buvo metodas, kurio baitkoduose buvo nurodymas peršokti už metodo pabaigos, šis metodas, jei jis būtų naudojamas, galėtų sukelti virtualios mašinos gedimą. Taigi, siekiant patikimumo, svarbu, kad virtuali mašina patikrintų importuojamų baitekodų vientisumą.

Nors „Java“ virtualių mašinų dizaineriams leidžiama nuspręsti, kada jų virtualiosios mašinos atliks šiuos patikrinimus, daugelis diegimų labiausiai tikrins iškart po to, kai bus įkelta klasė. Tokia virtuali mašina vieną kartą išanalizuoja baitų kodus (ir patikrina jų vientisumą), kol jie dar nėra vykdomi. Tikrindama baitų kodus, „Java“ virtualioji mašina patikrina visas peršokimo instrukcijas, pavyzdžiui, eiti į (šuolis visada), jei (peršokti, jei kamino viršus yra nulis) ir pan. - pereikite prie kitos galiojančios instrukcijos metodo baitų kodų sraute. Todėl virtualiai mašinai nereikia tikrinti, ar yra tinkamas tikslas kiekvieną kartą, kai ji susiduria su peršokimo instrukcija, kai ji vykdo baitų kodus. Daugeliu atvejų visų baitekodų tikrinimas vieną kartą prieš juos vykdant yra efektyvesnis būdas užtikrinti patikimumą, nei tikrinti kiekvieną baitekodo komandą kiekvieną kartą, kai ji vykdoma.

Klasės bylos tikrintuvas, kuris tikrina kuo anksčiau, greičiausiai veikia dviem skirtingais etapais. Pirmojo etapo metu, kuris vyksta iškart po klasės įkėlimo, klasės failų tikrintuvas patikrina klasės failo vidinę struktūrą, įskaitant patikrinimą, ar joje yra baitų kodų. Antrojo etapo metu, vykstančiame vykdant baitų kodus, klasės failų tikrintuvas patvirtina, kad egzistuoja simboliškai nurodytos klasės, laukai ir metodai.

Pirmas etapas: vidiniai patikrinimai

Pirmojo etapo metu klasės failų tikrintuvas patikrina viską, ką įmanoma patikrinti klasės faile, žiūrėdamas tik į patį klasės failą (nenagrinėdamas jokių kitų klasių ar sąsajų). Pirmasis klasės failų tikrintuvo etapas užtikrina, kad importuotas klasės failas yra tinkamai suformuotas, nuoseklus viduje, laikosi „Java“ programavimo kalbos apribojimų ir jame yra baitų kodai, kuriuos „Java“ virtuali mašina galės saugiai vykdyti. Jei klasės failo tikrintojas nustato, kad kuri nors iš jų nėra teisinga, tai sukelia klaidą ir klasės failas niekada nenaudojamas programos.

Tikrinamas formatas ir vidinis nuoseklumas

Pirmojo etapo metu tikrintojas ne tik patikrina baitų kodų vientisumą, bet ir patikrina, ar tinkamas klasės failų formatas ir vidinis nuoseklumas. Pavyzdžiui, kiekvienas klasės failas turi prasidėti tais pačiais keturiais baitais, stebuklingu numeriu: 0xCAFEBABE. Stebuklingų skaičių tikslas yra palengvinti failų analizatorių tam tikros rūšies failų atpažinimą. Taigi pirmas dalykas, kurį tikrina klasės failų tikrintojas, yra tai, kad importuotas failas iš tikrųjų prasideda 0xCAFEBABE.

Klasės failo tikrintuvas taip pat patikrina, ar klasės failas nėra nei sutrumpintas, nei patobulintas papildomais galiniais baitais. Nors skirtingi klasės failai gali būti skirtingo ilgio, kiekvienas atskiras klasės faile esantis komponentas nurodo jo ilgį ir tipą. Tikrintojas gali naudoti komponentų tipus ir ilgius, kad nustatytų teisingą bendrą kiekvienos klasės failo ilgį. Tokiu būdu jis gali patikrinti, ar importuoto failo ilgis atitinka jo vidinį turinį.

Tikrintojas taip pat žiūri į atskirus komponentus ir įsitikina, kad jie yra gerai suformuoti jų tipo komponentai. Pavyzdžiui, metodo aprašas (metodo grąžinimo tipas ir jo parametrų skaičius bei tipai) klasės faile saugomas kaip eilutė, kuri turi atitikti tam tikrą be konteksto gramatiką. Vienas iš patikrinimų, kuriuos tikrintojas atlieka atskiriems komponentams, yra įsitikinti, kad kiekvienas metodo aprašas yra tinkamai suformuota atitinkamos gramatikos eilutė.

Be to, klasės failų tikrintuvas patikrina, ar pati klasė laikosi tam tikrų apribojimų, kuriuos jai kelia „Java“ programavimo kalbos specifikacija. Pavyzdžiui, tikrintojas įgyvendina taisyklę, kad visos klasės, išskyrus klasę Objektas, turi turėti superklasę. Taigi klasės failų tikrintuvas vykdymo metu patikrina kai kurias „Java“ kalbos taisykles, kurios turėjo būti vykdomos kompiliavimo metu. Kadangi tikrintojas negali žinoti, ar klasės failą sugeneravo geranoriškas kompiliatorius, kuriame nėra klaidų, jis tikrina kiekvieną klasės failą, kad įsitikintų, jog laikomasi taisyklių.

$config[zx-auto] not found$config[zx-overlay] not found