Programovanie

Zabezpečenie a architektúra zavádzača tried

Predchádzajúca 1 2 Strana 2 Strana 2 z 2

Nakladače tried a medzery

Pre každú načítanú triedu JVM sleduje, ktorý zavádzač triedy - či už prvotný alebo objektový - načítal triedu. Keď sa načítaná trieda najskôr odkazuje na inú triedu, virtuálny stroj si vyžiada odkazovanú triedu z rovnakého zavádzača triedy, ktorý pôvodne načítal odkazujúcu triedu. Napríklad ak virtuálny stroj načíta triedu Sopka prostredníctvom zavádzača konkrétnych tried sa pokúsi načítať všetky triedy Sopka odkazuje prostredníctvom rovnakého zavádzača triedy. Ak Sopka odkazuje na triedu s názvom Láva, možno vyvolaním metódy v triede Láva, virtuálny stroj požiada Láva z načítavača triedy, ktorý sa načítal Sopka. The Láva trieda vrátená nakladačom tried je dynamicky prepojená s triedou Sopka.

Pretože JVM používa tento prístup k načítaniu tried, môžu triedy predvolene vidieť iba iné triedy, ktoré boli načítané rovnakým zavádzačom tried. Týmto spôsobom vám architektúra Java umožňuje vytvárať viac menné priestory v jednej aplikácii Java. Menný priestor je sada jedinečných názvov tried načítaných konkrétnym zavádzačom tried. Pre každý zavádzač tried udržuje JVM priestor názvov, ktorý je vyplnený názvami všetkých tried, ktoré boli načítané pomocou tohto zavádzača tried.

Len čo JVM načíta triedu s názvom Sopka napríklad do konkrétneho priestoru mien nie je možné načítať inú pomenovanú triedu Sopka do toho istého priestoru mien. Môžete načítať viac Sopka triedy do JVM, pretože vo vnútri aplikácie Java môžete vytvoriť viac priestorov názvov. Môžete to urobiť jednoducho vytvorením viacerých nakladačov tried. Ak vytvoríte tri samostatné priestory mien (jeden pre každý z troch zavádzačov triedy) v spustenej aplikácii Java, potom načítaním jedného Sopka triedy do každého priestoru mien, váš program mohol načítať tri rôzne Sopka triedy do vašej prihlášky.

Aplikácia Java môže vytvoriť inštanciu viacerých objektov zavádzača tried z jednej triedy alebo z viacerých tried. Môže teda vytvárať toľko (a toľko rôznych druhov) objektov triedy loader ako potrebuje. Triedy načítané rôznymi zavádzačmi tried sa nachádzajú v rozdielnych menných priestoroch a nemôžu k sebe navzájom získať prístup, pokiaľ to aplikácia výslovne neumožňuje. Pri písaní aplikácie Java môžete triedy načítané z rôznych zdrojov rozdeliť do rôznych priestorov mien. Týmto spôsobom môžete pomocou architektúry nakladača triedy Java ovládať akúkoľvek interakciu medzi kódom načítaným z rôznych zdrojov. Môžete zabrániť nepriateľskému kódu v získaní prístupu k podvrátenému kódu a jeho podvráteniu.

Nakladače tried pre applety

Jedným príkladom dynamického rozšírenia s načítavačmi tried je webový prehľadávač, ktorý používa objekty načítavača tried na stiahnutie súborov triedy pre applet cez sieť. Webový prehľadávač spúšťa aplikáciu Java, ktorá inštaluje objekt triedy loader - zvyčajne sa nazýva nakladač triedy appletov - ktorý vie, ako požiadať o súbory triedy zo servera HTTP. Príkladom dynamického rozšírenia sú applety, pretože pri spustení aplikácie Java nevie, ktoré súbory triedy ho prehliadač požiada o stiahnutie v sieti. Súbory triedy, ktoré sa majú stiahnuť, sa určujú za behu, pretože prehliadač narazí na stránky, ktoré obsahujú applety Java.

Aplikácia Java spustená webovým prehľadávačom zvyčajne vytvorí iný objekt zavádzača tried appletov pre každé umiestnenie v sieti, z ktorého načítava súbory tried. Vo výsledku sa súbory triedy z rôznych zdrojov načítajú z rôznych objektov zavádzača tried. Toto ich umiestni do rôznych menných priestorov vo vnútri hostiteľskej aplikácie Java. Pretože súbory triedy pre applety z rôznych zdrojov sú umiestnené v samostatných priestoroch mien, kód škodlivého appletu nemôže priamo zasahovať do súborov triedy stiahnutých z iného zdroja.

Spolupráca medzi triednymi nakladačmi

Objekt triedy loader sa často spolieha na iné programy triedy loaders - prinajmenšom na prvotný program triedyloader - aby mu pomohol splniť niektoré požiadavky na načítanie triedy, ktoré mu prichádzajú do cesty. Napríklad si predstavte, že napíšete aplikáciu Java, ktorá inštaluje zavádzač tried, ktorého konkrétny spôsob načítania súborov tried sa dosahuje ich stiahnutím cez sieť. Predpokladajme, že počas spustenia aplikácie Java bude od vášho zavádzača tried požiadaná o načítanie triedy s názvom Sopka.

Jedným zo spôsobov, ako môžete napísať zavádzač triedy, je nechať ho najskôr požiadať pôvodného zavádzača tried, aby našiel a načítal triedu z jej dôveryhodného úložiska. V tomto prípade od Sopka nie je súčasťou Java API, predpokladajme, že prvotný zavádzač tried nemôže nájsť triedu s názvom Sopka. Keď prvotný triedny nakladač odpovie, že nemôže načítať triedu, váš triedny nakladač by sa potom mohol pokúsiť načítať Sopka triedy vlastným spôsobom stiahnutím cez sieť. Za predpokladu, že váš triedny zavádzač dokázal triedu stiahnuť Sopka, že Sopka trieda by potom mohla hrať rolu v budúcom priebehu vykonávania aplikácie.

Ak chcete pokračovať v rovnakom príklade, predpokladajte, že o nejaký čas neskôr bude použitá metóda vyučovania Sopka je vyvolaná po prvýkrát a že metóda odkazuje na triedu String z Java API. Pretože je to prvý raz, čo referenciu použije spustený program, virtuálny stroj sa spýta na načítanie vašej triedy (ten, ktorý sa načítal Sopka) načítať String. Rovnako ako predtým, váš triedny nakladač najskôr odošle požiadavku na prvotný triedny nakladač, ale v tomto prípade je prvotný nakladač triedy schopný vrátiť String triedy späť do vášho triedneho nakladača.

Nakladač prvotnej triedy sa pravdepodobne nemusel skutočne načítať String v tomto bode, pretože vzhľadom na to String je taká základná trieda v programoch Java, takmer určite sa predtým používala, a preto už bola načítaná. Nakladač prvotnej triedy s najväčšou pravdepodobnosťou práve vrátil String triedy, ktorú predtým načítal z dôveryhodného úložiska.

Pretože prvotný triedny zavádzač dokázal triedu nájsť, váš triedny zavádzač sa ju nepokúša stiahnuť cez sieť; iba odovzdá virtuálnemu stroju String trieda vrátená nakladačom pravekých tried. Od tohto bodu to virtuálny stroj používa String trieda kedykoľvek trieda Sopka odkazuje na triedu s názvom String.

Nakladače triedy v pieskovisku

V karanténe Java je architektúra zavádzača tried prvou líniou obrany proti škodlivému kódu. Je to nakoniec zavádzač tried, ktorý prináša kód do JVM - kód, ktorý by mohol byť nepriateľský.

Architektúra načítavača tried prispieva do karantény Javy dvoma spôsobmi:

  1. Chráni škodlivý kód pred zasahovaním do benevolentného kódu.
  2. Stráži hranice dôveryhodných triednych knižníc.

Architektúra načítavača tried chráni hranice dôveryhodných knižníc tried tak, že nedôveryhodné triedy nemôžu predstierať, že sú dôveryhodné. Ak by škodlivá trieda dokázala úspešne presvedčiť JVM, aby verila, že ide o dôveryhodnú triedu z rozhrania Java API, mohla by táto škodlivá trieda potenciálne preraziť bariéru karantény. Tým, že bráni nedôveryhodným triedam v vydávaní sa za dôveryhodné triedy, blokuje architektúra zavádzača tried jeden potenciálny prístup ku kompromitácii bezpečnosti prostredia runtime Java.

Mená a štíty

Architektúra zavádzača tried bráni škodlivému kódu v interferencii s benevolentným kódom, pretože poskytuje chránené priestory mien pre triedy načítané rôznymi zavádzačmi tried. Ako je spomenuté vyššie, menný priestor je sada jedinečných mien pre načítané triedy, ktoré udržuje JVM.

Menné priestory prispievajú k bezpečnosti, pretože medzi triedy načítané do rôznych menných priestorov môžete v skutočnosti umiestniť štít. Vo vnútri JVM môžu triedy v rovnakom priestore mien navzájom interagovať priamo. Triedy v rôznych priestoroch mien však nemôžu navzájom zistiť prítomnosť, pokiaľ výslovne neposkytnete mechanizmus, ktorý umožňuje triedam interagovať. Ak by škodlivá trieda po načítaní mala zaručený prístup ku všetkým ďalším triedam, ktoré sú momentálne načítané virtuálnym strojom, mohla by sa táto trieda dozvedieť veci, ktoré by nemala vedieť, alebo by to mohlo narušiť správne vykonanie vášho programu.

Vytváranie bezpečného prostredia

Keď píšete aplikáciu, ktorá používa zavádzače tried, vytvoríte prostredie, v ktorom beží dynamicky načítaný kód. Ak chcete, aby prostredie neobsahovalo medzery v zabezpečení, pri písaní aplikácií a zavádzačov tried musíte dodržiavať určité pravidlá. Vo všeobecnosti budete chcieť napísať svoju aplikáciu tak, aby bol škodlivý kód chránený pred benevolentným kódom. Budete tiež chcieť napísať zavádzače tried tak, aby chránili hranice dôveryhodných knižníc tried, napríklad hraníc rozhrania Java API.

Mená a zdroje kódu

Ak chcete získať bezpečnostné výhody, ktoré ponúkajú medzery na meno, musíte sa ubezpečiť, že načítate triedy z rôznych zdrojov cez rôzne zavádzače tried. Toto je vyššie popísaná schéma, ktorú používajú webové prehľadávače s podporou Java. Aplikácia Java vypálená webovým prehliadačom zvyčajne vytvorí pre každý zdroj tried, ktorý stiahne cez sieť, iný objekt načítania tried appletov. Prehliadač by napríklad použil jeden objekt zavádzača tried na stiahnutie tried z //www.niceapplets.com a iný objekt zavádzača tried na stiahnutie tried z //www.meanapplets.com.

Stráženie obmedzených balíkov

Java umožňuje triedam v tom istom balíku navzájom si udeľovať špeciálne prístupové privilégiá, ktoré sa neudeľujú triedam mimo balíka. Ak teda váš triedny nakladač dostane požiadavku na načítanie triedy, ktorá sa svojím menom drzo vyhlasuje za súčasť Java API (napríklad trieda s názvom java.lang.Virus), mal by váš triedny nakladač postupovať opatrne. Po načítaní by takáto trieda mohla získať špeciálny prístup k dôveryhodným triedam domény java.lang a mohol by tento špeciálny prístup použiť na podvodné účely.

V dôsledku toho by ste normálne napísali zavádzač tried tak, že jednoducho odmietne načítať všetky triedy, ktoré tvrdia, že sú súčasťou rozhrania Java API (alebo inej dôveryhodnej runtime knižnice), ale ktoré v miestnom dôveryhodnom úložisku neexistujú. Inými slovami, potom, čo načítač triedy pošle požiadavku načítaču prvotných tried a načítač prvotných tried naznačuje, že triedu nemôže načítať, mal by váš načítavač tried skontrolovať, či sa trieda nevyhlási za člena dôveryhodného balíka. Ak áno, mal by váš triedny zavádzač namiesto pokusu o stiahnutie triedy v sieti vyhodiť bezpečnostnú výnimku.

Stráženie zakázaných balíkov

Okrem toho ste možno do dôveryhodného úložiska nainštalovali niektoré balíky, ktoré obsahujú triedy, ktoré chcete, aby mohla vaša aplikácia načítať cez prvotný zavádzač tried, ale nechcete, aby boli prístupné triedam načítaným pomocou vášho zavádzača tried. Predpokladajme napríklad, že ste vytvorili balík s názvom absolútna sila a nainštaloval ho do miestneho úložiska prístupného nakladačom prvotných tried. Predpokladajme tiež, že nechcete, aby triedy načítané nakladačom tried mohli načítať ľubovoľnú triedu z priečinka absolútna sila balíček. V takom prípade by ste napísali svoj zavaděč tried tak, že úplne prvá vec, ktorú urobí, je zabezpečiť, aby sa požadovaná trieda nedeklarovala ako člen absolútna sila balíček. Ak je takáto trieda požadovaná, mal by váš zavádzač tried namiesto odovzdania názvu triedy primordiálnemu zavádzaču triedy vyhodiť bezpečnostnú výnimku.

Jediný spôsob, ako triedny nakladač môže vedieť, či je alebo nie je trieda z obmedzeného balíka, ako je napr java.lang, alebo zakázané balenie, ako napr absolútna sila, je menom triedy. Zavádzaču triedy teda musí byť pridelený zoznam mien obmedzených a zakázaných balíkov. Pretože názov triedy java.lang.Virus naznačuje, že je z java.lang balíček a java.lang je na zozname obmedzených balíkov, mal by váš triedny zavádzač vyhodiť bezpečnostnú výnimku, ak ho prvotný triedny nakladač nedokáže načítať. Rovnako tak, pretože názov triedy absolútna sila.FancyClassLoader označuje, že je súčasťou absolútna sila balíček a absolútna sila balík je na zozname zakázaných balíkov, váš triedny nakladač by mal vyhodiť bezpečnostnú výnimku.

Zavádzač triedy zameraný na bezpečnosť

Bežným spôsobom, ako napísať zavádzač triedy zameraný na zabezpečenie, je použitie nasledujúcich štyroch krokov:

  1. Ak existujú balíky, z ktorých tento zavádzač triedy nemôže načítať, zavádzač tried skontroluje, či sa požadovaná trieda nachádza v jednom zo zakázaných balíkov uvedených vyššie. Ak je to tak, znamená to bezpečnostnú výnimku. Ak nie, pokračuje krokom dva.

  2. Zavádzač triedy odovzdá požiadavku prvotnému zavádzaču triedy. Ak prvotný načítač triedy úspešne vráti triedu, načítač triedy vráti tú istú triedu. Inak pokračuje krokom tri.

  3. Ak existujú dôveryhodné balíky, do ktorých tento zavádzač triedy nemá povolené pridávať triedy, zavádzač tried skontroluje, či sa požadovaná trieda nachádza v jednom z týchto obmedzených balíkov. Ak je to tak, znamená to bezpečnostnú výnimku. Ak nie, pokračuje štvrtým krokom.

  4. Načítanie triedy sa nakoniec pokúsi načítať triedu vlastným spôsobom, napríklad stiahnutím cez sieť. Ak bude úspešný, vráti triedu. Ak je neúspešný, spôsobí chybu „Nenašla sa žiadna definícia triedy“.

Vykonaním krokov jedna a tri, ako je uvedené vyššie, zavádzač triedy stráži hranice dôveryhodných balíkov. V prvom kroku zabráni tomu, aby sa trieda zo zakázaného balíka vôbec načítala. V treťom kroku to neumožňuje nedôveryhodnej triede vložiť sa do dôveryhodného balíka.

Záver

Architektúra nakladača tried prispieva k bezpečnostnému modelu JVM dvoma spôsobmi:

  1. rozdelením kódu do viacerých menných priestorov a umiestnením „štítu“ medzi kód do rôznych menných priestorov
  2. strážením hraníc dôveryhodných knižníc tried, napríklad rozhrania Java API

Obe tieto schopnosti architektúry načítavačov triedy Java musia programátori správne používať, aby mohli využiť výhody, ktoré ponúkajú. Aby ste využili výhodu štítu menného priestoru, kód z rôznych zdrojov by sa mal načítať cez rôzne objekty zavádzača tried. Aby ste mohli využiť výhody dôveryhodného stráženia hraníc balíkov, musia byť napísané nakladače tried, aby skontrolovali názvy požadovaných tried so zoznamom obmedzených a zakázaných balíkov.

Informácie o postupe písania zavádzača tried vrátane ukážkového kódu nájdete v príručke Chucka McManisa JavaWorld článok „Základné informácie o zavádzačoch triedy Java“.

Ďalší mesiac

V článku budúcom mesiaci budem pokračovať v diskusii o bezpečnostnom modeli JVM popisom overovateľa triedy.

Bill Venners píše softvér profesionálne už 12 rokov. So sídlom v Silicon Valley poskytuje softvérové ​​poradenstvo a školiace služby pod menom Artima Software Company. V priebehu rokov vyvíjal softvér pre spotrebnú elektroniku, vzdelávanie, polovodiče a životné poistenie. Programoval v mnohých jazykoch na mnohých platformách: montážny jazyk na rôznych mikroprocesoroch, C na Unixe, C ++ na Windows, Java na webe. Je autorom knihy: Inside the Java Virtual Machine, ktorú vydalo vydavateľstvo McGraw-Hill.

Získajte viac informácií o tejto téme

  • Kniha Špecifikácia virtuálneho stroja Java (//www.aw.com/cp/lindholm-yellin.html), autormi Tim Lindholm a Frank Yellin (ISBN 0-201-63452-X), súčasť série Java Series (//www.aw.com/cp /javaseries.html), z Addison-Wesley, je definitívnym odkazom na virtuálny stroj Java.
  • Bezpečné výpočty pomocou JavaNow a budúcnosti (biela kniha) // www.javasoft.com/marketing/collateral/security.html
  • Časté otázky o zabezpečení appletu

    //www.javasoft.com/sfaq/

  • Nízka úroveň zabezpečenia v Jave, autor Frank Yellin //www.javasoft.com/sfaq/verifier.html
  • Domovská stránka zabezpečenia Java

    //www.javasoft.com/security/

  • Navštívte domovskú stránku nepriateľských appletov

    //www.math.gatech.edu/~mladue/HostileApplets.html

  • Kniha Zabezpečenie Java: nepriateľské applety, diery a protilátky, Gary McGraw a Ed Felton, poskytujú dôkladnú analýzu bezpečnostných problémov okolo Javy. //www.rstcorp.com/java-security.html
  • Predchádzajúce články „Pod kapotou“:
  • Virtuálny stroj Lean, Mean - predstavuje úvod do virtuálneho stroja Java.
  • Životný štýl súboru triedy Java - Poskytuje prehľad súboru triedy Java, formátu súboru, do ktorého sú kompilované všetky programy Java.
  • Hromada zhromaždená v prostredí Java - Poskytuje prehľad o zhromažďovaní odpadu vo všeobecnosti a konkrétne o hromade odpadkov virtuálneho stroja Java.
  • Základy Bytecode - predstavuje bajtkódy virtuálneho stroja Java a pojednáva najmä o primitívnych typoch, konverzných operáciách a operáciách zásobníka.
  • Aritmetika s pohyblivou rádovou čiarkou - Opisuje podporu pohyblivej rádovej čiarky virtuálneho stroja Java a bajtové kódy, ktoré vykonávajú operácie s pohyblivou rádovou čiarkou.
  • Logika a aritmetika - Opisuje podporu virtuálneho stroja Java pre logickú a celočíselnú aritmetiku a súvisiace bajtkódy.
  • Objekty a polia - Opisuje, ako virtuálny stroj Java pracuje s objektmi a poľami, a popisuje príslušné bajtkódy.
  • Výnimky - Opisuje, ako sa virtuálny stroj Java vyrovná s výnimkami, a popisuje príslušné bajtkódy.
  • Try-Finally - Popisuje, ako virtuálny stroj Java implementuje klauzuly try-konečne, a popisuje príslušné bajtkódy.
  • Riadiaci tok - Opisuje, ako virtuálny stroj Java implementuje riadiaci tok, a popisuje príslušné bajtkódy.
  • Architektúra agletov - Opisuje vnútorné fungovanie agletov, autonómnej technológie softvérového agenta IBM založenej na prostredí Java.
  • Bod agletov - Analyzuje skutočnú užitočnosť mobilných agentov, ako sú aglety, technológia autonómneho softvérového agenta IBM založeného na prostredí Java.
  • Vyvolanie a vrátenie metódy - Opisuje štyri spôsoby, ako virtuálny stroj Java vyvoláva metódy, vrátane príslušných bajtových kódov.
  • Synchronizácia vlákien - Ukazuje, ako funguje synchronizácia vlákien vo virtuálnom stroji Java. Diskutuje o bytových kódoch pre vstup a výstup z monitorov.
  • Java's Architecture Architecture - Poskytuje prehľad bezpečnostného modelu zabudovaného do JVM a zameriava sa na integrované bezpečnostné prvky JVM.

Tento príbeh, „Zabezpečenie a architektúra načítavača tried“, bol pôvodne publikovaný spoločnosťou JavaWorld.

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