CS.SV.TRANSP.ASSERT

透過的なメソッドはセキュリティアサートを使用しない場合があります。

この規則は、100% 透過的または透過的/クリティカルが混在するアセンブリ内のすべてのメソッドと型を解析し、Assert の宣言的または命令的な使用法にフラグを立てます。実行時に、透過的なコードから Assert を呼び出すと、InvalidOperationException がスローされるようになります。

これは、100% 透過的な両方のアセンブリで発生する可能性があり、またメソッドまたは型が透過的に宣言されているが、宣言的または命令的な Assert が含まれている、透過的/クリティカルが混在するアセンブリでも発生する可能性があります。.NET Framework 2.0 では、透過性という名前の機能が導入されました。個々のメソッド、フィールド、インターフェイス、クラス、および型は、透過的またはクリティカルのどちらかである可能性があります。

透過的なコードでは、セキュリティ権限を昇格することは許可されていません。このため、付与または要求されたどの許可も、呼び出し元またはホストアプリケーションドメインに、コードを介して自動的に渡されます。昇格の例には、Assert、LinkDemand、SuppressUnmanagedCode、および安全でないコードが含まれます。

脆弱コード例

コピー
  using System;
  using System.Security;
  using System.Security.Permissions;
  
  namespace TransparencyWarningsDemo
  {
  
      public class TransparentMethodsUseSecurityAssertsClass
     {
         // CA2147 violation - transparent code using a security assert declaratively.  This can be fixed by 
         // any of:  
         //   1.Make DeclarativeAssert critical 
         //   2.Make DeclarativeAssert safe critical 
         //   3.Remove the assert attribute
         [PermissionSet(SecurityAction.Assert, Unrestricted = true)]
         public void DeclarativeAssert()
         {
         }
 
         public void ImperativeAssert()
         {
             // CA2147 violation - transparent code using a security assert imperatively.  This can be fixed by 
             // any of:  
             //   1.Make ImperativeAssert critical 
             //   2.Make ImperativeAssert safe critical 
             //   3.Remove the assert call 
             new PermissionSet(PermissionState.Unrestricted).Assert();
         }
     }
 }

SecurityTestClass が透過的である場合、Assert メソッドが InvalidOperationException をスローすると、このコードは失敗します。

修正コード例

コピー
  using System;
  using System.Security.Permissions;
  
  namespace SecurityTestClassLibrary
  {
      public class SecurityTestClass
      {
          [System.Security.SecurityCritical]
         void SecurityCriticalMethod()
         {
             new FileIOPermission(PermissionState.Unrestricted).Assert();
 
             // perform I/O operations under Assert
         }
     }
 }

1 つのオプションは、例が示す SecurityTransparentMethod メソッドをコードレビューすることです。そしてメソッドが昇格に対して安全であると見なされる場合は、SecurityTransparentMethod をセキュアクリティカルでマークします。これには、Assert の下のメソッド内で発生するすべての呼び出しと共に、詳細で完全な、エラーのないセキュリティ監査がメソッドで実行されることが必要です。

もう 1 つのオプションは、Assert をコードから削除し、後続のファイル I/O 許可要求に SecurityTransparentMethod を超えて呼び出し元にフローさせることです。これにより、セキュリティチェックが有効になります。この場合、許可要求が呼び出し元やアプリケーションドメインにフローするため、セキュリティ監査は必要ありません。許可要求は、セキュリティポリシー、ホスティング環境、およびコードソースの許可付与によって厳密に制御されます。