A tükröződés biztonsági szempontjai

A reflexió lehetővé teszi a típusokkal és tagokkal kapcsolatos információk beszerzését, valamint a tagok elérését (azaz metódusok és konstruktorok meghívását, tulajdonságértékek lekérését és beállítását, eseménykezelők hozzáadását és eltávolítását stb.). A típusok és tagok információinak lekérésére való reflexió használata nem korlátozott. Minden kód a tükröződés segítségével hajthatja végre a következő feladatokat:

  • Sorolja fel a típusokat és a tagokat, és vizsgálja meg a metaadataikat.
  • Szerelvények és modulok számbavétele és vizsgálata.

Ezzel szemben a tagok elérésére a tükröződés korlátozásai vonatkoznak. A .NET-keretrendszer 4-től kezdve csak megbízható kód használhatja a tükröződést a biztonsági szempontból kritikus tagok eléréséhez. Ezenkívül csak megbízható kód használhatja a tükrözést olyan nem nyilvános tagok elérésére, amelyek nem lennének közvetlenül elérhetők a lefordított kódhoz. Végül, a tükrözést használó kódnak rendelkeznie kell a biztonságosan kritikus tag által megkövetelt engedélyekkel, ugyanúgy, mint a lefordított kód esetében.

A szükséges engedélyek függvényében a kód a tükrözés használatával végezheti el a következő típusú hozzáférést:

  • Olyan nyilvános tagok elérése, amelyek nem biztonsági szempontból kritikusak.

  • Olyan nem nyilvános tagok elérése, amelyek elérhetők lennének a lefordított kódhoz, ha ezek a tagok nem biztonsági szempontból kritikus fontosságúak. Ilyen nem nyilvános tagok például a következők:

    • A hívókód alaposztályainak védett tagjai. (Ennek fényében ezt családi szintű hozzáférésnek nevezzük.)

    • internal tagok (Friend tagok a Visual Basic-ben) a hívókód szerelvényében. (Ennek fényében ezt szerelvényszintű hozzáférésnek nevezzük.)

    • A hívó kódot tartalmazó osztály más példányainak privát tagjai.

A tesztkörnyezeti alkalmazástartományban futtatott kód például a listában leírt hozzáférésre korlátozódik, kivéve, ha az alkalmazástartomány további engedélyeket ad meg.

A .NET-keretrendszer 2.0 Service Pack 1 csomagtól kezdve a normál esetben elérhetetlen tagok elérésének megkísérlése a célobjektum ReflectionPermission támogatási készletének és a ReflectionPermissionFlag.MemberAccess jelzőnek az igényét generálja. A teljes megbízhatósággal futó kód (például egy parancssorból indított alkalmazás kódja) mindig megfelel ezeknek az engedélyeknek. (Ez a cikk későbbi részében ismertetett, a biztonsági szempontból kritikus tagok elérésére vonatkozó korlátozások hatálya alá tartozik.)

Ha szeretné, a tesztkörnyezetbe helyezett alkalmazástartományok a jelen cikk későbbi, A ReflectionPermission című szakaszában leírtaknak megfelelően a jelölővel ReflectionPermissionFlag.MemberAccess is megadhatóak.

Hozzáférés Security-Critical tagokhoz

A tag biztonsági szempontból kritikus fontosságú, ha rendelkezik a SecurityCriticalAttribute, ha egy típushoz SecurityCriticalAttribute tartozik, vagy ha biztonsági szempontból kritikus szerelvényben van. A .NET-keretrendszer 4-től kezdve a biztonsági szempontból kritikus tagok elérésére vonatkozó szabályok a következők:

  • A transzparens kód nem használhat tükrözést a biztonsági szempontból kritikus tagok eléréséhez, még akkor sem, ha a kód teljes mértékben megbízható. A MethodAccessException, FieldAccessException, vagy TypeAccessException dobásra kerül.

  • A részleges megbízhatósággal futó kódokat a rendszer transzparensként kezeli.

Ezek a szabályok ugyanazok, függetlenül attól, hogy egy biztonsági szempontból kritikus tag közvetlenül lefordított kóddal vagy tükröződés használatával érhető el.

A parancssorból futtatott alkalmazáskód teljes megbízhatósággal fut. Mindaddig, amíg nincs transzparensként megjelölve, tükröződés használatával hozzáférhet a biztonsági szempontból kritikus fontosságú tagokhoz. Ha ugyanazt a kódot részleges megbízhatósággal futtatja (például egy tesztkörnyezeti alkalmazástartományban), a szerelvény megbízhatósági szintje határozza meg, hogy hozzáfér-e a biztonsági szempontból kritikus kódhoz: Ha a szerelvénynek erős neve van, és telepítve van a globális szerelvény-gyorsítótárban, az egy megbízható szerelvény, és meghívhatja a biztonsági szempontból kritikus fontosságú tagokat. Ha nem megbízható, akkor transzparenssé válik annak ellenére, hogy nem jelölte meg transzparensként, és nem fér hozzá a biztonsági szempontból kritikus fontosságú tagokhoz.

Tükröződés és átlátszóság

A .NET-keretrendszer 4-től kezdődően a közös nyelvi futtatókörnyezet számos tényező alapján meghatározza egy típus vagy tag átláthatósági szintjét, beleértve a szerelvény megbízhatósági szintjét és az alkalmazástartomány megbízhatósági szintjét. A tükröződés biztosítja a IsSecurityCritical, IsSecuritySafeCriticalés IsSecurityTransparent a tulajdonságokat, amelyekkel felderítheti egy típus áttetszőségi szintjét. Az alábbi táblázat a tulajdonságok érvényes kombinációit mutatja be.

Biztonsági szint IsSecurityCritical IsSecuritySafeCritical IsBiztonságiÁtlátható
Nélkülözhetetlen true false false
Biztonságkritikus true true false
Átlátszó false false true

Ezeknek a tulajdonságoknak a használata sokkal egyszerűbb, mint egy szerelvény biztonsági széljegyzeteinek és típusainak vizsgálata, az aktuális megbízhatósági szint ellenőrzése és a futtatókörnyezet szabályainak duplikálása. Ugyanez a típus lehet például biztonsági szempontból kritikus fontosságú, ha a parancssorból futtatja, vagy biztonsági szempontból transzparens lehet, ha egy tesztkörnyezetben futó alkalmazástartományban fut.

Az MethodBase, FieldInfo, TypeBuilder, MethodBuilder és DynamicMethod osztályok hasonló tulajdonságokkal rendelkeznek. (Egyéb tükrözési és tükrözési absztrakciók esetében a társított metódusokra biztonsági attribútumokat alkalmazunk; például a tulajdonságok esetében ezek a tulajdonság-hozzáférőkre is alkalmazva lesznek.)

Általában elérhetetlen tagok elérése

A közös nyelvi futtatókörnyezet hozzáférhetőségi szabályai szerint elérhetetlen tagok meghívásához a kódnak két engedély egyikét kell kapnia:

  • Ha engedélyezni szeretné, hogy a kód meghívjon bármely nem nyilvános tagot: A kódot meg kell adni ReflectionPermission a ReflectionPermissionFlag.MemberAccess jelölővel.

    Megjegyzés:

    A biztonsági szabályzat alapértelmezés szerint letiltja ezt az engedélyt az internetről származó kódra. Ez az engedély soha nem adható az internetről származó kódnak.

  • Ha engedélyezni szeretné, hogy a kód meghívja a nem nyilvános tagokat, mindaddig, amíg a meghívott tagot tartalmazó szerelvény támogatási készlete megegyezik a meghívó kódot tartalmazó szerelvény támogatási halmazával, vagy annak egy részhalmazával: A kódot a ReflectionPermission jelölővel kell megadniReflectionPermissionFlag.RestrictedMemberAccess.

Tegyük fel például, hogy egy alkalmazástartománynak internetes engedélyeket ad meg a ReflectionPermission plusz a ReflectionPermissionFlag.RestrictedMemberAccess jelölővel, majd futtat egy internetes alkalmazást két szerelvénnyel (A és B).

  • Az A szerelvény a "B" szerelvény magántagjainak elérésére használhatja a tükröződést, mivel a B szerelvény engedélyezési készlete nem tartalmaz olyan engedélyeket, amelyeket az A nem kapott meg.

  • Az A szerelvény nem használhat tükrözést a .NET-keretrendszer-szerelvények magántagjainak, például a mscorlib.dll elérésére, mivel mscorlib.dll teljes mértékben megbízható, ezért olyan engedélyekkel rendelkezik, amelyek nem lettek megadva az A szerelvényhez. Egy MemberAccessException kivétel keletkezik, amikor a kódhozzáférési biztonság futásidőben végigvezeti a vermet.

Szerializáció

Szerializálás SecurityPermission esetén a SecurityPermissionAttribute.SerializationFormatter jelölővel a szerializálható típusok tagjait lekérheti és beállíthatja, az akadálymentességtől függetlenül. Ez az engedély lehetővé teszi a kód számára egy példány privát állapotának felderítését és módosítását. (A megfelelő engedélyek megadása mellett a típust szerializálhatóként kell megjelölni a metaadatokban.)

MethodInfo típusú paraméterek

Kerülje az olyan nyilvános tagok írását, amelyek MethodInfo paramétereket fogadnak, különösen akkor, ha megbízható kódról van szó. Az ilyen tagok sebezhetőbbek lehetnek a rosszindulatú kóddal szemben. Vegyünk például egy nyilvános tagot, amely egy MethodInfo paramétert vár egy nagyon megbízható kódban. Tegyük fel, hogy a nyilvános tag közvetetten meghívja a Invoke metódust a megadott paraméteren. Ha a nyilvános tag nem végzi el a szükséges engedélyellenőrzéseket, a Invoke metódus hívása mindig sikeres lesz, mivel a biztonsági rendszer megállapítja, hogy a hívó megbízható. Még ha a rosszindulatú kód nem is rendelkezik a metódus közvetlen meghívására vonatkozó engedéllyel, akkor is megteheti közvetetten a nyilvános tag meghívásával.

Verzióadatok

  • A .NET-keretrendszer 4-től kezdve a transzparens kód nem használhat tükrözést a biztonsági szempontból kritikus tagok eléréséhez.

  • A ReflectionPermissionFlag.RestrictedMemberAccess jelző a .NET Framework 2.0 Service Pack 1 csomagban van bevezetve. A .NET-keretrendszer korábbi verzióihoz szükség van a ReflectionPermissionFlag.MemberAccess nem nyilvános tagok elérésére tükrözést használó kód jelölőjére. Ez egy olyan engedély, amelyet nem szabad részben megbízható kódhoz adni.

  • A .NET-keretrendszer 2.0-tól kezdve a nem nyilvános típusok és tagok adatainak lekérése tükröződés használatával nem igényel engedélyeket. A korábbi verziókban ReflectionPermission a ReflectionPermissionFlag.TypeInformation jelölő használata kötelező.

Lásd még