CA2107: Przejrzyj użycie akcji Deny i Permit Only
TypeName |
ReviewDenyAndPermitOnlyUsage |
CheckId |
CA2107 |
Kategoria |
Microsoft.Security |
Zmiana kluczowa |
Kluczowa |
Przyczyna
Metoda zawiera sprawdzanie zabezpieczeń, które określa akcję zabezpieczającą PermitOnly lub Deny.
Opis reguły
Akcje zabezpieczające Korzystanie z metody PermitOnly i CodeAccessPermission.Deny powinny być używane tylko przez osoby posiadające zaawansowaną wiedzę o zabezpieczeniach .NET Framework.Kod, który używa tych akcji zabezpieczeń powinien przejść przegląd zabezpieczeń.
Odmowa zmienia domyślne zachowanie przeszukiwania stosu, które występuje w odpowiedzi na żądanie zabezpieczeń.Umożliwia określenie uprawnień, które nie mogą być przyznane na czas trwania metody odmawiającej, bez względu na rzeczywiste uprawnienia metody wywołującej na stos wywołań.Jeśli podczas przeszukiwania stosu zostanie wykryta metoda, która jest zabezpieczona przez Deny i jeśli wymagane uprawnienie jest zawarte w uprawnieniach odmowy, przeszukiwanie stosu nie powiedzie się.PermitOnly także zmienia domyślne zachowanie przeszukiwania stosu.Pozwala to określić w kodzie tylko te uprawnienia, które mogą być przyznane, niezależnie od uprawnień metody wywołującej.Jeśli przeszukiwanie stosu wykryje metodę, która jest zabezpieczona przez PermitOnly i jeśli żądane uprawnienie nie jest uwzględniony w uprawnieniach, które są określone przez PermitOnly, przeszukiwanie stosu nie powiedzie się.
Kod, który opiera się na tych akcjach powinien zostać starannie sprawdzony pod względem luk w zabezpieczeniach ze względu na ich ograniczoną użyteczność oraz subtelne zachowanie.Należy rozważyć następujące kwestie:
Żądania połączeń nie jest uwzględniany przez Deny lub PermitOnly.
Jeśli Deny lub PermitOnly wystąpi w tej samej ramce stosu co żądanie wywołujące przeszukanie stosu, akcje bezpieczeństwa nie zadziałają.
Wartości, które są używane do konstruowania uprawnień opartych na ścieżce mogą zazwyczaj zostać określone na wiele sposobów.Odmowa dostępu do jednej z form ścieżki nie uniemożliwia dostępu do wszystkich form.Na przykład jeśli udział pliku \\Server\Share jest zamapowany na dysk sieciowy X:, aby odmówić dostępu do pliku w udziale należy odmówić dostępu do \\Server\Share\File, X:\File i każdej innej ścieżki mającej dostęp do pliku.
Metoda CodeAccessPermission.Assert może zakończyć przeszukiwanie stosu przed osiągnięciem Deny lub PermitOnly.
Jeśli Deny ma wpływ, mianowicie, gdy obiekt wywołujący posiada uprawnienie, które jest blokowane przez Deny, obiekt wywołujący może uzyskać dostępu do chronionego zasobu bezpośrednio, pomijając Deny.Podobnie jeśli obiekt wywołujący nie posiada uprawnienia odmownego, przeszukanie stosu bez Deny nie powiodłoby się.
Jak naprawić naruszenia
Każde wykorzystanie tych działań zabezpieczeń spowoduje naruszenie.Aby naprawić naruszenie, nie należy używać tych działań zabezpieczeń.
Kiedy pominąć ostrzeżenia
Pomiń ostrzeżenie od tej zasady tylko po zakończeniu przeglądu zabezpieczeń.
Przykład
Poniższy przykład demonstruje pewne ograniczenia Deny.
Następująca biblioteka zawiera klasę zawierającą dwie metody, które są identyczne, z wyjątkiem chroniących je wymogów zabezpieczeń.
using System.Security;
using System.Security.Permissions;
using System;
namespace SecurityRulesLibrary
{
public class SomeSecuredMethods
{
// Demand immediate caller has suitable permission
// before revealing sensitive data.
[EnvironmentPermissionAttribute(SecurityAction.LinkDemand,
Read="COMPUTERNAME;USERNAME;USERDOMAIN")]
public static void MethodProtectedByLinkDemand()
{
Console.Write("LinkDemand: ");
}
[EnvironmentPermissionAttribute(SecurityAction.Demand,
Read="COMPUTERNAME;USERNAME;USERDOMAIN")]
public static void MethodProtectedByDemand()
{
Console.Write("Demand: ");
}
}
}
Następująca aplikacja pokazuje wpływ Deny na zabezpieczone metody z biblioteki.
using System.Security;
using System.Security.Permissions;
using System;
using SecurityRulesLibrary;
namespace TestSecurityLibrary
{
// Violates rule: ReviewDenyAndPermitOnlyUsage.
public class TestPermitAndDeny
{
public static void TestAssertAndDeny()
{
EnvironmentPermission envPermission = new EnvironmentPermission(
EnvironmentPermissionAccess.Read,
"COMPUTERNAME;USERNAME;USERDOMAIN");
envPermission.Assert();
try
{
SomeSecuredMethods.MethodProtectedByDemand();
Console.WriteLine(
"Caller's Deny has no effect on Demand " +
"with the asserted permission.");
SomeSecuredMethods.MethodProtectedByLinkDemand();
Console.WriteLine(
"Caller's Deny has no effect on LinkDemand " +
"with the asserted permission.");
}
catch (SecurityException e)
{
Console.WriteLine(
"Caller's Deny protected the library.{0}", e);
}
}
public static void TestDenyAndLinkDemand()
{
try
{
SomeSecuredMethods.MethodProtectedByLinkDemand();
Console.WriteLine(
"Caller's Deny has no effect with " +
"LinkDemand-protected code.");
}
catch (SecurityException e)
{
Console.WriteLine(
"Caller's Deny protected the library.{0}",e);
}
}
public static void Main()
{
EnvironmentPermission envPermission = new EnvironmentPermission(
EnvironmentPermissionAccess.Read,
"COMPUTERNAME;USERNAME;USERDOMAIN");
envPermission.Deny();
//Test Deny and Assert interaction for LinkDemands and Demands.
TestAssertAndDeny();
//Test Deny's effects on code in different stack frame.
TestDenyAndLinkDemand();
//Test Deny's effect on code in same frame as deny.
try
{
SomeSecuredMethods.MethodProtectedByLinkDemand();
Console.WriteLine(
"This Deny has no effect with LinkDemand-protected code.");
}
catch (SecurityException e)
{
Console.WriteLine("This Deny protected the library.{0}",e);
}
}
}
}
Ten przykład generuje następujące wyniki.
Zobacz też
Informacje
CodeAccessPermission.PermitOnly
Koncepcje
Zastępowanie sprawdzania zabezpieczeń
Korzystanie z metody PermitOnly