Kod erişimi güvenlik API'lerinin çoğu kullanımdan kaldırıldı

.NET'teki kod erişim güvenliği (CAS) ile ilgili türlerin çoğu artık uyarı olarak kullanılmıyor. Buna, SecurityPermissionAttribute, - türetilmiş türler ve diğer destekleyici API'ler gibi , EvidenceBaseCAS izin nesneleri gibi SocketPermissionCAS öznitelikleri dahildir.

Açıklama değiştirildi

.NET Framework 2.x - 4.x'te CAS öznitelikleri ve API'leri, CAS talep yığınının başarılı veya başarısız olmasını sağlamak da dahil olmak üzere kod yürütmenin seyrini etkileyebilir.

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

.NET Core 2.x - 3.x'te çalışma zamanı CAS özniteliklerini veya CAS API'lerini dikkate almaz. Çalışma zamanı, yöntem girdisi üzerindeki öznitelikleri yoksayar ve çoğu programlı API'nin hiçbir etkisi yoktur.

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

Buna ek olarak, geniş API'lere (Assert) yönelik programlı çağrılar her zaman başarılı olurken, kısıtlayıcı API'lere (Deny, PermitOnly) yapılan programlı çağrılar her zaman çalışma zamanında bir özel durum oluşturur. (PrincipalPermission bu kural için bir özel durumdur. Aşağıdaki Önerilen eylem bölümüne bakın.)

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

.NET 5 ve sonraki sürümlerinde CAS ile ilgili çoğu API eskidir ve derleme zamanı uyarısı SYSLIB0003üretir.

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

Bu yalnızca derleme zamanı değişikliğidir. .NET Core'un önceki sürümlerinde çalışma zamanı değişikliği yoktur. .NET Core 2.x - 3.x sürümlerinde hiçbir işlem gerçekleştirmez yöntemler.NET 5 ve sonraki sürümlerde çalışma zamanında hiçbir işlem gerçekleştirmeye devam eder. .NET Core 2.x - 3.x'te oluşturan PlatformNotSupportedException yöntemler.NET 5 ve sonraki sürümlerde çalışma zamanında atmaya PlatformNotSupportedException devam eder.

Değişiklik nedeni

Kod erişim güvenliği (CAS), desteklenmeyen eski bir teknolojidir. CAS'yi etkinleştirme altyapısı yalnızca .NET Framework 2.x - 4.x'te bulunur, ancak kullanım dışıdır ve bakım veya güvenlik düzeltmeleri almaz.

CAS'nin kullanımdan kaldırılması nedeniyle destekleyici altyapı .NET Core veya .NET 5+ için öne çıkarılmamıştı. Ancak, uygulamaların .NET Framework ve .NET Core ile çapraz derlemesi için API'ler öne çıkarıldı. Bu, CAS ile ilgili bazı API'lerin mevcut olduğu ve çağrılabileceği ancak çalışma zamanında hiçbir işlem gerçekleştirmediği "başarısız açma" senaryolarına yol açtı. Bu, çalışma zamanının CAS ile ilgili özniteliklere veya programlı API çağrılarına uygun olmasını bekleyen bileşenler için güvenlik sorunlarına yol açabilir. Çalışma zamanının bu özniteliklere veya API'lere saygı duymadığını daha iyi bildirmek için, bunların çoğunu .NET 5.0'da gizledik.

Sürüm kullanıma sunulmuştur

5.0

  • Herhangi bir güvenlik iznini onaylarsanız, izni onaylayan özniteliği veya çağrıyı kaldırın.

    // REMOVE the attribute below.
    [SecurityPermission(SecurityAction.Assert, ControlThread = true)]
    public void DoSomething()
    {
    }
    
    public void DoAssert()
    {
        // REMOVE the line below.
        new SecurityPermission(SecurityPermissionFlag.ControlThread).Assert();
    }
    
  • Herhangi bir izni reddediyor veya kısıtlıyorsanız (aracılığıyla PermitOnly) güvenlik danışmanınıza başvurun. CAS öznitelikleri .NET 5+ çalışma zamanı tarafından kabul edilmediğinden, uygulamanızın bu yöntemlere erişimi kısıtlamak için YANLıŞLıKLA CAS altyapısına bağlı olması durumunda bir güvenlik deliği olabilir.

    // 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();
    }
    
  • herhangi bir izin (hariç) PrincipalPermissiontalep ediyorsanız talebi kaldırın. Tüm talepler çalışma zamanında başarılı olur.

    // 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();
    }
    
  • talep ediyorsanız PrincipalPermissionPrincipalPermissionAttribute hata olarak kullanımdan kaldırıldı yönergelerine başvurun. Bu kılavuz hem hem PrincipalPermissionAttributede PrincipalPermission için geçerlidir.

  • Bu uyarıları kesinlikle devre dışı bırakmanız gerekiyorsa (önerilmez), uyarıyı SYSLIB0003 kodda gizleyebilirsiniz.

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

    Uyarıyı proje dosyanızda da gizleyebilirsiniz. Bunun yapılması, projedeki tüm kaynak dosyalar için uyarıyı devre dışı bırakır.

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

    Not

    Gizlenmesi SYSLIB0003 yalnızca CAS ile ilgili kullanımdan kaldırma uyarılarını devre dışı bırakır. Diğer uyarıları devre dışı bırakmaz veya .NET 5+ çalışma zamanının davranışını değiştirmez.

  • Güvenlik

Etkilenen API’ler