大部分的代碼啟用安全性 Api 已淘汰

在 .NET 中,大部分的代碼啟用安全性 (CAS) 相關類型現在已淘汰為警告。 這包括 CAS 屬性(例如 SecurityPermissionAttribute )、衍生型別和其他支援的 api 等 cas 權限物件 SocketPermissionEvidenceBase

變更描述

在 .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 中,執行時間不會接受 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 中不執行任何作業的方法,在 .NET 5 和更新版本中的執行時間不會繼續執行任何作業。 在 .net Core 2.x-3.x 中擲 PlatformNotSupportedException 回的 PlatformNotSupportedException 方法會在執行時間繼續于 .net 5 和更新版本中擲回。

變更的原因

(CAS) 的代碼啟用安全性 是一種不受支援的舊版技術。 啟用 ca 的基礎結構只存在於 .NET Framework 2.x-4.x 中,但已被取代且未收到服務或安全性修正程式。

由於 CAS 的淘汰,支援的 基礎結構不會轉送給 .Net Core 或 .net 5 +。 不過,api 已向前推進,讓應用程式可以針對 .NET Framework 和 .net Core 進行交叉編譯。 這會導致「開啟開啟」案例,其中某些 CAS 相關的 Api 存在且可供呼叫,但在執行時間不會執行任何動作。 這可能會對預期執行時間接受 CAS 相關屬性或程式設計 API 呼叫的元件產生安全性問題。 為了更妥善地溝通執行時間不遵守這些屬性或 Api,我們已在 .NET 5.0 中淘汰大部分的屬性或 Api。

導入的版本

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 ,請洽詢您的安全性顧問。 由於「.NET 5 + 執行時間」不會接受 CAS 屬性,因此如果您的應用程式不正確依賴 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 相關的 obsoletion 警告。 它不會停用任何其他警告或變更 .NET 5 + 執行時間的行為。

  • 安全性

受影響的 API