CA2151: Pola typu krytycznego powinny być bezpieczne-krytyczne
TypeName |
|
CheckId |
CA2151 |
Kategoria |
Microsoft.Security |
Zmiana kluczowa |
Kluczowa |
Przyczyna
Pole przezroczyste zabezpieczeń lub bezpieczne-krytyczne jest zadeklarowane.Jego typ jest określony jako krytyczny pod względem zabezpieczeń.Na przykład:
[assembly: AllowPartiallyTrustedCallers]
[SecurityCritical]
class Type1 { } // Security Critical type
class Type2 // Security transparent type
{
Type1 m_field; // CA2151, transparent field of critical type
}
W tym przykładzie m_field jest polem przezroczystym zabezpieczeń o typie krytycznym pod względem zabezpieczeń.
Opis reguły
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.Na przykład w przypadku odwołania do pola przezroczystego, które ma typ krytyczny, kod musi być krytyczny pod względem zabezpieczeń lub bezpieczny pod względem zabezpieczeń.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.
Jak naprawić naruszenia
Aby naprawić naruszenie tej zasady, należy zaznaczyć pole z atrybutem SecurityCriticalAttribute lub ustawić typ, do którego odwołuje się pole przezroczyste pod względem zabezpieczeń lub bezpieczne-krytyczne.
// Fix 1: Make the referencing field security critical
[assembly: AllowPartiallyTrustedCallers]
[SecurityCritical]
class Type1 { } // Security Critical type
class Type2 // Security transparent type
{
[SecurityCritical]
Type1 m_field; // Fixed: critical type, critical field
}
// Fix 2: Make the referencing field security critical
[assembly: AllowPartiallyTrustedCallers]
class Type1 { } // Type1 is now transparent
class Type2 // Security transparent type
{
[SecurityCritical]
Type1 m_field; // Fixed: critical type, critical field
}
Kiedy pominąć ostrzeżenia
Nie pomijaj ostrzeżeń dla tej reguły.
Kod
using System;
using System.Runtime.InteropServices;
using System.Security;
namespace TransparencyWarningsDemo
{
public class SafeNativeMethods
{
// CA2145 violation - transparent method marked SuppressUnmanagedCodeSecurity. This should be fixed by
// marking this method SecurityCritical.
[DllImport("kernel32.dll", SetLastError = true)]
[SuppressUnmanagedCodeSecurity]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool Beep(uint dwFreq, uint dwDuration);
}
}