Beveiligingsoverwegingen voor weerspiegeling
Weerspiegeling biedt de mogelijkheid om informatie te verkrijgen over typen en leden, en om toegang te krijgen tot leden (dat wil bijvoorbeeld methoden en constructors aanroepen, eigenschapswaarden ophalen en instellen, gebeurtenis-handlers toevoegen en verwijderen, enzovoort). Het gebruik van reflectie voor het verkrijgen van informatie over typen en leden is niet beperkt. Alle code kan reflectie gebruiken om de volgende taken uit te voeren:
- Inventariseer typen en leden en bekijk hun metagegevens.
- Assembly's en modules inventariseren en onderzoeken.
Het gebruik van weerspiegeling voor toegang tot leden is daarentegen onderhevig aan beperkingen. Vanaf .NET Framework 4 kan alleen vertrouwde code reflectie gebruiken voor toegang tot beveiligingskritieke leden. Bovendien kan alleen vertrouwde code reflectie gebruiken voor toegang tot niet-openbare leden die niet rechtstreeks toegankelijk zijn voor gecompileerde code. Ten slotte moet code die gebruikmaakt van weerspiegeling voor toegang tot een veilig kritiek lid beschikken over de machtigingen die het veilige kritieke lid vereist, net als bij gecompileerde code.
Afhankelijk van de benodigde machtigingen kan code reflectie gebruiken om de volgende soorten toegang uit te voeren:
Toegang krijgen tot openbare leden die niet essentieel zijn voor beveiliging.
Toegang krijgen tot niet-openbare leden die toegankelijk zijn voor gecompileerde code, als deze leden niet van essentieel belang zijn voor beveiliging. Voorbeelden van dergelijke niet-openbare leden zijn:
Beveiligde leden van de basisklassen van de aanroepende code. (In weerspiegeling wordt dit aangeduid als toegang op familieniveau.)
internal
leden (Friend
leden in Visual Basic) in de assembly van de aanroepcode. (In weerspiegeling wordt dit aangeduid als toegang op assemblyniveau.)Privéleden van andere exemplaren van de klasse die de aanroepende code bevat.
Code die wordt uitgevoerd in een toepassingsdomein in de sandbox, is bijvoorbeeld beperkt tot de toegang die in deze lijst wordt beschreven, tenzij het toepassingsdomein extra machtigingen verleent.
Vanaf .NET Framework 2.0 Service Pack 1 wordt geprobeerd toegang te krijgen tot leden die normaal niet toegankelijk zijn, wordt een vraag gegenereerd naar de toekenningsset van het doelobject plus ReflectionPermission de ReflectionPermissionFlag.MemberAccess vlag. Code die wordt uitgevoerd met volledig vertrouwen (bijvoorbeeld code in een toepassing die vanaf de opdrachtregel wordt gestart), kan altijd voldoen aan deze machtigingen. (Dit geldt voor beperkingen bij het openen van beveiligingskritieke leden, zoals verderop in dit artikel wordt beschreven.)
U kunt desgewenst een toepassingsdomein in de sandbox verlenen ReflectionPermission met de ReflectionPermissionFlag.MemberAccess vlag, zoals wordt beschreven in de sectie Leden openen die normaal niet toegankelijk zijn, verderop in dit artikel.
Toegang tot beveiligingskritieke leden
Een lid is van cruciaal belang voor beveiliging als het SecurityCriticalAttributebehoort tot een type met het SecurityCriticalAttributetype , of als het zich in een beveiligingskritieke assembly bevindt. Vanaf .NET Framework 4 zijn de regels voor toegang tot beveiligingskritieke leden als volgt:
Transparante code kan geen weerspiegeling gebruiken voor toegang tot beveiligingskritieke leden, zelfs als de code volledig wordt vertrouwd. Een MethodAccessException, FieldAccessExceptionof TypeAccessException wordt gegooid.
Code die wordt uitgevoerd met gedeeltelijke vertrouwensrelatie, wordt beschouwd als transparant.
Deze regels zijn hetzelfde, ongeacht of een beveiligingskritiek lid rechtstreeks wordt geopend door gecompileerde code of wordt geopend met behulp van weerspiegeling.
Toepassingscode die wordt uitgevoerd vanaf de opdrachtregel wordt uitgevoerd met volledig vertrouwen. Zolang deze niet als transparant is gemarkeerd, kan het reflectie gebruiken voor toegang tot beveiligingskritieke leden. Wanneer dezelfde code wordt uitgevoerd met gedeeltelijke vertrouwensrelatie (bijvoorbeeld in een domein van een sandboxtoepassing) bepaalt het vertrouwensniveau van de assembly of deze toegang heeft tot beveiligingskritieke code: als de assembly een sterke naam heeft en in de globale assemblycache is geïnstalleerd, is het een vertrouwde assembly en kan het beveiligingskritieke leden aanroepen. Als het niet wordt vertrouwd, wordt het transparant, ook al is het niet gemarkeerd als transparant en heeft het geen toegang tot beveiligingskritieke leden.
Weerspiegeling en transparantie
Vanaf .NET Framework 4 bepaalt de algemene taalruntime het transparantieniveau van een type of lid uit verschillende factoren, waaronder het vertrouwensniveau van de assembly en het vertrouwensniveau van het toepassingsdomein. Weerspiegeling biedt de IsSecurityCritical, IsSecuritySafeCriticalen IsSecurityTransparent eigenschappen waarmee u het transparantieniveau van een type kunt detecteren. In de volgende tabel ziet u de geldige combinaties van deze eigenschappen.
Beveiligingsniveau | IsSecurityCritical | IsSecuritySafeCritical | IsSecurityTransparent |
---|---|---|---|
Kritiek | true |
false |
false |
Veilig kritiek | true |
true |
false |
Transparant | false |
false |
true |
Het gebruik van deze eigenschappen is veel eenvoudiger dan het onderzoeken van de beveiligingsaantekeningen van een assembly en de bijbehorende typen, het controleren van het huidige vertrouwensniveau en het dupliceren van de regels van de runtime. Hetzelfde type kan bijvoorbeeld beveiligingskritiek zijn wanneer het wordt uitgevoerd vanaf de opdrachtregel of transparant als het wordt uitgevoerd in een sandbox-toepassingsdomein.
Er zijn vergelijkbare eigenschappen op de MethodBaseklassen , FieldInfo, TypeBuilderen MethodBuilderDynamicMethod klassen. (Voor andere reflectie- en weerspiegelingsuitstoten abstracties worden beveiligingskenmerken toegepast op de bijbehorende methoden; in het geval van eigenschappen worden ze bijvoorbeeld toegepast op de eigenschapstoegangsors.)
Toegang tot leden die normaal niet toegankelijk zijn
Als u weerspiegeling wilt gebruiken om leden aan te roepen die niet toegankelijk zijn volgens de toegankelijkheidsregels van de common language runtime, moet uw code een van de twee machtigingen krijgen:
Als u wilt toestaan dat code een niet-openbaar lid aanroept: Uw code moet worden verleend ReflectionPermission met de ReflectionPermissionFlag.MemberAccess vlag.
Notitie
Standaard weigert het beveiligingsbeleid deze machtiging voor code die afkomstig is van internet. Deze machtiging mag nooit worden verleend aan code die afkomstig is van internet.
Als u code wilt toestaan om een niet-openbaar lid aan te roepen, zolang de toekenningsset van de assembly die het aangeroepen lid bevat, hetzelfde is als, of een subset van, de toekenningsset van de assembly die de aanroepcode bevat: Uw code moet worden verleend ReflectionPermission met de ReflectionPermissionFlag.RestrictedMemberAccess vlag.
Stel dat u internetmachtigingen voor een toepassingsdomein met ReflectionPermission de ReflectionPermissionFlag.RestrictedMemberAccess vlag verleent en vervolgens een internettoepassing uitvoert met twee assembly's, A en B.
Assembly A kan reflectie gebruiken voor toegang tot privéleden van assembly B, omdat de toekenningsset van assembly B geen machtigingen bevat die niet zijn verleend aan A.
Assembly A kan geen weerspiegeling gebruiken voor toegang tot privéleden van .NET Framework-assembly's zoals mscorlib.dll, omdat mscorlib.dll volledig wordt vertrouwd en daarom machtigingen heeft die niet zijn verleend aan assembly A. Er wordt een MemberAccessException gegenereerd wanneer de beveiliging van codetoegang de stack tijdens runtime begeleidt.
Serialization
Voor serialisatie SecurityPermission biedt de SecurityPermissionAttribute.SerializationFormatter vlag de mogelijkheid om leden van serialiseerbare typen op te halen en in te stellen, ongeacht de toegankelijkheid. Met deze machtiging kan code de privéstatus van een exemplaar detecteren en wijzigen. (Naast het verlenen van de juiste machtigingen moet het type worden gemarkeerd als serializeerbaar in metagegevens.)
Parameters van type MethodInfo
Vermijd het schrijven van openbare leden die parameters gebruiken MethodInfo , met name voor vertrouwde code. Dergelijke leden zijn mogelijk kwetsbaarder voor schadelijke code. Denk bijvoorbeeld aan een openbaar lid in zeer vertrouwde code die een MethodInfo parameter gebruikt. Stel dat het openbare lid indirect de Invoke methode aanroept op de opgegeven parameter. Als het openbare lid niet de benodigde machtigingscontroles uitvoert, slaagt de aanroep van de Invoke methode altijd, omdat het beveiligingssysteem bepaalt dat de beller zeer vertrouwd is. Zelfs als schadelijke code niet gemachtigd is om de methode rechtstreeks aan te roepen, kan dit nog steeds indirect door het openbare lid aan te roepen.
Versie-informatie
Vanaf .NET Framework 4 kan transparante code geen weerspiegeling gebruiken voor toegang tot beveiligingskritieke leden.
De ReflectionPermissionFlag.RestrictedMemberAccess vlag wordt geïntroduceerd in .NET Framework 2.0 Service Pack 1. Voor eerdere versies van .NET Framework is de ReflectionPermissionFlag.MemberAccess vlag vereist voor code die gebruikmaakt van reflectie voor toegang tot niet-openbare leden. Dit is een machtiging die nooit mag worden verleend aan gedeeltelijk vertrouwde code.
Vanaf .NET Framework 2.0 is het gebruik van weerspiegeling om informatie te verkrijgen over niet-openbare typen en leden geen machtigingen nodig. In eerdere versies ReflectionPermission is de ReflectionPermissionFlag.TypeInformation vlag vereist.