CA2138: Jawne metody nie mogą wywoływać metod z atrybutem SuppressUnmanagedCodeSecurity
Pozycja | Wartość |
---|---|
Ruleid | CA2138 |
Kategoria | Microsoft.Security |
Zmiana powodująca niezgodność | Kluczowa |
Przyczyna
Przezroczysta metoda zabezpieczeń wywołuje metodę oznaczoną atrybutem SuppressUnmanagedCodeSecurityAttribute .
Uwaga
Ta reguła została przestarzała. Aby uzyskać więcej informacji, zobacz Przestarzałe reguły.
Opis reguły
Ta reguła jest uruchamiana w dowolnej przezroczystej metodzie, która wywołuje bezpośrednio kod natywny, na przykład przy użyciu wywołania P/Invoke (wywołania platformy). Metody międzyoperacyjnych P/Invoke i COM oznaczone atrybutem SuppressUnmanagedCodeSecurityAttribute powodują wykonanie polecenia LinkDemand względem metody wywołującej. Ponieważ kod przezroczysty zabezpieczeń nie może spełniać wymagań LinkDemands, kod nie może również wywoływać metod oznaczonych atrybutem SuppressUnmanagedCodeSecurity lub metod klasy oznaczonej atrybutem SuppressUnmanagedCodeSecurity. Metoda zakończy się niepowodzeniem lub zapotrzebowanie zostanie przekonwertowane na pełne zapotrzebowanie.
Naruszenia tej reguły prowadzą do MethodAccessException modelu przejrzystości zabezpieczeń poziomu 2 i pełnego zapotrzebowania na UnmanagedCode model przejrzystości poziomu 1.
Jak naprawić naruszenia
Aby naprawić naruszenie tej reguły, usuń SuppressUnmanagedCodeSecurityAttribute atrybut i oznacz metodę za pomocą atrybutu SecurityCriticalAttributeSecuritySafeCriticalAttribute lub .
Kiedy pomijać ostrzeżenia
Nie pomijaj ostrzeżeń dla tej reguły.
Przykład
using System;
using System.Runtime.InteropServices;
using System.Security;
namespace TransparencyWarningsDemo
{
public class CallSuppressUnmanagedCodeSecurityClass
{
[SuppressUnmanagedCodeSecurity]
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool Beep(uint dwFreq, uint dwDuration);
public void CallNativeMethod()
{
// CA2138 violation - transparent method calling a method marked with SuppressUnmanagedCodeSecurity
// (this is also a CA2149 violation as well, since this is a P/Invoke and not an interface call).
Beep(10000, 1);
}
}
}
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla