Freigeben über


Die meisten Codezugriffssicherheits-APIs sind veraltet

Die meisten Typen im Zusammenhang mit der Codezugriffssicherheit (CAS) in .NET sind jetzt als Warnung veraltet. Dazu gehören CAS-Attribute, wie SecurityPermissionAttribute, CAS-Berechtigungsobjekte, wie SocketPermission, EvidenceBase-abgeleitete Typen und andere unterstützende APIs.

Änderungsbeschreibung

In .NET Framework 2.x - 4.x können CAS-Attribute und APIs den Verlauf der Codeausführung beeinflussen, einschließlich der Sicherstellung, dass CAS-Demand-Stapel erfolgreich ausgeführt werden oder fehlschlagen.

// 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 berücksichtigt die Laufzeit keine CAS-Attribute oder CAS-APIs. Die Laufzeit ignoriert Attribute für den Methodeneintrag, und die meisten programmgesteuerten APIs haben keine Auswirkung.

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

Darüber hinaus werden programmgesteuerte Aufrufe an umfangreiche APIs (Assert) immer erfolgreich ausgeführt, während programmgesteuerte Aufrufe restriktiver APIs (Deny, PermitOnly) immer zur Laufzeit eine Ausnahme auslösen. (PrincipalPermission ist eine Ausnahme von dieser Regel. Weitere Informationen finden Sie im Abschnitt " Empfohlene Aktion " weiter unten.)

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 erzeugen Kompilierungszeitwarnungen 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
}

Dies ist eine Änderung, die nur die Kompilierzeit betrifft. Es gibt keine Laufzeitänderung von früheren Versionen von .NET Core. Methoden, die keinen Vorgang in .NET Core 2.x - 3.x ausführen, führen weiterhin keinen Vorgang zur Laufzeit in .NET 5 und höher 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 Änderung

Codezugriffssicherheit (Code Access Security, CAS) ist eine nicht unterstützte Legacytechnologie. Die Infrastruktur zum Aktivieren von CAS ist nur in .NET Framework 2.x - 4.x vorhanden, ist jedoch veraltet und empfängt keine Wartungs- oder Sicherheitsupdates.

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"-Szenarien, in denen einige CAS-bezogene APIs vorhanden sind und aufrufbar sind, aber zur Laufzeit keine Aktion ausführen. Dies kann zu Sicherheitsproblemen für Komponenten führen, die erwarten, dass die Laufzeit CAS-bezogene Attribute oder programmgesteuerte API-Aufrufe berücksichtigt. Um besser zu kommunizieren, dass die Laufzeit diese Attribute oder APIs nicht berücksichtigt, haben wir den Großteil dieser Attribute in .NET 5.0 veraltet.

Eingeführte Version

5.0

  • Wenn Sie eine Sicherheitsberechtigung bestätigen, entfernen Sie das Attribut oder den Aufruf, das 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 irgendwelche Berechtigungen verweigern oder einschränken (über PermitOnly), wenden Sie sich an Ihren Sicherheitsberater. Da CAS-Attribute von der .NET 5+-Laufzeit nicht berücksichtigt werden, könnte Ihre Anwendung ein Sicherheitsloch aufweisen, wenn sie fälschlicherweise auf die CAS-Infrastruktur angewiesen ist, um den Zugriff auf diese Methoden einzuschränken.

    // 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 eine Berechtigung anfordern (mit Ausnahme 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. Diese Anleitung 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 SYSLIB0003 Warnung 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 Ihrer Projektdatei unterdrücken. Dadurch wird die Warnung für alle Quelldateien innerhalb des Projekts deaktiviert.

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

    Hinweis

    Das Unterdrücken von SYSLIB0003 unterdrückt nur die CAS-bezogenen Obsoletionswarnungen. Es werden keine anderen Warnungen deaktiviert oder das Verhalten der .NET 5+-Laufzeit geändert.

  • Sicherheit

Betroffene APIs