CA2140: Transparent code must not reference security critical items
TypeName | TransparentMethodsMustNotReferenceCriticalCode |
CheckId | CA2140 |
Category | Microsoft.Security |
Breaking Change | Breaking |
A transparent method:
handles a security critical security exception type
has a parameter that is marked as a security critical type
has a generic parameter with a security critical constraints
has a local variable of a security critical type
references a type that is marked as security critical
calls a method that is marked as security critical
references a field that is marked as security critical
returns a type that is marked as security critical
A code element that is marked with the SecurityCriticalAttribute attribute is security critical. A transparent method cannot use a security critical element. If a transparent type attempts to use a security critical type a TypeAccessException, MethodAccessException , or FieldAccessException is raised.
To fix a violation of this rule, do one of the following:
Mark the code element that uses the security critical code with the SecurityCriticalAttribute attribute
- or -
Remove the SecurityCriticalAttribute attribute from the code elements that are marked as security critical and instead mark them with the SecuritySafeCriticalAttribute or SecurityTransparentAttribute attribute.
In the following examples, a transparent method attempts to reference a security critical generic collection, a security critical field, and a security critical method.
using System; using System.Security; using System.Collections.Generic; namespace TransparencyWarningsDemo { [SecurityCritical] public class SecurityCriticalClass { } public class TransparentMethodsReferenceCriticalCodeClass { [SecurityCritical] private object m_criticalField; [SecurityCritical] private void CriticalMethod() { } public void TransparentMethod() { // CA2140 violation - transparent method accessing a critical type. This can be fixed by any of: // 1. Make TransparentMethod critical // 2. Make TransparentMethod safe critical // 3. Make CriticalClass safe critical // 4. Make CriticalClass transparent List<SecurityCriticalClass> l = new List<SecurityCriticalClass>(); // CA2140 violation - transparent method accessing a critical field. This can be fixed by any of: // 1. Make TransparentMethod critical // 2. Make TransparentMethod safe critical // 3. Make m_criticalField safe critical // 4. Make m_criticalField transparent m_criticalField = l; // CA2140 violation - transparent method accessing a critical method. This can be fixed by any of: // 1. Make TransparentMethod critical // 2. Make TransparentMethod safe critical // 3. Make CriticalMethod safe critical // 4. Make CriticalMethod transparent CriticalMethod(); } } }