CA2117: Typy APTCA powinny rozszerzać tylko typy bazowe APTCA
TypeName |
AptcaTypesShouldOnlyExtendAptcaBaseTypes |
CheckId |
CA2117 |
Kategoria |
Microsoft.Security |
Zmiana kluczowa |
Kluczowa |
Przyczyna
Typ publiczny lub chroniony w zestawie z atrybutem AllowPartiallyTrustedCallersAttribute dziedziczy typ zadeklarowany w zestawie, który nie ma atrybutu.
Opis reguły
Domyślnie, typy publiczne lub chronione w zestawach o silnych nazwach są niejawnie chronione przez Żądania dziedziczenia dla pełnego zaufania.Zespoły o silnej nazwie, oznaczone atrybutem AllowPartiallyTrustedCallersAttribute (APTCA) nie mają tej ochrony.Atrybut wyłącza żądanie dziedziczenia.Dzięki temu typy narażone, zadeklarowane w zestawie są dziedziczne według typów, które nie mają pełnego zaufania.
Gdy atrybut APTCA jest obecny w pełni zaufanym zestawie i typ w zestawie dziedziczy z typu, który nie zezwala na dostęp częściowo zaufanych wywołań, możliwe jest wykorzystanie luk w bezpieczeństwie.Jeśli dwa typy T1 i T2 spełniają następujące warunki, złośliwi wywołujący mogą użyć typu T1 aby pominąć niejawne żądanie dziedziczenia pełnego zaufania, które chroni T2:
T1 jest typem publicznym, zadeklarowanym w pełni zaufanym zestawie, który ma atrybut APTCA.
T1 dziedziczy po typie T2 poza zestawem.
Zestaw T2 nie ma atrybutu APTCA i dlatego nie powinien być dziedziczony przez typy w częściowo zaufanych zestawach.
Częściowo zaufany typ X może dziedziczyć po T1, który daje dostęp do dziedziczonych elementów członkowskich zadeklarowanych w T2.Ponieważ T2 nie ma atrybutu APTCA, jego bezpośredni typ pochodny (T1) musi spełniać żądanie dziedziczenia pełnego zaufania; T1 ma pełne zaufanie i dlatego spełnia to żądanie.Zagrożenie bezpieczeństwa istnieje, ponieważ X nie uczestniczy w spełnianiu żądanie dziedziczenia, która chroni T2 przed niezaufaną podklasą.Z tego powodu typy z atrybutem APTCA nie mogą rozszerzać typów, które nie mają tego atrybutu.
Inny problem zabezpieczeń i prawdopodobnie najczęstszy polega na tym, że typ pochodny (T1) może, poprzez błąd programisty, odsłonić chronione elementy członkowskie typu, który wymaga pełnego zaufania (T2).W takim przypadku niezaufani wywołujący uzyskują dostęp do informacji, które powinny być dostępne tylko dla typów w pełni zaufanych.
Jak naprawić naruszenia
Jeśli typ, zgłoszony przez to naruszenie jest w zestawie, który nie wymaga atrybutu APTCA, należy je usunąć.
Jeśli atrybut APTCA jest wymagany, należy dodać żądanie dziedziczenia dla typu w pełni zaufanego.Chroni to przed dziedziczeniem przez niezaufane typy.
Jest możliwe naprawienie naruszenie przez dodanie atrybutu APTCA do zestawów typów podstawowych, zgłoszonych przez to naruszenie.Nie należy tego robić bez przeprowadzania intensywnego przeglądu zabezpieczeń dla całego kodu w zestawach oraz całego kodu, który zależy od zestawów.
Kiedy pominąć ostrzeżenia
Aby bezpiecznie pominąć ostrzeżenie od tej reguły, należy się upewnić, że chronione elementy członkowskie udostępniane przez typ nie zezwalają bezpośrednio lub pośrednio niezaufanym wywołującym na dostęp do poufnych informacji, operacji lub zasobów, które mogą być używane w sposób niszczący.
Przykład
Poniższy przykład używa dwóch zestawów i aplikacji testowej do zilustrowania luki w zabezpieczeniach wykrytej przez tę regułę.Pierwszy zestaw nie ma atrybutu APTCA i nie powinien być dziedziczony przez typy częściowo zaufane (reprezentowane przez T2 w poprzednim podrozdziale).
using System;
using System.Security;
using System.Security.Permissions;
using System.Reflection;
// This code is compiled into a strong-named assembly
// that requires full trust.
namespace AptcaTestLibrary
{
public class ClassRequiringFullTrustWhenInherited
{
// This field should be overridable by fully trusted derived types.
protected static string location = "shady glen";
// A trusted type can see the data, but cannot change it.
public virtual string TrustedLocation
{
get
{
return location;
}
}
}
}
Drugi zestaw, reprezentowany przez T1 w poprzednim podrozdziale jest w pełni zaufany i zezwala na częściowo zaufanych wywołujących.
using System;
using System.Security;
using System.Security.Permissions;
using System.Reflection;
// This class is compiled into an assembly that executes with full
// trust and allows partially trusted callers.
// Violates rule: AptcaTypesShouldOnlyExtendAptcaBaseTypes.
namespace AptcaTestLibrary
{
public class InheritAClassRequiringFullTrust:
ClassRequiringFullTrustWhenInherited
{
private DateTime meetingDay = DateTime.Parse("February 22 2003");
public override string ToString()
{
// Another error:
// This method gives untrusted callers the value
// of TrustedLocation. This information should
// only be seen by trusted callers.
string s = String.Format(
"Meet at the {0} {1}!",
this.TrustedLocation, meetingDay.ToString());
return s;
}
}
}
Typ testowy, reprezentowany przez X w poprzednim podrozdziale jest częściowo zaufanym zestawem.
using System;
using AptcaTestLibrary;
// If this test application is run from the local machine,
// it gets full trust by default.
// Remove full trust.
[assembly: System.Security.Permissions.PermissionSetAttribute(
System.Security.Permissions.SecurityAction.RequestRefuse, Name = "FullTrust")]
namespace TestSecLibrary
{
class InheritFromAFullTrustDecendent : ClassRequiringFullTrust
{
public InheritFromAFullTrustDecendent()
{
// This constructor maliciously overwrites the protected
// static member in the fully trusted class.
// Trusted types will now get the wrong information from
// the TrustedLocation property.
InheritFromAFullTrustDecendent.location = "sunny meadow";
}
public override string ToString()
{
return InheritFromAFullTrustDecendent.location;
}
}
class TestApctaInheritRule
{
public static void Main()
{
ClassRequiringFullTrust iclass =
new ClassRequiringFullTrust();
Console.WriteLine(iclass.ToString());
// You cannot create a type that inherits from the full trust type
// directly, but you can create a type that inherits from
// the APTCA type which in turn inherits from the full trust type.
InheritFromAFullTrustDecendent inherit =
new InheritFromAFullTrustDecendent();
//Show the inherited protected member has changed.
Console.WriteLine("From Test: {0}", inherit.ToString());
// Trusted types now get the wrong information from
// the TrustedLocation property.
Console.WriteLine(iclass.ToString());
}
}
}
Ten przykład generuje następujące wyniki.
Powiązane reguły
CA2116: Metody APTCA powinny wywoływać tylko metody APTCA
Zobacz też
Koncepcje
Zestawy .NET Framework wywoływane przez częściowo zaufany kod
Używanie bibliotek pochodzących z częściowo zaufanego kodu