ほとんどのコード アクセス セキュリティ API は旧型式

.NET のほとんどのコード アクセス セキュリティ (CAS) 関連の型は、古いと見なされ、警告が示されるようになりました。 これには、SecurityPermissionAttribute などの CAS 属性、SocketPermission などの CAS アクセス許可オブジェクト、EvidenceBase 派生型、その他のサポート API が含まれます。

変更内容

.NET Framework 2.x から 4.x では、CAS 属性と API がコードの実行過程に影響する可能性があります。これには、CAS 要求スタック ウォークが成功したか失敗したかを必ず確かめることが含まれます。

// In .NET Framework, the attribute causes CAS stack walks
// to terminate successfully when this permission is demanded.
[SocketPermission(SecurityAction.Assert, Host = "contoso.com", Port = "443")]
public void DoSomething()
{
    // open a socket to contoso.com:443
}

.NET Core 2.x から 3.x では、ランタイムによって CAS 属性や CAS API は考慮されません。 ランタイムによってメソッド エントリの属性は無視され、ほとんどのプログラム API に影響はありません。

// The .NET Core runtime ignores the following attribute.
[SocketPermission(SecurityAction.Assert, Host = "contoso.com", Port = "443")]
public void DoSomething()
{
    // open a socket to contoso.com:443
}

また、包括的な API (Assert) へのプログラムによる呼び出しは常に成功しますが、限定的な API (DenyPermitOnly) へのプログラムによる呼び出しによって常に実行時に例外がスローされます (PrincipalPermission は、この規則の例外です。以下の「推奨される操作」セクションを参照してください)。

public void DoAssert()
{
    // The line below has no effect at run time.
    new SocketPermission(PermissionState.Unrestricted).Assert();
}

public void DoDeny()
{
    // The line below throws PlatformNotSupportedException at run time.
    new SocketPermission(PermissionState.Unrestricted).Deny();
}

.NET 5 以降のバージョンでは、ほとんどの CAS 関連 API は古いと見なされ、コンパイル時の警告 SYSLIB0003 が生成されます。

[SocketPermission(SecurityAction.Assert, Host = "contoso.com", Port = "443")] // warning SYSLIB0003
public void DoSomething()
{
    new SocketPermission(PermissionState.Unrestricted).Assert(); // warning SYSLIB0003
    new SocketPermission(PermissionState.Unrestricted).Deny(); // warning SYSLIB0003
}

これは、コンパイル時のみの変更です。 実行時については、以前のバージョンの .NET Core からの変更はありません。 .NET Core 2.x から 3.x で操作を行わないメソッドの場合、.NET 5 以降でも引き続き実行時に操作は行われません。 .NET Core 2.x から 3.x で PlatformNotSupportedException をスローするメソッドの場合、NET 5 以降でも引き続き実行時に PlatformNotSupportedException がスローされます。

変更理由

コード アクセス セキュリティ (CAS) は、サポートされていないレガシ テクノロジです。 CAS を有効にするためのインフラストラクチャは、.NET Framework 2.x から 4.x のみに存在しますが、非推奨であり、サービスやセキュリティの修正プログラムは受け取れません。

CAS の非推奨化により、サポート インフラストラクチャは .NET Core や .NET 5 以降には引き継がれませんでした。 しかし、アプリで .NET Framework と .NET Core に対してクロスコンパイルできるように、API は引き継がれました。 これにより、"フェール オープン" シナリオが発生します。その場合、一部の CAS 関連の API が存在し、呼び出し可能ですが、実行時に操作は行われません。 これにより、ランタイムで CAS 関連の属性またはプログラムによる API 呼び出しが考慮されることを期待するコンポーネントでセキュリティに関する問題が発生する可能性があります。 ランタイムでこれらの属性や API が考慮されないことをより適切に伝えるために、.NET 5.0 ではそれらのほとんどが古いと見なされています。

導入されたバージョン

5.0

  • セキュリティのアクセス許可をアサートする場合は、アクセス許可をアサートする属性または呼び出しを削除します。

    // REMOVE the attribute below.
    [SecurityPermission(SecurityAction.Assert, ControlThread = true)]
    public void DoSomething()
    {
    }
    
    public void DoAssert()
    {
        // REMOVE the line below.
        new SecurityPermission(SecurityPermissionFlag.ControlThread).Assert();
    }
    
  • 任意のアクセス許可を (PermitOnly を使用して) 拒否または制限する場合は、セキュリティ アドバイザーにお問い合わせください。 CAS の属性は .NET 5 以降のランタイムでは考慮されないため、CAS インフラストラクチャに誤って依存してこれらのメソッドへのアクセスを制限してしまうと、お使いのアプリケーションにセキュリティ ホールが発生する可能性があります。

    // REVIEW the attribute below; could indicate security vulnerability.
    [SecurityPermission(SecurityAction.Deny, ControlThread = true)]
    public void DoSomething()
    {
    }
    
    public void DoPermitOnly()
    {
        // REVIEW the line below; could indicate security vulnerability.
        new SecurityPermission(SecurityPermissionFlag.ControlThread).PermitOnly();
    }
    
  • (PrincipalPermission を除く) アクセス許可を要求している場合は、要求を削除します。 すべての要求は実行時に成功します。

    // REMOVE the attribute below; it will always succeed.
    [SecurityPermission(SecurityAction.Demand, ControlThread = true)]
    public void DoSomething()
    {
    }
    
    public void DoDemand()
    {
        // REMOVE the line below; it will always succeed.
        new SecurityPermission(SecurityPermissionFlag.ControlThread).Demand();
    }
    
  • PrincipalPermission を要求する場合は、「PrincipalPermissionAttribute は古いエラーです」のガイダンスを参照してください。 このガイダンスは、PrincipalPermissionPrincipalPermissionAttribute の両方に適用されます。

  • これらの警告を確実に無効にする (これは推奨されません) 必要がある場合は、コードで SYSLIB0003 警告を抑制することができます。

    #pragma warning disable SYSLIB0003 // disable the warning
    [SecurityPermission(SecurityAction.Demand, ControlThread = true)]
    #pragma warning restore SYSLIB0003 // re-enable the warning
    public void DoSomething()
    {
    }
    
    public void DoDemand()
    {
    #pragma warning disable SYSLIB0003 // disable the warning
        new SecurityPermission(SecurityPermissionFlag.ControlThread).Demand();
    #pragma warning restore SYSLIB0003 // re-enable the warning
    }
    

    また、プロジェクト ファイルで警告を抑制することもできます。 そのようにすると、プロジェクト内のすべてのソース ファイルで警告が無効になります。

    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
        <TargetFramework>net5.0</TargetFramework>
        <!-- NoWarn below suppresses SYSLIB0003 project-wide -->
        <NoWarn>$(NoWarn);SYSLIB0003</NoWarn>
      </PropertyGroup>
    </Project>
    

    注意

    SYSLIB0003 を抑制すると、CAS 関連のものが古いという警告のみが無効になります。 他の警告が無効にされたり、.NET 5 以降のランタイムの動作が変更されたりすることはありません。

  • セキュリティ

影響を受ける API