Większość interfejsów API zabezpieczeń dostępu do kodu jest przestarzała

Większość typów związanych z dostępem do kodu (CAS) na platformie .NET jest teraz przestarzała jako ostrzeżenie. Obejmuje to atrybuty CAS, takie jak , obiekty uprawnień CAS, takie jak SecurityPermissionAttributeSocketPermission, EvidenceBasetypy pochodne i inne pomocnicze interfejsy API.

Opis zmiany

W programie .NET Framework 2.x — 4.x atrybuty cas i interfejsy API mogą mieć wpływ na przebieg wykonywania kodu, w tym zapewnienie, że stos CAS-demand zakończy się powodzeniem lub niepowodzeniem.

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

W programie .NET Core 2.x — 3.x środowisko uruchomieniowe nie honoruje atrybutów CAS ani interfejsów API CAS. Środowisko uruchomieniowe ignoruje atrybuty we wpisie metody, a większość programowych interfejsów API nie ma wpływu.

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

Ponadto programowe wywołania ekspansywnych interfejsów API (Assert) zawsze kończą się powodzeniem, podczas gdy programowe wywołania restrykcyjnych interfejsów API (Deny, PermitOnly) zawsze zgłaszają wyjątek w czasie wykonywania. (PrincipalPermission jest wyjątkiem od tej reguły. Zobacz sekcję Zalecana akcja poniżej.

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

W przypadku platformy .NET 5 i nowszych wersji większość interfejsów API związanych z usługą CAS jest przestarzała i generuje ostrzeżenie dotyczące SYSLIB0003czasu kompilacji.

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

Jest to zmiana tylko w czasie kompilacji. Nie ma zmian w czasie wykonywania z poprzednich wersji platformy .NET Core. Metody, które nie wykonują żadnej operacji na platformie .NET Core 2.x — 3.x, nadal nie będą wykonywać żadnej operacji w czasie wykonywania na platformie .NET 5 i nowszych wersjach. Metody zgłaszane PlatformNotSupportedException na platformie .NET Core 2.x — 3.x będą nadal zgłaszane PlatformNotSupportedException w czasie wykonywania na platformie .NET 5 lub nowszym.

Przyczyna wprowadzenia zmiany

Zabezpieczenia dostępu kodu (CAS) to nieobsługiwana starsza technologia. Infrastruktura umożliwiająca obsługę cas istnieje tylko w programie .NET Framework 2.x — 4.x, ale jest przestarzała i nie otrzymuje poprawek obsługi lub zabezpieczeń.

Ze względu na wycofanie usługi CAS infrastruktura pomocnicza nie została przekazana do platformy .NET Core lub .NET 5+. Jednak interfejsy API zostały przedstawione w taki sposób, aby aplikacje mogły kompilować krzyżowo na platformach .NET Framework i .NET Core. Doprowadziło to do scenariuszy "otwierania w trybie fail open", w których istnieją niektóre interfejsy API związane z usługą CAS i są wywoływane, ale nie wykonują żadnych akcji w czasie wykonywania. Może to prowadzić do problemów z zabezpieczeniami składników, które oczekują, że środowisko uruchomieniowe będzie honorować atrybuty związane z usługą CAS lub wywołania programowe interfejsu API. Aby lepiej komunikować się, że środowisko uruchomieniowe nie szanuje tych atrybutów ani interfejsów API, większość z nich w programie .NET 5.0 została przestarzała.

Wprowadzona wersja

5,0

  • Jeśli potwierdzasz jakiekolwiek uprawnienia zabezpieczeń, usuń atrybut lub wywołanie, które potwierdza uprawnienie.

    // REMOVE the attribute below.
    [SecurityPermission(SecurityAction.Assert, ControlThread = true)]
    public void DoSomething()
    {
    }
    
    public void DoAssert()
    {
        // REMOVE the line below.
        new SecurityPermission(SecurityPermissionFlag.ControlThread).Assert();
    }
    
  • Jeśli odmawiasz lub ograniczasz (za pośrednictwem PermitOnly) wszelkich uprawnień, skontaktuj się z doradcą ds. zabezpieczeń. Ponieważ atrybuty CAS nie są honorowane przez środowisko uruchomieniowe platformy .NET 5+, aplikacja może mieć dziurę zabezpieczeń, jeśli nieprawidłowo korzysta z infrastruktury CAS w celu ograniczenia dostępu do tych metod.

    // 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();
    }
    
  • Jeśli domagasz się wszelkich uprawnień (z wyjątkiem PrincipalPermission), usuń żądanie. Wszystkie wymagania zostaną wykonane w czasie wykonywania.

    // 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();
    }
    
  • Jeśli domagasz PrincipalPermissionsię polecenia , zapoznaj się ze wskazówkami dotyczącymi atrybutu PrincipalPermissionAttribute jest przestarzały jako błąd. Te wskazówki dotyczą zarówno systemów , jak PrincipalPermission i PrincipalPermissionAttribute.

  • Jeśli absolutnie musisz wyłączyć te ostrzeżenia (co nie jest zalecane), możesz pominąć SYSLIB0003 ostrzeżenie w kodzie.

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

    Możesz również pominąć ostrzeżenie w pliku projektu. Spowoduje to wyłączenie ostrzeżenia dla wszystkich plików źródłowych w projekcie.

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

    Uwaga

    Pomijanie SYSLIB0003 powoduje wyłączenie tylko ostrzeżeń dotyczących obsoletionu związanych z usługą CAS. Nie wyłącza żadnych innych ostrzeżeń ani nie zmienia zachowania środowiska uruchomieniowego platformy .NET 5+.

  • Zabezpieczenia

Dotyczy interfejsów API