Biztonsági problémák a tükröződés kibocsátásában

A .NET-keretrendszer három módszert kínál a közös köztes nyelv (CIL) kiadására, amelyek mindegyike saját biztonsági problémákkal rendelkezik:

A dinamikus kód létrehozásának módjától függetlenül a generált kód végrehajtásához minden olyan engedély szükséges, amelyet a generált kód által használt típusok és módszerek igényelnek.

Megjegyzés:

A kódtükrözéshez és a kódkibocsátáshoz szükséges engedélyek a .NET-keretrendszer következő kiadásaival változtak meg. Lásd a cikk későbbi, verzióinformációi című szakaszát.

Dinamikus összeállítások

A dinamikus szerelvények a AppDomain.DefineDynamicAssembly metódus túlterheléseinek használatával jönnek létre. Ennek a módszernek a legtöbb túlterhelése elavult a .NET-keretrendszer 4-ben a gépszintű biztonsági szabályzat megszüntetése miatt. A fennmaradó túlterhelések bármely kóddal végrehajthatók, függetlenül a megbízhatósági szinttől. Ezek a túlterhelések két csoportba sorolhatók: azok, amelyek meghatározzák a dinamikus összeállításra alkalmazandó attribútumok listáját a létrehozásukkor, és azok, amelyek nem. Ha nem adja meg a szerelvény áttetszőségi modelljét, az SecurityRulesAttribute attribútum létrehozásakor az áttetszőségi modell öröklődik a kibocsátó szerelvénytől.

Megjegyzés:

A dinamikus szerelvényre a létrehozás után alkalmazott attribútumok a SetCustomAttribute metódus használatával csak akkor lépnek érvénybe, ha a szerelvényt lemezre menti, és újra betölti a memóriába.

A dinamikus szerelvény kódja hozzáférhet más szerelvények látható típusaihoz és tagjaihoz.

Megjegyzés:

A dinamikus szerelvények nem használják azokat a ReflectionPermissionFlag.MemberAccess jelzőket és ReflectionPermissionFlag.RestrictedMemberAccess jelzőket, amelyek lehetővé teszik, hogy a dinamikus metódusok hozzáférjenek a nem nyilvános típusokhoz és tagokhoz.

Az átmeneti dinamikus szerelvények a memóriában jönnek létre, és soha nem kerülnek lemezre, ezért nem igényelnek fájlhozzáférés-engedélyeket. A dinamikus szerelvény lemezre való mentéséhez szükséges a megfelelő jelölők használata FileIOPermission-val.

Dinamikus szerelvények létrehozása részben megbízható kódból

Vegye figyelembe azokat a feltételeket, amelyek esetén egy internetes engedélyekkel rendelkező szerelvény átmeneti dinamikus szerelvényt hozhat létre, és végrehajthatja annak kódját:

  • A dinamikus összeállítás csak más összeállítások nyilvános típusait és tagjait használja.

  • Az ilyen típusok és tagok által igényelt engedélyek a részben megbízható assembly engedélyhalmazába tartoznak.

  • A szerelvény nincs mentve a lemezre.

  • A hibakeresési szimbólumok nem jönnek létre. (Internet és LocalIntranet az engedélykészletek nem tartalmazzák a szükséges engedélyeket.)

Névtelenül üzemeltetett dinamikus metódusok

A névtelenül üzemeltetett dinamikus metódusok a két DynamicMethod konstruktor használatával jönnek létre, amelyek nem adnak meg társított típust vagy modult, DynamicMethod(String, Type, Type[]) és DynamicMethod(String, Type, Type[], Boolean). Ezek a konstruktorok a dinamikus metódusokat egy rendszer által biztosított, teljes mértékben megbízható, biztonsági transzparens szerelvényben helyezik el. A konstruktorok használatához és a dinamikus metódusok kódjának kibocsátásához nincs szükség engedélyekre.

Ehelyett egy névtelenül üzemeltetett dinamikus metódus létrehozásakor a rendszer rögzíti a hívásvermet. A metódus létrehozásakor a rendszer biztonsági követelményeket támaszt a rögzített hívásveremen.

Megjegyzés:

Elméletileg a módszer felépítése során igények merülnek fel. Ez azt jelenti, hogy lehetnek igények az egyes CIL-utasítások kibocsátásakor. A jelenlegi implementációban minden követelmény teljesül, amikor a DynamicMethod.CreateDelegate metódust meghívják, vagy amikor az igény szerinti (JIT) fordító kerül meghívásra, amennyiben a metódust a CreateDelegate meghívása nélkül hívják meg.

Ha az alkalmazástartomány engedélyezi, a névtelenül üzemeltetett dinamikus metódusok kihagyhatják a JIT láthatósági ellenőrzését, a következő korlátozásra is figyelemmel: A névtelenül üzemeltetett dinamikus metódus által elért nem nyilvános típusok és tagok olyan szerelvényekben kell lenniük, amelyek támogatási készletei megegyeznek a kibocsátó hívásverem engedélyezési készletével vagy részhalmazával. Korlátozottan elérhető a JIT láthatósági ellenőrzések kihagyása, ha az alkalmazás-tartomány engedélyezi ReflectionPermission a ReflectionPermissionFlag.RestrictedMemberAccess jelzővel.

  • Ha a metódus csak nyilvános típusokat és tagokat használ, az építés során nincs szükség engedélyekre.

  • Ha azt határozza meg, hogy a JIT láthatósági ellenőrzését ki kell hagyni, a metódus létrehozásakor fennálló igény magában foglalja a ReflectionPermission elemet a ReflectionPermissionFlag.RestrictedMemberAccess jelzővel, valamint az engedélyezési készletet, amely tartalmazza a hozzáférés alatt álló nem nyilvános tagot tartalmazó szerelvényt.

Mivel figyelembe veszik a nem nyilvános tag engedélyezési halmazát, a részlegesen megbízhatónak ítélt ReflectionPermissionFlag.RestrictedMemberAccess kód, amely megkapta az engedélyt, nem növelheti jogosultságait a megbízható összeállítások nem nyilvános tagjainak futtatásával.

Mint minden más kibocsátott kód esetében, a dinamikus metódus végrehajtásához is szükség van a dinamikus metódus által használt metódusok által igényelt engedélyekre.

A névtelenül üzemeltetett dinamikus metódusokat futtató rendszerszerelvény az SecurityRuleSet.Level1 átláthatósági modellt használja, amely a .NET-keretrendszerben a .NET-keretrendszer 4. előtti átláthatósági modellje.

További információ: DynamicMethod osztály.

Névtelenül üzemeltetett dinamikus metódusok létrehozása részben megbízható kódból

Vegye figyelembe azokat a feltételeket, amelyek esetén egy internetes engedélyekkel rendelkező szerelvény létrehozhat egy névtelenül üzemeltetett dinamikus metódust, és végrehajthatja azt:

  • A dinamikus módszer csak nyilvános típusokat és tagokat használ. Ha a támogatási csoport tartalmazza ReflectionPermissionFlag.RestrictedMemberAccess, akkor bármely olyan szerelvény nem nyilvános típusait és tagjait használhatja, amelyek támogatási készlete megegyezik a kibocsátó szerelvény támogatási készletével vagy annak egy részhalmazával.

  • A dinamikus módszer által használt összes típushoz és taghoz szükséges engedélyeket a részben megbízható szerelvény engedélyezési készlete tartalmazza.

Megjegyzés:

A dinamikus metódusok nem támogatják a hibakeresési szimbólumokat.

Meglévő szerelvényekhez társított dinamikus metódusok

Ha egy dinamikus metódust egy meglévő szerelvény egy típusához vagy modulhoz szeretne társítani, használja a DynamicMethod társított típust vagy modult meghatározó konstruktorokat. A konstruktorok meghívásához szükséges engedélyek eltérőek, mivel egy dinamikus metódus meglévő típussal vagy modullal való társítása hozzáférést biztosít a dinamikus metódusnak a nem nyilvános típusok és tagok számára:

  • Egy típushoz társított dinamikus metódus hozzáféréssel rendelkezik az adott típusú összes taghoz, még a privát tagokhoz is, valamint a társított típust tartalmazó szerelvény összes belső típusához és tagához.

  • A modulhoz társított dinamikus metódusok a modul összes internal típusához és tagjához hozzáférnek (Friend a Visual Basicben, assembly a közös nyelvi futtatókörnyezeti metaadatokban).

Emellett használhat egy olyan konstruktort is, amely lehetővé teszi a JIT-fordító láthatósági ellenőrzésének kihagyását. Ezzel a dinamikus metódus minden szerelvénytípushoz és taghoz hozzáférést biztosít a hozzáférési szinttől függetlenül.

A konstruktor által igényelt engedélyek attól függenek, hogy mennyi hozzáférést szeretne adni a dinamikus módszernek:

Bár a listában szereplő elemeket a kibocsátó szerelvény támogatási halmazában írják le, ne feledje, hogy a követelmények a teljes hívásveremhez kapcsolódnak, beleértve az alkalmazás tartományhatárát is.

További információ: DynamicMethod osztály.

Dinamikus metódusok létrehozása részben megbízható kódból

Megjegyzés:

A dinamikus metódusok részben megbízható kódból történő generálásának ajánlott módja a névtelenül üzemeltetett dinamikus metódusok használata.

Vegye figyelembe azokat a feltételeket, amelyek esetén egy internetes engedélyekkel rendelkező szerelvény dinamikus metódust hozhat létre és hajthat végre:

  • A dinamikus módszer vagy a kibocsátó modulhoz vagy típushoz van társítva, vagy a támogatási készlet tartalmazza ReflectionPermissionFlag.RestrictedMemberAccess , és egy olyan szerelvény egy moduljához van társítva, amelynek a támogatási készlete megegyezik a kibocsátó szerelvény támogatási készletével, vagy annak egy részhalmazával.

  • A dinamikus módszer csak nyilvános típusokat és tagokat használ. Ha a támogatási készlet tartalmazzaReflectionPermissionFlag.RestrictedMemberAccess, és egy olyan szerelvény egy moduljához van társítva, amelynek a támogatási készlete megegyezik a kibocsátó szerelvény támogatási készletével, használhatja a társított modulban (internala Visual Basicben, Friend a közös nyelvi futtatókörnyezeti metaadatokban) megjelölt assembly típusokat és tagokat.

  • A dinamikus módszer által használt összes típus és tag által igényelt engedélyek a részben megbízható assembly engedélyezési halmazába beletartoznak.

  • A dinamikus módszer nem hagyja ki a JIT láthatósági ellenőrzését.

Megjegyzés:

A dinamikus metódusok nem támogatják a hibakeresési szimbólumokat.

Verzióadatok

A .NET-keretrendszer 4-től kezdve a gépszintű biztonsági szabályzat megszűnik, és a biztonsági átláthatóság lesz az alapértelmezett kényszerítési mechanizmus.

A .NET Framework 2.0 Service Pack 1 ReflectionPermission csomagtól kezdve a ReflectionPermissionFlag.ReflectionEmit jelölő már nem szükséges dinamikus szerelvények és dinamikus metódusok kibocsátásakor. Ez a jelző a .NET-keretrendszer összes korábbi verziójában kötelező.

Megjegyzés:

ReflectionPermissiona ReflectionPermissionFlag.ReflectionEmit jelölő alapértelmezés szerint szerepel az FullTrust és LocalIntranet elnevezett engedélykészletekben, de az Internet engedélykészletben nem. Ezért a .NET-keretrendszer korábbi verzióiban a kódtár csak akkor használható internetes engedélyekkel, ha végrehajtja Assert a következőt ReflectionEmit: . Az ilyen kódtárak gondos biztonsági felülvizsgálatot igényelnek, mert a kódolási hibák biztonsági réseket okozhatnak. A .NET Framework 2.0 SP1 lehetővé teszi a kód kiadását részleges megbízhatósági forgatókönyvekben anélkül, hogy biztonsági igényeket támasztanak, mivel a kód létrehozása nem eredendően kiemelt művelet. Vagyis a létrehozott kódnak nincs több engedélye, mint az azt kibocsátó szerelvénynek. Ez lehetővé teszi a kódokat kibocsátó könyvtárak számára, hogy biztonsági szempontból átláthatók legyenek, és feleslegessé teszik az ReflectionEmit igénylését, ami egyszerűsíti a biztonságos könyvtárak megírásának feladatát.

A .NET Framework 2.0 SP1 emellett bevezeti a ReflectionPermissionFlag.RestrictedMemberAccess nem nyilvános típusok és tagok részlegesen megbízható dinamikus metódusokból való elérésére szolgáló jelzőt. A .NET-keretrendszer korábbi verziói megkövetelik a ReflectionPermissionFlag.MemberAccess nem nyilvános típusokhoz és tagokhoz hozzáférő dinamikus metódusok jelölőjének használatát. Ez egy olyan engedély, amelyet soha nem szabad részlegesen megbízható kódhoz adni.

Végül a .NET Framework 2.0 SP1 névtelenül üzemeltetett metódusokat vezet be.

A típusok és tagok adatainak beszerzése

A .NET-keretrendszer 2.0-tól kezdve nincs szükség engedélyekre a nem nyilvános típusok és tagok adatainak beszerzéséhez. A reflexió a dinamikus metódusok kibocsátásához szükséges információk beszerzésére szolgál. Az objektumok például MethodInfo metódushívások kibocsátására szolgálnak. A .NET-keretrendszer korábbi verzióihoz a ReflectionPermissionReflectionPermissionFlag.TypeInformation jelölő szükséges. További információ: A tükröződés biztonsági szempontjai.

Lásd még