更新 : 2007 年 11 月
TypeName |
SecurityTransparentCodeShouldNotReferenceNonpublicSecurityCriticalCode |
CheckId |
CA2129 |
カテゴリ |
Microsoft.Security |
互換性に影響する変更点 |
あり |
原因
SecurityTransparentAttribute でマークされたメソッドが SecurityCritical とマークされたパブリックでないメンバを呼び出しています。SecurityTransparent はメソッドの既定の指定です。
規則の説明
.NET Framework 2.0 には、透過性と呼ばれる機能が導入されました。メソッド、フィールド、インターフェイス、クラス、および型を個別的に透過的またはクリティカルとすることができます。
透過的なコードでは、セキュリティ特権を昇格することはできません。したがって、透過的なコードに付与または要求されるアクセス許可は、自動的にコードを通じて呼び出し元またはホスト AppDomain に渡されます。昇格の例として、Assert、LinkDemand、SuppressUnmanagedCode、アンセーフ コードなどがあります。
コードを透過的とクリティカルに分類する目的は、セキュリティ監査プロセスを容易にすることです。通常、監査は公開されているために悪意のあるユーザーや信頼できないユーザーが利用する可能性のあるパブリック エントリ ポイントで実行します。アセンブリの複数の小さいセクションをクリティカルとマークすることにより、セキュリティ監査の対象をパブリック エントリ ポイントと特権を昇格するクリティカル セクションに限定することができます。ただし、監査の正確性と完全性を保証するためには、透過的なコードとクリティカルなコードの境界をできるだけ明確に示す必要があります。また、透過的なコードにおいて内部のセキュリティ クリティカルなコードの呼び出しを可能にすることにより、透過的なコードに対してより厳密な監査を要求することもできます。
実行時には、共通言語ランタイムの JIT (Just-In-Time) コンパイラが透過的なコードによるパブリックでないセキュリティ クリティカルなコードの参照または呼び出しがないかどうかをチェックします。透過的なコードからパブリックでないセキュリティ クリティカルなコードを呼び出している場合は、MethodAccessException などの例外がスローされます。この例外は、クラスが別のクラスのプライベート メンバにアクセスする場合と同じように処理されます。
このコード分析規則では、透過的なコードとクリティカルなコードが混在するアセンブリ内のすべてのメソッドと型が分析されます。この規則では、透過的なコードからパブリックでないセキュリティ クリティカルなコードへの呼び出しのうち SecurityTreatAsSafe とマークされていないものにもフラグが設定されます。
違反の修正方法
この問題を解決するには、パブリックでないセキュリティ クリティカルなコードを呼び出すコードを SecurityCritical とマークするか、対象となるメソッドまたは型を SecurityTreatAsSafe とマークします。これにより、コードがパブリック セーフで不正な目的での使用について監査済みと見なされます。
警告を抑制する状況
この規則によるメッセージは抑制しないでください。
使用例
次のコードでは、SecondSecurityMethod がプライベート メソッドで、SecurityCritical とマークされているため、処理が失敗します。セキュリティ問題の例として、SecondSecurityMethod 内の Assert が特権のあるアクションや FirstSecurityMethod にフローする呼び出しでフル アクセス要求を阻止し、セキュリティ チェックが呼び出し元でのみ実行されることがあります。
using System;
using System.Security.Permissions;
namespace SecurityTestClassLibrary
{
public class SecurityTestClass
{
// SecurityTransparent
public void FirstSecurityMethod()
{
SecondSecurityMethod();
}
[System.Security.SecurityCritical]
private void SecondSecurityMethod()
{
// Assert permissions
// do privileged actions, such as method call-outs
}
}
}
透過的なコードとクリティカルなコードの境界が示されていない場合、FirstSecurityMethod は SecondSecurityMethod のすべての処理をセキュリティ チェックなしで実行できます。
1 つの方法として、メソッドのコード レビューを行い、昇格や悪意のある攻撃に対して安全であると判断できる場合に、そのメソッドを SecurityTreatAsSafe とマークします。
using System;
using System.Security.Permissions;
namespace SecurityTestClassLibrary
{
public class SecurityTestClass
{
// SecurityTransparent
public void FirstSecurityMethod()
{
SecondSecurityMethod();
}
[System.Security.SecurityTreatAsSafe]
[System.Security.SecurityCritical]
private void SecondSecurityMethod()
{
// Assert permissions
// do privileged actions, such as method call-outs
}
}
}
また、Method1 も Critical にするという方法もあります。この方法では、アセンブリのクリティカル カーネルが拡張され、セキュリティ監査のサイズが拡大します。また、適切な脅威のモデリングとコード フロー分析の実行も保証されます。
using System;
using System.Security.Permissions;
namespace SecurityTestClassLibrary
{
public class SecurityTestClass
{
[System.Security.SecurityCritical]
public void FirstSecurityMethod()
{
SecondSecurityMethod();
}
[System.Security.SecurityCritical]
private void SecondSecurityMethod()
{
// Assert permissions
// do privileged actions, such as method call-outs
}
}
}