Share via


A maioria das APIs de segurança de acesso do código estão obsoletas

A maioria dos tipos relacionados à CAS (segurança de acesso do código) no .NET agora está obsoleta como aviso. Isso inclui atributos de CAS como SecurityPermissionAttribute, objetos de permissão de CA, como SocketPermission, tipos derivados de EvidenceBase e outras APIs com suporte.

Descrição das alterações

No .NET Framework 2.x – 4.x, os atributos e as APIs de CAS podem influenciar o curso da execução do código, incluindo garantir que os andamentos da pilha de demanda de CAS tenham êxito ou falhem.

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

No .NET Core 2.x – 3.x, o runtime não honra atributos de CAS nem APIs de CAS. O runtime ignora os atributos na entrada do método e a maioria das APIs programáticas não tem efeito.

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

Além disso, as chamadas programáticas para APIs expansivas (Assert) sempre têm êxito, enquanto as chamadas programáticas para APIs restritivas (Deny, PermitOnly) sempre geram uma exceção em tempo de execução. (PrincipalPermission é uma exceção a essa regra. Confira a seção Ação recomendada abaixo).

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

No .NET 5 e em versões posteriores, a maioria das APIs relacionadas a CAS são obsoletas e produzem aviso de tempo de compilação 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
}

Essa é uma alteração somente de tempo de compilação. Não há nenhuma alteração em tempo de execução das versões anteriores do .NET Core. Os métodos que não executam nenhuma operação no .NET Core 2.x – 3.x continuarão a não executar nenhuma operação em tempo de execução no .NET 5 e posteriores. Os métodos que geram PlatformNotSupportedException no .NET Core 2.x – 3.x continuarão a gerar uma PlatformNotSupportedException em tempo de executar no .NET 5 e posteriores.

Motivo da alteração

A CAS (segurança de acesso do código) é uma tecnologia herdada sem suporte. A infraestrutura para habilitar a CAS existe apenas no .NET Framework 2.x – 4.x, mas foi preterida e não recebe correções de segurança nem de manutenção.

Devido ao preterimento da CAS, a infraestrutura de suporte não foi passada para o .NET Core nem para o .NET 5 e superiores. No entanto, as APIs foram passadas para que os aplicativos pudessem ser compilados entre o .NET Framework e o .NET Core. Isso causou cenários de "abertura com falha", em que algumas APIs relacionadas a CAS existem e podem ser chamadas, mas não executam nenhuma ação em tempo de execução. Isso pode levar a problemas de segurança para componentes que esperam que o runtime honre os atributos relacionados à CAS ou chamadas programáticas à API. Para comunicar melhor que o runtime não respeita esses atributos ou APIs, a maioria deles ficou obsoleta no .NET 5.0.

Versão introduzida

5,0

  • Se você estiver afirmando qualquer permissão de segurança, remova o atributo ou a chamada que declara a permissão.

    // 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 você estiver negando ou restringindo (por PermitOnly) qualquer permissão, entre em contato com o assistente de segurança. Como os atributos de CAS não são respeitados pelo runtime do .NET 5+, o aplicativo poderá ter uma falha de segurança se depender incorretamente da infraestrutura CAS para restringir o acesso a esses métodos.

    // 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 você estiver exigindo qualquer permissão (exceto PrincipalPermission), remova a demanda. Todas as demandas serão bem-sucedidas em tempo de execução.

    // 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 você estiver exigindo PrincipalPermission, consulte as diretrizes de PrincipalPermissionAttribute está obsoleto como erro. Essas diretrizes se aplicam a PrincipalPermission e PrincipalPermissionAttribute.

  • Se você precisar desabilitar totalmente esses avisos (o que não é recomendado), suprima o aviso SYSLIB0003 no código.

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

    Você também pode suprimir o aviso no arquivo de projeto. Isso desabilita o aviso para todos os arquivos de origem dentro do projeto.

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

    Observação

    A supressão de SYSLIB0003 desabilita apenas os avisos de obsolescência relacionados à CAS. Ela não desabilita outros avisos nem altera o comportamento do runtime do .NET 5+.

  • Segurança

APIs afetadas