Dela via


De flesta API:er för kodåtkomstsäkerhet är föråldrade

De flesta kodåtkomstsäkerhetstyper (CAS) i .NET är nu föråldrade som varning. Detta inkluderar CAS-attribut, till exempel SecurityPermissionAttribute, CAS-behörighetsobjekt, till exempel SocketPermission, EvidenceBase-härledda typer och andra stödjande API:er.

Ändra beskrivning

I .NET Framework 2.x – 4.x kan CAS-attribut och API:er påverka körningen av kod, inklusive att se till att CAS-begärandestacken lyckas eller misslyckas.

// 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
}

I .NET Core 2.x – 3.x följer inte körningen CAS-attribut eller CAS-API:er. Körningen ignorerar attribut vid metodinmatning och de flesta programmatiska API:er har ingen effekt.

// 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
}

Dessutom lyckas programmatiska anrop till expansiva API:er (Assert) alltid, medan programmatiska anrop till restriktiva API:er (Deny, PermitOnly) alltid utlöser ett undantag vid körning. (PrincipalPermission är ett undantag från den här regeln. Se avsnittet Rekommenderad åtgärd nedan.)

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();
}

I .NET 5 och senare versioner är de flesta CAS-relaterade API:er föråldrade och skapar kompileringstidsvarning 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
}

Det här är en kompileringstidsändring. Det finns ingen körningsändring från tidigare versioner av .NET Core. Metoder som inte utför någon åtgärd i .NET Core 2.x – 3.x fortsätter inte att utföra någon åtgärd vid körning i .NET 5 och senare. Metoder som genererar PlatformNotSupportedException .NET Core 2.x – 3.x fortsätter att kasta en PlatformNotSupportedException vid körning i .NET 5 och senare.

Orsak till ändringen

Kodåtkomstsäkerhet (CAS) är en äldre teknik som inte stöds. Infrastrukturen för att aktivera CAS finns bara i .NET Framework 2.x – 4.x, men är inaktuell och får inte service- eller säkerhetskorrigeringar.

På grund av CAS:s utfasning vidarebefordrades inte den stödjande infrastrukturen till .NET Core eller .NET 5+. API:erna har dock vidarebefordrats så att appar kan korskompileras mot .NET Framework och .NET Core. Detta ledde till "fail open"-scenarier, där vissa CAS-relaterade API:er finns och är anropsbara men inte utför någon åtgärd vid körning. Detta kan leda till säkerhetsproblem för komponenter som förväntar sig att körningen ska uppfylla CAS-relaterade attribut eller programmatiska API-anrop. För att bättre kommunicera att körningen inte respekterar dessa attribut eller API:er har vi föråldrat de flesta av dem i .NET 5.0.

Version introducerad

5,0

  • Om du hävdar någon säkerhetsbehörighet tar du bort attributet eller anropet som bekräftar behörigheten.

    // REMOVE the attribute below.
    [SecurityPermission(SecurityAction.Assert, ControlThread = true)]
    public void DoSomething()
    {
    }
    
    public void DoAssert()
    {
        // REMOVE the line below.
        new SecurityPermission(SecurityPermissionFlag.ControlThread).Assert();
    }
    
  • Om du nekar eller begränsar (via PermitOnly) någon behörighet kontaktar du din säkerhetsrådgivare. Eftersom CAS-attribut inte uppfylls av .NET 5+-körningen kan ditt program ha ett säkerhetshål om det felaktigt förlitar sig på CAS-infrastrukturen för att begränsa åtkomsten till dessa metoder.

    // 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();
    }
    
  • Om du kräver någon behörighet (förutom PrincipalPermission) tar du bort efterfrågan. Alla krav kommer att lyckas vid körning.

    // 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();
    }
    
  • Om du kräver PrincipalPermissionkan du läsa vägledningen för PrincipalPermissionAttribute är föråldrad som ett fel. Den vägledningen gäller både PrincipalPermission och PrincipalPermissionAttribute.

  • Om du absolut måste inaktivera dessa varningar (vilket inte rekommenderas) kan du ignorera varningen SYSLIB0003 i koden.

    #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
    }
    

    Du kan också ignorera varningen i projektfilen. Om du gör det inaktiveras varningen för alla källfiler i projektet.

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

    Kommentar

    Om du utelämnar SYSLIB0003 inaktiveras endast CAS-relaterade obsoletionsvarningar. Den inaktiverar inte några andra varningar eller ändrar beteendet för .NET 5+-körningen.

  • Säkerhet

Berörda API:er