Sdílet prostřednictvím


Bezpečnostní problémy v Reflection Emit

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 reflexi kódu a emisi kódu se změnila s následný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í metody AppDomain.DefineDynamicAssembly. Většina přetížení této metody je v rozhraní .NET Framework 4 zastaralá kvůli eliminaci zásad 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 při vytváření sestavení nezadáte model průhlednosti aplikováním atributu SecurityRulesAttribute, 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 s odpovídajícími parametry.

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í sestavení s částečnou důvěrou.

  • 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 sestavení poskytovaného systémem, které je plně důvěryhodné a zabezpečení transparentní. 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 kladeny požadavky na zabezpečení vůči zásobníku volání, který byl zachycen.

Poznámka:

Požadavky se kladou koncepčně během konstrukce 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 akceptovány při volání metody DynamicMethod.CreateDelegate nebo při spuštění kompilátoru JIT (just-in-time), v případě že je metoda spuštěna bez volání CreateDelegate.

Pokud to doména aplikace umožňuje, mohou anonymně hostované dynamické metody přeskočit kontroly viditelnosti v rámci JIT, s výhradou následujícího omezení: Neveřejné typy a členy, ke kterým přistupují anonymně hostované dynamické metody, musí být v sestaveních, jejichž sady oprávnění jsou stejné nebo jde o podmnožiny sady oprávnění 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í příznak ReflectionPermission s ReflectionPermissionFlag.RestrictedMemberAccess.

  • 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 jsou brána v úvahu přidělená oprávnění neveřejného člena, částečně důvěryhodný kód, který má přidělené ReflectionPermissionFlag.RestrictedMemberAccess, nemůže zvýšit svá oprávnění spuštěním neveřejný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 ve třídě DynamicMethod.

Generování anonymně 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 neveřejné typy a členy libovolného sestavení, jehož sada grantů je rovna nebo podmnožinou sady grantů emitujícího sestavení.

  • Oprávnění vyžadovaná všemi typy a členy použitými dynamickou metodou jsou zahrnuta do sady oprávnění čá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 ve společném běhovém prostředí CLR) 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, jaký přístup se rozhodnete poskytnout dynamické metodě.

I když jsou položky v tomto seznamu popsány z hlediska sady oprávnění sestavení, které emituje, nezapomeňte, že požadavky jsou uplatňovány na celý zásobník volání, včetně hranice domény aplikace.

Další informace najdete ve třídě 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 jeho sada grantů zahrnuje ReflectionPermissionFlag.RestrictedMemberAccess a je spojeno s modulem v sestavení, jehož sada grantů je rovna nebo podmnožinou sady grantů vydávajícího sestavení, může v přidruženém modulu používat typy a členy označené internal (Friend v jazyce Visual Basic, assembly v metadatech Common Language Runtime).

  • Oprávnění požadovaná všemi typy a členy používané dynamickou metodou jsou zahrnuta do sady oprávnění čá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 již příznak ReflectionPermission s ReflectionPermissionFlag.ReflectionEmit při generování dynamických sestavení a dynamických metod není vyžadován. Tento příznak je vyžadován ve všech starších verzích rozhraní .NET Framework.

Poznámka:

ReflectionPermission s příznakem ReflectionPermissionFlag.ReflectionEmit je ve výchozím nastavení součástí oprávnění pojmenovaných sad FullTrust a LocalIntranet, ale ne v sadě oprávnění Internet. Proto lze v dřívějších verzích rozhraní .NET Framework použít knihovnu s oprávněními pro internet pouze tehdy, pokud spustí Assert pro ReflectionEmit. 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 neveřejným typům 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 se používá 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 s příznakem ReflectionPermissionFlag.TypeInformation. Další informace naleznete v tématu Bezpečnostní úvahy o reflexi.

Viz také