Aracılığıyla paylaş


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 gibi CAS öznitelikleri, SocketPermission ve EvidenceBase gibi CAS izin nesneleri, SecurityPermissionAttribute-türetilmiş türler ve diğer destekleyici API'ler dahildir.

Açıklamayı değiştir

.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 runtime.
    new SocketPermission(PermissionState.Unrestricted).Assert();
}

public void DoDeny()
{
    // The line below throws PlatformNotSupportedException at runtime.
    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ştirmeyen yöntemler, .NET 5 ve sonraki sürümlerde de çalışma zamanında hiçbir işlem gerçekleştirmemeye devam eder. .NET Core 2.x - 3.x'te PlatformNotSupportedException fırlatan yöntemler, .NET 5 ve sonraki sürümlerde çalışma zamanında PlatformNotSupportedException fırlatmaya devam edecektir.

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'in kullanımdan kaldırılması nedeniyle destekleyici altyapı .NET Core veya .NET 5+ sistemlerine aktarı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 herhangi bir işlem gerçekleştirmediği "başarısız açılma" 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 talep ediyorsanız (hariç PrincipalPermission), talebi kaldırın. Tüm talepler çalışma zamanında başarılı olacaktır.

    // 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 PrincipalPermissionde PrincipalPermissionAttribute 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>
    

    Uyarı

    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