Bezpečnostní problémy v generování reflexe

Rozhraní .NET Framework poskytuje tři způsoby generování společného zprostředkujícího jazyka (CIL) s vlastními problémy se zabezpečením:

Bez ohledu na způsob generování dynamického kódu vyžaduje spuštění vygenerovaného kódu všechna oprávnění vyžadovaná typy a metodami, které vygenerovaný kód používá.

Poznámka:

Oprávnění požadovaná pro vyjádření kódu a generování kódu se změnila s úspěšnými verzemi rozhraní .NET Framework. Viz informace o verzi dále v tomto článku.

Dynamická sestavení

Dynamická sestavení jsou vytvořena pomocí přetížení AppDomain.DefineDynamicAssembly metody. Většina přetížení této metody je v rozhraní .NET Framework 4 zastaralá, protože eliminují zásady zabezpečení na úrovni počítače. Zbývající přetížení lze provést libovolným kódem bez ohledu na úroveň důvěryhodnosti. Tato přetížení spadají do dvou skupin: ty, které určují seznam atributů, které mají být aplikovány na dynamické sestavení při jeho vytvoření, a těch, které ne. Pokud pro sestavení nezadáte model průhlednosti, použijete SecurityRulesAttribute atribut při jeho vytvoření, model průhlednosti se zdědí z vygenerujícího sestavení.

Poznámka:

Atributy, které použijete na dynamické sestavení po jeho vytvoření pomocí SetCustomAttribute metody, se neprojeví, dokud se sestavení neuloží na disk a znovu načte do paměti.

Kód v dynamickém sestavení má přístup k viditelným typům a členům v jiných sestaveních.

Poznámka:

Dynamická sestavení nepoužívají ReflectionPermissionFlag.MemberAccess a ReflectionPermissionFlag.RestrictedMemberAccess příznaky, které umožňují dynamickým metodám přístup k nepublikickým typům a členům.

Přechodná dynamická sestavení se vytvářejí v paměti a nikdy se neukládají na disk, takže nevyžadují žádná přístupová oprávnění k souborům. Uložení dynamického sestavení na disk vyžaduje FileIOPermission odpovídající příznaky.

Generování dynamických sestavení z částečně důvěryhodného kódu

Vezměte v úvahu podmínky, ve kterých sestavení s oprávněními k internetu může vygenerovat přechodné dynamické sestavení a spustit jeho kód:

  • Dynamické sestavení používá pouze veřejné typy a členy jiných sestavení.

  • Oprávnění vyžádaná těmito typy a členy jsou zahrnuta do sady udělení částečně důvěryhodného sestavení.

  • Sestavení se neuloží na disk.

  • Symboly ladění se negenerují. (Internet a LocalIntranet sady oprávnění nezahrnují potřebná oprávnění.)

Dynamická metoda hostovaná anonymně

Anonymně hostované dynamické metody jsou vytvořeny pomocí dvou DynamicMethod konstruktorů, které nezadávají přidružený typ nebo modul, DynamicMethod(String, Type, Type[]) a DynamicMethod(String, Type, Type[], Boolean). Tyto konstruktory umístí dynamické metody do plně důvěryhodného a plně důvěryhodného sestavení transparentního zabezpečení. K použití těchto konstruktorů nebo generování kódu pro dynamické metody nejsou nutná žádná oprávnění.

Místo toho se při vytvoření anonymně hostované dynamické metody zachytí zásobník volání. Při vytváření metody jsou požadavky na zabezpečení vůči zachycené zásobníku volání provedeny.

Poznámka:

Koncepčně se požadavky provádějí během vytváření metody. To znamená, že požadavky mohou být provedeny při každém vygenerování instrukce CIL. V aktuální implementaci jsou všechny požadavky provedeny při DynamicMethod.CreateDelegate volání metody nebo při vyvolání kompilátoru JIT (just-in-time), pokud je metoda vyvolána bez volání CreateDelegate.

Pokud to doména aplikace umožňuje, mohou anonymní hostované dynamické metody přeskočit kontroly viditelnosti JIT, s výhradou následujícího omezení: Neveřejné typy a členy, ke kterým přistupuje anonymní dynamická metoda, musí být v sestaveních, jejichž sady grantů jsou stejné nebo podmnožiny, udělovací sada zásobníku volání emitujícího. Tato omezená možnost přeskočit kontroly viditelnosti JIT je povolena, pokud doména aplikace udělí ReflectionPermissionReflectionPermissionFlag.RestrictedMemberAccess příznak.

  • Pokud vaše metoda používá pouze veřejné typy a členy, během sestavování nejsou vyžadována žádná oprávnění.

  • Pokud určíte, že by se měly přeskočit kontroly viditelnosti JIT, požadavek, který se provede při vytvoření metody, zahrnuje příznak ReflectionPermissionReflectionPermissionFlag.RestrictedMemberAccess a sadu grantů sestavení, která obsahuje nepublikovaný člen, ke kterému se přistupuje.

Vzhledem k tomu, že je brána v úvahu sada grantů nepublikového člena, nelze částečně důvěryhodný kód, který byl udělen ReflectionPermissionFlag.RestrictedMemberAccess , zvýšit svá oprávnění spuštěním nepublikovaných členů důvěryhodných sestavení.

Stejně jako u jakéhokoli jiného vygenerovaného kódu vyžaduje spuštění dynamické metody jakákoli oprávnění, která používají metody, které dynamická metoda používá.

Systémové sestavení, které je hostitelem anonymně hostovaných dynamických metod, používá SecurityRuleSet.Level1 model transparentnosti, což je model transparentnosti, který byl použit v rozhraní .NET Framework před rozhraním .NET Framework 4.

Další informace najdete v předmětu DynamicMethod .

Generování dynamicky hostovaných dynamických metod z částečně důvěryhodného kódu

Vezměte v úvahu podmínky, ve kterých sestavení s oprávněními k internetu může vygenerovat anonymně hostovanou dynamickou metodu a spustit ji:

  • Dynamická metoda používá pouze veřejné typy a členy. Pokud sada grantů obsahuje ReflectionPermissionFlag.RestrictedMemberAccess, může používat nepublikované typy a členy libovolného sestavení, jehož sada grantů je rovna nebo podmnožině, sada grantů emitujícího sestavení.

  • Oprávnění vyžadovaná všemi typy a členy používanými dynamickou metodou jsou zahrnuta do sady udělení částečně důvěryhodného sestavení.

Poznámka:

Dynamické metody nepodporují symboly ladění.

Dynamické metody přidružené k existujícím sestavením

Chcete-li přidružit dynamickou metodu k typu nebo modulu v existujícím sestavení, použijte kterýkoli z DynamicMethod konstruktorů, které určují přidružený typ nebo modul. Oprávnění potřebná k volání těchto konstruktorů se liší, protože přidružení dynamické metody k existujícímu typu nebo modulu dává dynamické metodě přístup k nepublikovým typům a členům:

  • Dynamická metoda přidružená k typu má přístup ke všem členům tohoto typu, i soukromým členům, a ke všem interním typům a členům v sestavení, které obsahuje přidružený typ.

  • Dynamická metoda přidružená k modulu má přístup ke všem internal typům a členům (Friend v jazyce Visual Basic, assembly v metadatech modulu clr language runtime) v modulu.

Kromě toho můžete použít konstruktor, který určuje možnost přeskočit kontroly viditelnosti kompilátoru JIT. Tím získáte dynamický přístup ke všem typům a členům ve všech sestaveních bez ohledu na úroveň přístupu.

Oprávnění, která konstruktor požaduje, závisí na tom, kolik přístupu se rozhodnete poskytnout dynamickou metodu:

I když jsou položky v tomto seznamu popsány z hlediska sady grantů vygenerujícího sestavení, nezapomeňte, že požadavky jsou provedeny proti úplnému zásobníku volání, včetně hranice domény aplikace.

Další informace najdete v předmětu DynamicMethod .

Generování dynamických metod z částečně důvěryhodného kódu

Poznámka:

Doporučeným způsobem generování dynamických metod z částečně důvěryhodného kódu je použití anonymních hostovaných dynamických metod.

Vezměte v úvahu podmínky, ve kterých sestavení s oprávněními k internetu může vygenerovat dynamickou metodu a spustit ji:

  • Dynamická metoda je přidružena k modulu nebo typu, který ho generuje, nebo jeho sada grantů zahrnuje ReflectionPermissionFlag.RestrictedMemberAccess a je přidružena k modulu v sestavení, jehož grantová sada je rovna, nebo podmnožinu grant sady emitujícího sestavení.

  • Dynamická metoda používá pouze veřejné typy a členy. Pokud sada grantů zahrnuje ReflectionPermissionFlag.RestrictedMemberAccess modul v sestavení, jehož sada grantů je rovna nebo podmnožině, může v přidruženém modulu používat typy a členy označené internal (Friend v jazyce Visual Basic assembly , v metadatech modulu COMMON Language Runtime).

  • Oprávnění používaná všemi typy a členy používanými dynamickou metodou jsou zahrnuta do sady udělení částečně důvěryhodného sestavení.

  • Dynamická metoda nepřeskočí kontroly viditelnosti JIT.

Poznámka:

Dynamické metody nepodporují symboly ladění.

Informace o verzi

Počínaje rozhraním .NET Framework 4 se zásady zabezpečení na celém počítači eliminují a transparentnost zabezpečení se stane výchozím mechanismem vynucení.

Počínaje rozhraním .NET Framework 2.0 Service Pack 1 ReflectionPermissionReflectionPermissionFlag.ReflectionEmit už není při generování dynamických sestavení a dynamických metod vyžadován příznak. Tento příznak je vyžadován ve všech starších verzích rozhraní .NET Framework.

Poznámka:

ReflectionPermissionReflectionPermissionFlag.ReflectionEmit příznakem je ve výchozím nastavení FullTrust součástí sad LocalIntranet pojmenovaných oprávnění, ale ne v Internet sadě oprávnění. Proto v dřívějších verzích rozhraní .NET Framework lze knihovnu použít s oprávněními k internetu pouze v případě, že spustí pro AssertReflectionEmit. Tyto knihovny vyžadují pečlivou kontrolu zabezpečení, protože chyby kódování by mohly vést k chybám zabezpečení. Rozhraní .NET Framework 2.0 SP1 umožňuje vygenerovat kód ve scénářích částečné důvěryhodnosti bez vystavení jakýchkoli požadavků na zabezpečení, protože generování kódu není ze své podstaty privilegovanou operací. To znamená, že vygenerovaný kód nemá více oprávnění než sestavení, které ho generuje. To umožňuje knihovnám, které generují kód, aby byly transparentní a odstraňují potřebu uplatnit ReflectionEmit, což zjednodušuje úlohu zápisu zabezpečené knihovny.

Rozhraní .NET Framework 2.0 SP1 navíc zavádí ReflectionPermissionFlag.RestrictedMemberAccess příznak pro přístup k nepublikovaných typech a členům z částečně důvěryhodných dynamických metod. Starší verze rozhraní .NET Framework vyžadují ReflectionPermissionFlag.MemberAccess příznak pro dynamické metody, které přistupují k nepublikovým typům a členům. Toto je oprávnění, které by nikdy nemělo být uděleno částečně důvěryhodnému kódu.

Rozhraní .NET Framework 2.0 SP1 zavádí anonymně hostované metody.

Získání informací o typech a členech

Počínaje rozhraním .NET Framework 2.0 nejsou nutná žádná oprávnění k získání informací o nepublikovaných typech a členech. Reflexe ion slouží k získání informací potřebných k generování dynamických metod. Například MethodInfo objekty se používají k generování volání metody. Starší verze rozhraní .NET Framework vyžadují ReflectionPermission příznak ReflectionPermissionFlag.TypeInformation . Další informace najdete v tématu Důležité informace o zabezpečení pro Reflexe ion.

Viz také