Ostrzeżenia o zabezpieczeniach
Ostrzeżenia o zabezpieczeniach obsługują bezpieczniejsze biblioteki i aplikacje.Ostrzeżenia te pomagają zapobiec usterkom w zabezpieczeniach w programie.Przyczynę wyłączenia któregokolwiek z tych ostrzeżeń należy wyraźnie oznaczyć w kodzie i poinformować o tym osobę odpowiedzialną za bezpieczeństwo w projekcie.
W tej sekcji
Reguła |
Opis |
---|---|
CA2100: Należy przeglądnąć zapytania SQL w poszukiwaniu luk w zabezpieczeniach |
Metoda ustawia właściwość System.Data.IDbCommand.CommandText przez użycie ciągu, który jest zbudowany z argumentem ciągu do metody.Zasada ta zakłada, że argument ciągu zawiera dane wejściowe użytkownika.Ciąg polecenia SQL zbudowany z danych wejściowych użytkownika jest narażony na ataki przez wstrzyknięcie kodu SQL. |
CA2102: Przechwytuj wyjątki inne niż CLSCompliant w ogólnej obsłudze wyjątków |
Element członkowski w zestawie, który nie jest oznaczony za pomocą atrybutu RuntimeCompatibilityAttribute lub jest oznaczony jako RuntimeCompatibility(WrapNonExceptionThrows = false), zawiera blok catch obsługujący wyjątek System.Exception i nie zawiera bezpośrednio następującego ogólnego bloku catch. |
Metoda używa imperatywnych zabezpieczeń i może konstruować uprawnienia za pomocą informacji o stanie lub wartości zwrotnych, które można zmienić, podczas gdy żądanie jest aktywne.Należy używać zabezpieczeń deklaracyjnych wszędzie, gdzie to możliwe. |
|
CA2104: Nie deklaruj zmiennych typów referencyjnych tylko do odczytu |
Typ widoczny z zewnątrz zawiera widoczne na zewnątrz pole tylko do odczytu, które jest typu referencji zmiennej.Typ zmienny to typ, którego dane wystąpienia mogą być modyfikowane. |
Po zastosowaniu modyfikatora tylko do odczytu (ReadOnly w edytorze Visual Basic) do pola, które zawiera tablicę, pola nie można zmienić, aby odwoływało się do innej tablicy.Można jednak zmienić elementy tablicy przechowywane w polu tylko do odczytu. |
|
Metoda potwierdza uprawnienia i żadne sprawdzenia zabezpieczeń nie są wykonywane na obiekcie wywołującym.Potwierdzanie uprawnienia zabezpieczeń bez sprawdzania zabezpieczeń może pozostawić zdatną do wykorzystania słabość zabezpieczeń w kodzie. |
|
Metoda PermitOnly i akcje zabezpieczeń CodeAccessPermission.Deny powinny być używane tylko przez tych, którzy mają zaawansowaną wiedzę o zabezpieczeniach .NET Framework.Kod, który używa tych akcji zabezpieczeń, należy poddać przeglądowi zabezpieczeń. |
|
CA2108: Należy przeglądnąć zabezpieczenia deklaratywne typów wartościowych |
Publiczny lub chroniony typ wartości jest zabezpieczony przez dostęp do danych lub zapotrzebowanie na łącza. |
Wykryto publiczną lub chronioną metodę obsługi zdarzeń.Metody obsługi zdarzeń nie powinny być udostępnione, chyba że jest to absolutnie konieczne. |
|
Wskaźnik nie jest prywatny, wewnętrzny ani tylko do odczytu.Złośliwy kod może zmienić wartość wskaźnika, potencjalnie umożliwiając dostęp do dowolnego miejsca w pamięci lub powodując błędy aplikacji bądź systemu. |
|
Typ publiczny lub chroniony zawiera pola publiczne i jest zabezpieczony przez zapotrzebowania na łącza.Jeśli kod ma dostęp do wystąpienia typu zabezpieczonego przez żądanie łącza, kod nie musi spełniać zapotrzebowania na łącza, aby uzyskać dostęp do pól typu. |
|
Metoda nie powinna mieć zabezpieczeń deklaratywnych zarówno na poziomie metody, jak i na poziomie typu dla tej samej akcji. |
|
Ta reguła wykrywa błędy, które mogą wystąpić, ponieważ kończy się działanie niezarządzanego zasobu, a wciąż jest on używany w kodzie niezarządzanym. |
|
Gdy atrybut APTCA (AllowPartiallyTrustedCallers) jest obecny w zestawie całkowicie zaufanym i wykonuje kod w innym zestawie, który nie zezwala na dostęp częściowo zaufanych wywołań, mogą zostać wykorzystane luki w zabezpieczeniach. |
|
CA2117: Typy APTCA powinny rozszerzać tylko typy bazowe APTCA |
Gdy atrybut APTCA (AllowPartiallyTrustedCallers) jest obecny w całkowicie zaufanym zestawie i typ w zestawie dziedziczy z typu, który nie zezwala na dostęp częściowo zaufanych wywołań, mogą zostać wykorzystane luki w zabezpieczeniach. |
CA2118: Przegląd wykorzystania SuppressUnmanagedCodeSecurityAttribute |
SuppressUnmanagedCodeSecurityAttribute zmienia domyślne zachowanie systemu zabezpieczeń dla elementów członkowskich wykonujących kod niezarządzany, który używa wywołań międzyoperacyjnych COM lub platformy.Atrybut ten jest używany głównie w celu zwiększenia wydajności; jednak wzrost wydajności powoduje znaczące zagrożenia dla bezpieczeństwa. |
CA2119: Zapieczętuj metody, które spełniają interfejsy prywatne |
Dziedziczny typ publiczny dostarcza zastępowalną implementację metody wewnętrznego interfejsu (Friend w edytorze Visual Basic).Aby naprawić naruszenie tej zasady, należy zapobiegać zastąpieniu metody poza zestawem. |
Typ ten ma konstruktor, który przyjmuje obiekt System.Runtime.Serialization.SerializationInfo i obiekt System.Runtime.Serialization.StreamingContext (podpis konstruktora serializacji).Ten konstruktor nie jest zabezpieczony przez sprawdzanie zabezpieczeń, ale jeden lub kilka regularnych konstruktorów typu jest zabezpieczonych. |
|
System wywołuje statyczny konstruktor przed utworzeniem pierwszego wystąpienia typu lub przed odwołaniem do któregokolwiek ze statycznych elementów członkowskich.Jeśli konstruktor statyczny nie jest prywatny, może być wywołany przez kod inny niż system.W zależności od operacji, które są wykonywane w konstruktorze, może to spowodować nieoczekiwane zachowanie. |
|
CA2122: Nie należy pośrednio ujawniać metod w żądaniach konsolidacji |
Element członkowski publiczny lub chroniony ma zapotrzebowanie na łącza i jest wywoływany przez element członkowski, który nie sprawdza zabezpieczeń.Zapotrzebowanie na łącza sprawdza uprawnienia tylko bezpośredniego wywołującego. |
CA2123: Zastąpienia żądań konsolidacji powinny być identyczne z bazowym |
Ta reguła dopasowuje metodę do jej metody podstawowej, która jest interfejsem lub metodą wirtualną innego typu, a następnie porównuje zapotrzebowania na łącza na każdym z nich.Jeśli zasada ta jest naruszona, złośliwy wywołujący może pominąć zapotrzebowanie na łącza przez wywołanie niezabezpieczonej metody. |
CA2124: Kodowanie wrażliwych klauzul finally w zewnętrznym try |
Metoda publiczna lub chroniona zawiera blok try/finally.Wygląda na to, że blok finally resetuje stan zabezpieczeń i sam nie jest ujęty w bloku finally. |
Niezamknięty typ publiczny jest chroniony za pomocą zapotrzebowania na łącza i ma metodę, którą można zastąpić.Ani typ, ani metoda nie są chronione za pomocą żądania dziedziczenia. |
|
CA2136: Elementy członkowskie nie powinny mieć skonfliktowanych adnotacji przezroczystości |
Krytyczny kod nie może wystąpić w zestawie, który jest w 100% przezroczysty.Ta reguła analizuje zestawy w 100% przezroczyste dla adnotacji SecurityCritical na poziomie typu, pola i metody. |
CA2147: Jawne metody nie mogą używać potwierdzeń zabezpieczeń |
Reguła ta analizuje wszystkie metody i typy w zestawie, który jest w 100% przezroczysty lub mieszany przezroczysto-krytyczny i zaznacza deklaratywne lub imperatywne użycie potwierdzenia. |
CA2140: Jawny kod nie może odwoływać się do elementów krytycznych dla zabezpieczeń |
Metody, które są oznaczone przez atrybut SecurityTransparentAttribute, wywołują niepubliczne elementy członkowskie, które są oznaczone jako SecurityCritical.Ta reguła analizuje wszystkie metody i typy w zestawie mieszanym przezroczysto-krytycznym i oznacza wszelkie wywołania z przezroczystego kodu do niepublicznego krytycznego kodu, który nie jest oznaczony jako SecurityTreatAsSafe. |
CA2130: Krytyczne stałe zabezpieczeń powinny być przezroczyste |
Wymuszanie przezroczystości nie jest wymuszane dla wartości stałych, ponieważ kompilatory wbudowują stałe wartości, tak aby nie było wymagane żadne wyszukiwanie w czasie wykonywania.Stałe pola powinny być przezroczyste dla zabezpieczeń, tak aby recenzenci kodu nie zakładali, że przezroczysty kod nie może uzyskać dostępu do stałej. |
---|---|
CA2131: Typy krytyczne dla zabezpieczeń nie mogą brać udziału w równoważnikach typów |
Typ uczestniczy w równoważeniu typu i albo sam typ, albo jego element członkowski lub pole jest oznaczone atrybutem SecurityCriticalAttribute.Ta reguła jest uruchamiana na wszystkich typach krytycznych lub typach zawierających metody krytyczne lub pola, które uczestniczą w równoważeniu typu.Gdy CLR wykryje taki typ, uniemożliwia jego załadowanie, wywołując w czasie wykonywania wyjątek TypeLoadException.Zazwyczaj ta reguła uruchamiana jest tylko wtedy, gdy użytkownicy implementują równoważenie typu ręcznie, zamiast wykonać je, opierając się na otokach tlbimp i kompilatorach. |
Typy i elementy członkowskie, które mają atrybut SecurityCriticalAttribute, nie mogą być używane przez kod aplikacji Silverlight.Typy krytyczne dla bezpieczeństwa i członkowie mogą być używani tylko przez zaufany kod w środowisku .NET Framework dla biblioteki klas Silverlight.Ze względu na to, że publiczna lub chroniona konstrukcja w klasie pochodnej musi mieć taką samą lub większą przejrzystość jak jej klasa podstawowa, klasy w aplikacji nie mogą pochodzić z klasy oznaczonej jako SecurityCritical. |
|
CA2133: Delegatów należy powiązać z metodami ze spójną jawnością |
To ostrzeżenie uruchamiane jest na metodzie wiążącej obiekt delegowany, oznaczony za pomocą atrybutu SecurityCriticalAttribute, do metody, która jest przezroczysta lub oznaczona za pomocą atrybutu SecuritySafeCriticalAttribute.Ostrzeżenie jest także uruchamiane na metodzie wiążącej obiekt delegowany, który jest przezroczysty lub bezpieczny-krytyczny dla metody krytycznej. |
CA2134: Metody muszą przechowywać spójną jawność podczas nadpisywania metod bazowych |
Ta reguła jest uruchamiana, gdy metoda oznaczona za pomocą atrybutu SecurityCriticalAttribute zastępuje metodę, która jest przezroczysta lub oznaczona za pomocą atrybutu SecuritySafeCriticalAttribute.Reguła ta jest również uruchamiana, gdy metoda przezroczysta lub oznaczona atrybutem SecuritySafeCriticalAttribute zastępuje metodę oznaczoną atrybutem SecurityCriticalAttribute.Reguła jest stosowana podczas zastępowania metody wirtualnej lub implementującej interfejs. |
LinkDemands są przestarzałe w zestawie reguł zabezpieczeń poziomu 2.Zamiast używania LinkDemands do wymuszenia zabezpieczeń w czasie kompilacji just in time (JIT), należy oznaczyć metody, typy i pola za pomocą atrybutu SecurityCriticalAttribute. |
|
CA2136: Elementy członkowskie nie powinny mieć skonfliktowanych adnotacji przezroczystości |
Atrybuty przezroczystości są stosowane od elementów kodu o większym zakresie do elementów o mniejszym zakresie.Atrybuty przezroczystości elementów kodu z większym zakresem mają pierwszeństwo przed atrybutami przejrzystości elementów kodu, które są zawarte w pierwszym elemencie.Na przykład klasa, która jest oznaczona za pomocą atrybutu SecurityCriticalAttribute, nie może zawierać metody oznaczonej atrybutem SecuritySafeCriticalAttribute. |
Metoda zawiera nieweryfikowalny kod lub zwraca typ przez odwołanie.Ta reguła jest uruchamiana podczas próby wykonywania przez kod przezroczysty pod względem zabezpieczeń nieweryfikowalnego MSIL (Microsoft Intermediate Language).Jednak reguła nie zawiera pełnej weryfikacji IL i używa heurystyki do wykrywania większości naruszeń weryfikacji MSIL. |
|
CA2138: Jawne metody nie mogą wywoływać metod z atrybutem SuppressUnmanagedCodeSecurity |
Metoda przezroczysta pod względem bezpieczeństwa wywołuje metodę, która jest oznaczona za pomocą atrybutu SuppressUnmanagedCodeSecurityAttribute. |
CA2139: Jawne metody mogą nie używać atrybutu HandleProcessCorruptingExceptions |
Ta reguła jest wywoływana przez każdą metodę, która jest przejrzysta i próbuje obsłużyć wyjątek uszkodzenia procesu przy użyciu atrybutu HandleProcessCorruptedStateExceptionsAttribute.Wyjątek uszkadzający proces to klasyfikacja wyjątków CLR w wersji 4.0 wątków takich jak AccessViolationException.Atrybut HandleProcessCorruptedStateExceptionsAttribute może być używany tylko przez metody krytyczne pod względem bezpieczeństwa i będzie ignorowany, jeśli zostanie zastosowany do metody przezroczystej. |
CA2140: Jawny kod nie może odwoływać się do elementów krytycznych dla zabezpieczeń |
Element kodu, który jest oznaczony za pomocą atrybutu SecurityCriticalAttribute, jest krytyczny dla bezpieczeństwa.Przezroczysta metoda nie może użyć elementu krytycznego dla zabezpieczeń.Jeśli przezroczysty typ próbuje użyć typu krytycznego dla zabezpieczeń, zgłaszane są wyjątki TypeAccessException, MethodAccessException lub FieldAccessException. |
Metoda przezroczysta pod względem zabezpieczeń wywołuje metodę z zestawu, która nie jest oznaczona atrybutem AllowPartiallyTrustedCallersAttribute (APTCA), lub metoda przezroczysta pod względem zabezpieczeń spełnia żądanie LinkDemand dla typu lub metody. |
|
CA2142: Jawny kod nie powinien być chroniony za pomocą LinkDemands |
Ta reguła jest uruchamiana na przezroczystych metodach wymagających żądania LinkDemands, aby uzyskać do nich dostęp.Przezroczysty kod zabezpieczeń nie powinien być odpowiedzialny za weryfikację zabezpieczeń operacji, a zatem nie powinien wymagać uprawnień. |
Przezroczysty kod zabezpieczeń nie powinien być odpowiedzialny za weryfikację zabezpieczeń operacji, a zatem nie powinien wymagać uprawnień.Przejrzysty pod względem bezpieczeństwa kod powinien używać pełnych żądań do podejmowania decyzji związanych z zabezpieczeniami, a kod krytyczny pod względem zabezpieczeń nie powinien opierać się na kodzie przezroczystym do wykonywania pełnego żądania. |
|
CA2144: Jawny kod nie powinien ładować zestawów z tablic bajtowych |
Przegląd zabezpieczeń dla kodu przezroczystego nie jest tak dokładny jak kodu krytycznego pod względem bezpieczeństwa, ponieważ przezroczysty kod nie może wykonywać czynności wrażliwych pod względem bezpieczeństwa.Zestawy, ładowane z tablicy bajtowej, mogą nie być niezauważone w przezroczystym kodzie, a ta tablica bajtów może zawierać krytyczny albo, co ważniejsze, krytyczny dla bezpieczeństwa kod, który powinien być poddany inspekcji. |
CA2145: Jawne metody nie powinny być dekorowane za pomocą SuppressUnmanagedCodeSecurityAttribute |
Metody, które są oznaczone przez atrybut SuppressUnmanagedCodeSecurityAttribute, mają niejawne żądanie LinkDemand umieszczone na dowolnej metodzie, która je wywołuje.Ten element LinkDemand wymaga, aby kod wywołujący był krytyczny dla bezpieczeństwa.Oznaczanie metody, która używa zabezpieczenia SuppressUnmanagedCodeSecurity poprzez użycie atrybutu SecurityCriticalAttribute, sprawia, że wymóg ten jest bardziej oczywisty dla obiektów wywołujących metodę. |
CA2146: Typy muszą być co najmniej tak ważne, jak ich typy podstawowe i interfejsy |
Ta reguła jest uruchamiana, gdy typ pochodny ma atrybut przezroczystości pod względem zabezpieczeń, który nie jest tak krytyczny, jak jego typ podstawowy lub zaimplementowany interfejs.Tylko typy krytyczne pod względem zabezpieczeń mogą pochodzić od podstawowych typów krytycznych lub implementować interfejsy krytyczne, a tylko typy krytyczne lub krytyczne dla bezpieczeństwa mogą pochodzić od podstawowych typów krytycznych dla bezpieczeństwa lub implementować interfejsy krytyczne dla bezpieczeństwa. |
CA2147: Jawne metody nie mogą używać potwierdzeń zabezpieczeń |
Kod, który jest oznaczony jako SecurityTransparentAttribute, nie ma przyznanego wystarczającego uprawnienia do potwierdzenia. |
Ta reguła jest uruchamiana dla każdej przezroczystej metody, która wywołuje bezpośrednio kod natywny, na przykład przez metodę P/Invoke.Naruszenie tej zasady prowadzi do wyjątku MethodAccessException w poziomie 2 modelu przezroczystości i pełnego żądania dla UnmanagedCode w modelu przezroczystości poziomu 1. |
|
CA2151: Pola typu krytycznego powinny być bezpieczne-krytyczne |
Aby używać typów krytycznych pod względem zabezpieczeń, kod odwołujący się do typu musi być albo krytyczny pod względem zabezpieczeń, albo bezpieczny-krytyczny pod względem zabezpieczeń.Ta zasada obowiązuje nawet w przypadku odwołania pośredniego.Dlatego pole mające zabezpieczenia przezroczyste lub pole bezpieczne-krytyczne pod względem zabezpieczeń jest mylące, ponieważ przezroczysty kod nadal nie będzie mógł uzyskać dostępu do pola. |
CA5122 Deklaracje P/Invoke nie powinny być bezpieczne-krytyczne |
Metody są oznaczone jako SecuritySafeCritical, gdy wykonują operacje zależne od zabezpieczeń, ale mogą być również bezpiecznie używane przez kod przezroczystości.Kod przezroczystości może nigdy bezpośrednio nie wywołać kodu natywnego za pośrednictwem metody P/Invoke.Dlatego oznakowanie metody P/Invoke jako bezpiecznej-krytycznej pod względem zabezpieczeń nie umożliwi jej wywołania kodu przezroczystości i jest mylące dla analizy zabezpieczeń. |