Die meisten Codezugriffssicherheit-APIs sind veraltet

Die meisten CAS-bezogenen Typen (Codezugriffssicherheit) in .NET sind mittlerweile als Warnung veraltet. Dies gilt auch für CAS-Attribute wie SecurityPermissionAttribute, CAS-Berechtigungsobjekte wie SocketPermission, von EvidenceBase abgeleitete Typen und weitere unterstützende APIs.

Änderungsbeschreibung

In .NET Framework 2.x bis 4.x können CAS-Attribute und -APIs den Kurs der Codeausführung beeinflussen. Dies betrifft auch die Sicherstellung, dass Stackwalks in Bezug auf die Anforderungen für die Codezugriffssicherheit erfolgreich sind oder ein Fehler auftritt.

// 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 bis 3.x berücksichtigt die Runtime keine CAS-Attribute oder -APIs. Die Runtime ignoriert Attribute für Methodeneinträge, und die meisten programmgesteuerten APIs haben keine Auswirkungen.

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

Außerdem sind programmgesteuerte Aufrufe von expansiven APIs (Assert) immer erfolgreich, während programmgesteuerte Aufrufe von restriktiven APIs (Deny und PermitOnly) zur Laufzeit immer eine Ausnahme auslösen. (PrincipalPermission ist eine Ausnahme von dieser Regel. Weitere Informationen finden Sie weiter unten im Abschnitt Empfohlene Aktion.)

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 und höheren Versionen sind die meisten CAS-bezogenen APIs veraltet und lösen zur Kompilierzeit die Warnung SYSLIB0003 aus.

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

Dies ist eine Änderung, die nur die Kompilierzeit betrifft. Hinsichtlich der Laufzeit gibt es keine Änderung im Vergleich zu früheren Versionen von .NET Core. Methoden, die keinen Vorgang in .NET Core 2.x bis 3.x ausführen, führen in .NET 5 und höheren Versionen zur Laufzeit auch weiterhin keinen Vorgang aus. Methoden, die in .NET Core 2.x bis 3.x PlatformNotSupportedException auslösen, lösen in .NET 5 und höheren Versionen zur Laufzeit auch weiterhin PlatformNotSupportedException aus.

Grund für die Änderung

Die Codezugriffssicherheit (Code Access Security, CAS) ist eine nicht unterstützte Legacytechnologie. Die für die CAS-Aktivierung erforderliche Infrastruktur ist zwar nur in .NET Framework 2.x bis 4.x enthalten, ist aber veraltet, und es sind keine Wartungs- oder Sicherheitsfixes dafür vorgesehen.

Da die Codezugriffssicherheit als veraltet markiert ist, wurde die unterstützende Infrastruktur nicht in .NET Core oder .NET 5 oder höher übertragen. Die APIs wurden jedoch übertragen, sodass Apps für .NET Framework und .NET Core übergreifend kompiliert werden konnten. Dies führte zu „Fail open“-Szenarios, in denen einige CAS-bezogene APIs vorhanden sind und aufgerufen werden könnten, zur Laufzeit aber keine Aktion ausführen. Eine Folge davon können Sicherheitsprobleme bei Komponenten sein, die erwarten, dass die Runtime CAS-bezogene Attribute oder programmgesteuerte API-Aufrufe berücksichtigt. Ein Großteil davon gilt in .NET 5.0 als veraltet, um deutlich zu machen, dass die Runtime diese Attribute oder APIs nicht berücksichtigt.

Eingeführt in Version

5.0

  • Wenn Sie eine Sicherheitsberechtigung bestätigen, entfernen Sie das Attribut oder den Aufruf, der die Berechtigung bestätigt.

    // REMOVE the attribute below.
    [SecurityPermission(SecurityAction.Assert, ControlThread = true)]
    public void DoSomething()
    {
    }
    
    public void DoAssert()
    {
        // REMOVE the line below.
        new SecurityPermission(SecurityPermissionFlag.ControlThread).Assert();
    }
    
  • Wenn Sie (über PermitOnly) eine beliebige Berechtigung verweigern oder einschränken, wenden Sie sich an Ihren Sicherheitsberater. Da die Runtime von .NET 5 oder höher keine CAS-Attribute berücksichtigt, kann Ihre Anwendung eine Sicherheitslücke aufweisen, wenn sie fälschlicherweise darauf angewiesen ist, dass die CAS-Infrastruktur den Zugriff auf diese Methoden einschränkt.

    // 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();
    }
    
  • Wenn Sie Berechtigungen anfordern (außer PrincipalPermission), entfernen Sie die Anforderung. Alle Anforderungen werden zur Laufzeit erfolgreich ausgeführt.

    // 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();
    }
    
  • Wenn Sie PrincipalPermission anfordern, lesen Sie den Leitfaden für PrincipalPermissionAttribute ist als Fehler veraltet. Dieser Leitfaden gilt sowohl für PrincipalPermission als auch für PrincipalPermissionAttribute.

  • Wenn Sie diese Warnungen unbedingt deaktivieren müssen (was nicht empfohlen wird), können Sie die Warnung SYSLIB0003 im Code unterdrücken.

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

    Sie können die Warnung auch in der Projektdatei unterdrücken. Wenn Sie dies tun, wird die Warnung für alle Quelldateien im Projekt deaktiviert.

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

    Hinweis

    Durch das Unterdrücken von SYSLIB0003 werden nur CAS-bezogene Veraltungswarnungen deaktiviert. Es werden keine anderen Warnungen deaktiviert, und das Verhalten der Runtime von .NET 5 oder höheren Versionen wird nicht geändert.

  • Sicherheit

Betroffene APIs