Udostępnij przez


Problemy z zabezpieczeniami w emisji odbicia

Program .NET Framework udostępnia trzy sposoby emitowania wspólnego języka pośredniego (CIL), z których każdy ma własne problemy z zabezpieczeniami:

Niezależnie od sposobu generowania kodu dynamicznego wykonywanie wygenerowanego kodu wymaga wszystkich uprawnień wymaganych przez typy i metody, których używa wygenerowany kod.

Uwaga / Notatka

Uprawnienia wymagane do refleksji kodu i generowania kodu uległy zmianie wraz z kolejnymi wersjami programu .NET Framework. Zobacz Informacje o wersji w dalszej części tego artykułu.

Zestawy dynamiczne

Zestawy dynamiczne są tworzone przy użyciu przeciążenia metody AppDomain.DefineDynamicAssembly. Większość przeciążeń tej metody jest przestarzała w programie .NET Framework 4 ze względu na eliminację zasad zabezpieczeń dla całej maszyny. Pozostałe przeciążenia mogą być wykonywane przez dowolny kod, niezależnie od poziomu zaufania. Te przeciążenia dzielą się na dwie grupy: te, które określają listę atrybutów, które mają być stosowane do zestawu dynamicznego podczas jego tworzenia, i tych, które nie. Jeśli nie określisz modelu przezroczystości dla zestawu, stosując SecurityRulesAttribute atrybut podczas jego tworzenia, model przezroczystości jest dziedziczony z emitowanego zestawu.

Uwaga / Notatka

Atrybuty stosowane do zestawu dynamicznego po jego utworzeniu przy użyciu SetCustomAttribute metody nie obowiązują, dopóki zestaw nie zostanie zapisany na dysku i ponownie załadowany do pamięci.

Kod w zestawie dynamicznym może uzyskiwać dostęp do widocznych typów i elementów członkowskich w innych zestawach.

Uwaga / Notatka

Zestawy dynamiczne nie używają flag ReflectionPermissionFlag.MemberAccess i ReflectionPermissionFlag.RestrictedMemberAccess, które umożliwiają dynamicznym metodom uzyskać dostęp do typów niepublicznych i członków.

Przejściowe zestawy dynamiczne są tworzone w pamięci i nigdy nie są zapisywane na dysku, dlatego nie wymagają uprawnień dostępu do plików. Zapisanie zestawu dynamicznego na dysku wymaga użycia FileIOPermission odpowiednich flag.

Generowanie zestawów dynamicznych na podstawie częściowo zaufanego kodu

Rozważ warunki, w których zestaw z uprawnieniami do Internetu może wygenerować przejściowy zestaw dynamiczny i wykonać jego kod:

  • Zestaw dynamiczny używa tylko typów publicznych i elementów członkowskich innych zestawów.

  • Uprawnienia wymagane przez te typy i elementy członkowskie są uwzględniane w zestawie przyznania częściowo zaufanego zespołu.

  • Zestaw nie jest zapisywany na dysku.

  • Symbole debugowania nie są generowane. (Internet i LocalIntranet zestawy uprawnień nie zawierają niezbędnych uprawnień).

Metody dynamiczne hostowane anonimowo

Metody dynamiczne hostowane anonimowo są tworzone przy użyciu dwóch DynamicMethod konstruktorów, które nie określają skojarzonego typu lub modułu, DynamicMethod(String, Type, Type[]) i DynamicMethod(String, Type, Type[], Boolean). Te konstruktory umieszczają metody dynamiczne w zestawie udostępnionym przez system, w pełni zaufanym, przezroczystym pod względem zabezpieczeń. Do używania tych konstruktorów ani do emitowania kodu dla metod dynamicznych nie są wymagane żadne uprawnienia.

Zamiast tego, po utworzeniu anonimowo hostowanej metody dynamicznej, stos wywołań zostaje przechwycony. Po utworzeniu metody wymagania dotyczące zabezpieczeń są wykonywane względem przechwyconego stosu wywołań.

Uwaga / Notatka

Koncepcyjnie wymagania są stawiane podczas budowy metody. Oznacza to, że żądania mogą być stawiane w momencie emisji każdej instrukcji CIL. W bieżącej implementacji wszystkie żądania są realizowane, gdy wywoływana jest metoda DynamicMethod.CreateDelegate lub gdy wywoływany jest kompilator just-in-time (JIT), jeśli metoda jest uruchamiana bez wywołania CreateDelegate.

Jeśli domena aplikacji na to zezwala, anonimowo hostowane dynamiczne metody mogą pominąć kontrole widoczności JIT, z zastrzeżeniem następującego ograniczenia: Typy niepubliczne i elementy członkowskie dostępne przez anonimowo hostowaną metodę dynamiczną muszą znajdować się w zespołach, których zestawy uprawnień są równe lub podzbiory zestawu uprawnień stosu emitującego wywołania. Ta ograniczona zdolność pomijania kontroli widoczności JIT jest aktywowana, jeśli domena aplikacji przyznaje ReflectionPermission z flagą ReflectionPermissionFlag.RestrictedMemberAccess.

  • Jeśli metoda używa tylko typów publicznych i elementów członkowskich, żadne uprawnienia nie są wymagane podczas tworzenia.

  • Jeśli określisz, że kontrole widoczności JIT powinny zostać pominięte, żądanie realizowane podczas konstruowania metody zawiera ReflectionPermission z flagą ReflectionPermissionFlag.RestrictedMemberAccess oraz zestaw zezwoleń zestawu, który zawiera niepubliczny element członkowski, do którego uzyskuje się dostęp.

Ze względu na to, że zakres uprawnień niepublicznego elementu członkowskiego jest brany pod uwagę, częściowo zaufany kod ReflectionPermissionFlag.RestrictedMemberAccess, nie może podnieść swoich uprawnień, wykonując niepubliczne elementy członkowskie zaufanych zestawów.

Wykonanie metody dynamicznej, podobnie jak dowolnego innego emitowanego kodu, wymaga wszystkich zezwoleń wymaganych przez metody, z których korzysta metoda dynamiczna.

Zestaw systemowy hostujący anonimowe metody dynamiczne korzysta z SecurityRuleSet.Level1 modelu przezroczystości, który jest modelem przezroczystości używanym w programie .NET Framework przed programem .NET Framework 4.

Aby uzyskać więcej informacji, zobacz klasę DynamicMethod .

Generowanie anonimowo hostowanych metod dynamicznych na podstawie częściowo zaufanego kodu

Rozważ warunki, w których zestaw z uprawnieniami do Internetu może wygenerować anonimowo hostowaną metodę dynamiczną i wykonać ją:

  • Metoda dynamiczna używa tylko typów publicznych i składowych. Jeśli zestaw dotacji zawiera ReflectionPermissionFlag.RestrictedMemberAccess, może używać typów niepublicowych i członków dowolnego zespołu, którego zestaw dotacji jest równy albo będący podzbiorem zestawu emitującego zespołu.

  • Uprawnienia wymagane przez wszystkie typy i elementy członkowskie używane przez metodę dynamiczną są uwzględniane w zestawie zezwoleń częściowo zaufanego zestawienia.

Uwaga / Notatka

Metody dynamiczne nie obsługują symboli debugowania.

Metody dynamiczne skojarzone z istniejącymi kompilacjami

Aby skojarzyć metodę dynamiczną z typem lub modułem w istniejącym zestawie, użyj dowolnego DynamicMethod konstruktora, który określa skojarzony typ lub moduł. Uprawnienia wymagane do wywołania tych konstruktorów różnią się, ponieważ kojarzenie metody dynamicznej z istniejącym typem lub modułem zapewnia dostęp metody dynamicznej do typów niepublicznych i elementów członkowskich.

  • Metoda dynamiczna skojarzona z typem ma dostęp do wszystkich elementów członkowskich tego typu, nawet prywatnych elementów członkowskich oraz do wszystkich typów wewnętrznych i składowych w zestawie zawierającym skojarzony typ.

  • Metoda dynamiczna skojarzona z modułem ma dostęp do wszystkich internal typów i członków (Friend w Visual Basic, assembly w metadanych środowiska uruchomieniowego języka wspólnego) w module.

Ponadto można użyć konstruktora, który określa możliwość pomijania kontroli widoczności kompilatora JIT. Dzięki temu metoda dynamiczna ma dostęp do wszystkich typów i członków we wszystkich assembly, niezależnie od poziomu dostępu.

Uprawnienia wymagane przez konstruktora zależą od tego, ile dostępu decydujesz się na nadanie metodzie dynamicznej:

Chociaż elementy na tej liście są opisane pod względem uprawnień emitującego zestawu, należy pamiętać, że wymagania są wykonywane względem pełnego stosu wywołań, w tym granicą domeny aplikacyjnej.

Aby uzyskać więcej informacji, zobacz klasę DynamicMethod .

Generowanie metod dynamicznych na podstawie częściowo zaufanego kodu

Uwaga / Notatka

Zalecanym sposobem generowania metod dynamicznych z częściowo zaufanego kodu jest użycie metod dynamicznych hostowanych anonimowo.

Rozważ warunki, w których zestaw z uprawnieniami do Internetu może wygenerować metodę dynamiczną i wykonać ją:

  • Metoda dynamiczna jest albo skojarzona z modułem lub typem, który ją emituje, albo jej zestaw uprawnień zawiera ReflectionPermissionFlag.RestrictedMemberAccess i jest skojarzona z modułem w zestawie, którego zestaw uprawnień jest równy lub stanowi podzestaw zestawu uprawnień zespołu emitującego.

  • Metoda dynamiczna używa tylko typów publicznych i składowych. Jeśli jego zbiór zezwoleń zawiera ReflectionPermissionFlag.RestrictedMemberAccess i jest skojarzony z modułem w zestawie, którego zbiór zezwoleń jest równy lub stanowi podzbiór zbioru zezwoleń zestawu emitującego, może używać typów i członków oznaczonych internal (Friend w Visual Basic, assembly w metadanych środowiska uruchomieniowego języka wspólnego) w skojarzonym module.

  • Uprawnienia wymagane przez wszystkie typy i członkowie używane przez metodę dynamiczną są uwzględniane w zestawie uprawnień częściowo zaufanego zespołu.

  • Metoda dynamiczna nie pomija kontroli widoczności JIT.

Uwaga / Notatka

Metody dynamiczne nie obsługują symboli debugowania.

Informacje o wersji

Począwszy od programu .NET Framework 4, zasady zabezpieczeń dla całej maszyny są usuwane, a przejrzystość zabezpieczeń staje się domyślnym mechanizmem wymuszania.

Począwszy od programu .NET Framework 2.0 z dodatkiem Service Pack 1, ReflectionPermission flaga ReflectionPermissionFlag.ReflectionEmit nie jest już wymagana podczas emitowania zestawów dynamicznych i metod dynamicznych. Ta flaga jest wymagana we wszystkich wcześniejszych wersjach programu .NET Framework.

Uwaga / Notatka

ReflectionPermission z flagą ReflectionPermissionFlag.ReflectionEmit jest domyślnie uwzględniana w zestawach uprawnień FullTrust i LocalIntranet, ale nie w zestawie uprawnień Internet. W związku z tym we wcześniejszych wersjach programu .NET Framework biblioteka może być używana z uprawnieniami do Internetu tylko wtedy, gdy wykonuje kod Assert dla ReflectionEmit programu. Takie biblioteki wymagają dokładnego przeglądu zabezpieczeń, ponieważ błędy kodowania mogą powodować luki w zabezpieczeniach. Program .NET Framework 2.0 z dodatkiem SP1 umożliwia emitowanie kodu w scenariuszach częściowego zaufania bez wystawiania żadnych wymagań dotyczących zabezpieczeń, ponieważ generowanie kodu nie jest z natury operacją uprzywilejowaną. Oznacza to, że wygenerowany kod nie ma więcej uprawnień niż zestaw, który go emituje. Dzięki temu biblioteki emitujące kod mogą być przezroczyste w zabezpieczeniach i eliminuje potrzebę potwierdzenia ReflectionEmit, co upraszcza zadanie pisania bezpiecznej biblioteki.

Ponadto dodatek SP1 dla programu .NET Framework 2.0 wprowadza flagę ReflectionPermissionFlag.RestrictedMemberAccess umożliwiającą dostęp do typów niepublicowych i elementów członkowskich z częściowo zaufanych metod dynamicznych. Wcześniejsze wersje programu .NET Framework wymagają użycia ReflectionPermissionFlag.MemberAccess flagi dla metod dynamicznych, które uzyskują dostęp do typów i elementów niepublicznych. Jest to uprawnienie, którego nigdy nie należy przyznawać częściowo zaufanemu kodowi.

Na koniec program .NET Framework 2.0 z dodatkiem SP1 wprowadza anonimowe metody hostowane.

Uzyskiwanie informacji o typach i członkach

Począwszy od .NET Framework 2.0, żadne uprawnienia nie są wymagane do uzyskania informacji o typach niepublicznych i elementach. Odbicie służy do uzyskiwania informacji potrzebnych do emitowania metod dynamicznych. Na przykład MethodInfo obiekty są używane do emitowania wywołań metod. Wcześniejsze wersje programu .NET Framework wymagają ReflectionPermission z flagą ReflectionPermissionFlag.TypeInformation. Aby uzyskać więcej informacji, zobacz Zagadnienia bezpieczeństwa dotyczące refleksji.

Zobacz także