La maggior parte delle API di sicurezza dall'accesso di codice sono obsolete

La maggior parte dei tipi correlati alla sicurezza dall'accesso di codice in .NET ora sono obsoleti come avviso. Sono inclusi attributi della sicurezza dell’accesso di codice, come SecurityPermissionAttribute, oggetti autorizzazioni sicurezza dell’accesso di codice, come SocketPermission, tipi derivati da EvidenceBase e altre API di supporto.

Descrizione delle modifiche

In .NET Framework 2.x - 4.x, gli attributi e le API di sicurezza dell’accesso di codice possono influenzare il corso dell'esecuzione del codice, assicurando anche che lo stack di richieste di sicurezza dell’accesso di codice abbia esito positivo o negativo.

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

In .NET Core 2.x - 3.x, il runtime non rispetta gli attributi o le API di sicurezza dell’accesso di codice. Il runtime ignora gli attributi sulla voce del metodo e la maggior parte delle API a livello di codice non ha alcun effetto.

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

Inoltre, le chiamate a livello di codice alle API espansive (Assert) hanno sempre esito positivo, mentre le chiamate a livello di codice alle API restrittive (Deny, PermitOnly) generano sempre un'eccezione in fase di esecuzione. (PrincipalPermission è un'eccezione a questa regola. Vedi la sezione Azione consigliata di seguito.)

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

In .NET 5 e versioni successive la maggior parte delle API correlate alla sicurezza dell’accesso di codice sono obsolete e generano un avviso SYSLIB0003 in fase di compilazione.

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

Questa modifica riguarda solo la fase di compilazione. Non è stata apportata alcuna modifica in fase di esecuzione rispetto alle versioni precedenti di .NET Core. I metodi che non eseguono alcuna operazione in .NET Core 2.x - 3.x continueranno a non eseguire alcuna operazione in fase di esecuzione in .NET 5 e versioni successive. I metodi che generano PlatformNotSupportedException in .NET Core 2.x - 3.x continueranno a generare un PlatformNotSupportedException in fase di esecuzione in .NET 5 e versioni successive.

Motivo della modifica

La sicurezza dall'accesso di codice (CAS) è una tecnologia legacy non supportata. L'infrastruttura per abilitare la CAS esiste solo in .NET Framework 2.x - 4.x, ma è deprecata e non riceve aggiornamenti relativi a manutenzione e sicurezza.

A causa della deprecazione della sicurezza dell’accesso di codice, l'infrastruttura di supporto non è stata trasferita a .NET Core o a .NET 5+. Tuttavia, sono state trasferite le API in modo che le app possano eseguire la compilazione su .NET Framework e .NET Core. Ciò ha portato a scenari di "apertura non riuscita", in cui esistono alcune API relative alla sicurezza dell’accesso di codice che sono chiamabili, ma che non eseguono alcuna azione in fase di esecuzione. Questo può causare problemi di sicurezza per i componenti che prevedono che il runtime rispetti gli attributi correlati alla sicurezza dell’accesso di codice o le chiamate API a livello di codice. Per comunicare meglio che il runtime non rispetta questi attributi o queste API, la maggior parte di esse è obsoleta in .NET 5.0.

Versione introdotta

5.0

  • Se affermi un'autorizzazione di sicurezza, rimuovi l'attributo o la chiamata che afferma l'autorizzazione.

    // REMOVE the attribute below.
    [SecurityPermission(SecurityAction.Assert, ControlThread = true)]
    public void DoSomething()
    {
    }
    
    public void DoAssert()
    {
        // REMOVE the line below.
        new SecurityPermission(SecurityPermissionFlag.ControlThread).Assert();
    }
    
  • Se neghi o limiti (tramite PermitOnly) qualsiasi autorizzazione, contatta l'assistente alla sicurezza. Poiché gli attributi CAS non vengono rispettati dal runtime .NET 5+, l'applicazione potrebbe avere un problema di sicurezza, se si basa erroneamente sull'infrastruttura CAS per limitare l'accesso a questi metodi.

    // 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();
    }
    
  • Se richiedi un'autorizzazione (ad eccezione di PrincipalPermission), rimuovi la richiesta. Tutte le richieste avranno esito positivo in fase di esecuzione.

    // 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();
    }
    
  • Se richiedi PrincipalPermission, consulta le indicazioni di PrincipalPermissionAttribute è obsoleto come errore. Queste indicazioni si applicano sia per PrincipalPermission che per PrincipalPermissionAttribute.

  • Se devi assolutamente disabilitare questi avvisi (non consigliato), puoi eliminare l'avviso SYSLIB0003 nel codice.

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

    È anche possibile eliminare l'avviso nel file di progetto. In questo modo l'avviso viene disabilitato per tutti i file di origine all'interno del progetto.

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

    Nota

    L'eliminazione di SYSLIB0003 disabilita solo gli avvisi di obsolescenza relativi alla sicurezza dell’accesso di codice. Non disabilita altri avvisi né modifica il comportamento del runtime .NET 5+.

  • Sicurezza

API interessate