Bagikan melalui


Sebagian besar API keamanan akses kode usang

Sebagian besar jenis terkait keamanan akses kode (CAS) di .NET sekarang usang sebagai peringatan. Ini termasuk atribut CAS, seperti SecurityPermissionAttribute, objek izin CAS, seperti SocketPermission, EvidenceBasejenis turunan, dan API pendukung lainnya.

Deskripsi perubahan

Dalam .NET Framework 2.x - 4.x, atribut CAS dan API dapat memengaruhi jalannya eksekusi kode, termasuk memastikan bahwa stack walk cas-demand berhasil atau gagal.

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

Dalam .NET Core 2.x - 3.x, runtime tidak mematuhi atribut CAS atau API CAS. Runtime mengabaikan atribut pada entri metode, dan sebagian besar API terprogram tidak berpengaruh.

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

Selain itu, panggilan terprogram ke API ekspansif (Assert) selalu berhasil, sementara panggilan terprogram ke API pembatasan (Deny, PermitOnly) selalu memberikan pengecualian pada waktu proses. (PrincipalPermission adalah pengecualian untuk aturan ini. Lihat bagian Tindakan yang direkomendasikan di bawah ini.)

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

Di .NET 5 dan versi yang lebih baru, sebagian besar API terkait CAS kedaluwarsa dan menghasilkan peringatan waktu kompilasi 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
}

Ini adalah perubahan kompilasi-waktu saja. Tidak ada perubahan run-time dari versi .NET Core sebelumnya. Metode yang tidak melakukan operasi di .NET Core 2.x - 3.x akan terus tidak melakukan operasi pada waktu proses di .NET 5 dan yang lebih baru. Metode yang melemparkan PlatformNotSupportedException .NET Core 2.x - 3.x akan terus melempar PlatformNotSupportedException pada waktu proses di .NET 5 dan yang lebih baru.

Alasan untuk berubah

Keamanan akses kode (CAS) adalah teknologi warisan yang tidak didukung. Infrastruktur untuk mengaktifkan CAS hanya ada di .NET Framework 2.x - 4.x, tetapi tidak digunakan lagi dan tidak menerima layanan atau perbaikan keamanan.

Karena penghentian CAS, infrastruktur pendukung tidak diteruskan ke .NET Core atau .NET 5+. Namun, API diteruskan sehingga aplikasi dapat dikompilasi silang terhadap .NET Framework dan .NET Core. Hal ini menyebabkan skenario "gagal terbuka", di mana beberapa API terkait CAS ada dan dapat dipanggil tetapi tidak melakukan tindakan pada waktu proses. Hal ini dapat menyebabkan masalah keamanan untuk komponen yang mengharapkan runtime untuk mematuhi atribut terkait CAS atau panggilan API terprogram. Untuk berkomunikasi dengan lebih baik bahwa runtime tidak menghormati atribut atau API ini, kami telah usang sebagian besar dari mereka di .NET 5.0.

Versi yang diperkenalkan

5.0

  • Jika Anda menegaskan izin keamanan apa pun, hapus atribut atau panggilan yang menegaskan izin.

    // REMOVE the attribute below.
    [SecurityPermission(SecurityAction.Assert, ControlThread = true)]
    public void DoSomething()
    {
    }
    
    public void DoAssert()
    {
        // REMOVE the line below.
        new SecurityPermission(SecurityPermissionFlag.ControlThread).Assert();
    }
    
  • Jika Anda menolak atau membatasi (melalui PermitOnly) izin apa pun, hubungi penasihat keamanan Anda. Karena atribut CAS tidak dihormati oleh runtime .NET 5+, aplikasi Anda bisa memiliki lubang keamanan jika salah bergantung pada infrastruktur CAS untuk membatasi akses ke metode ini.

    // 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();
    }
    
  • Jika Anda menuntut izin apa pun (kecuali PrincipalPermission), hapus permintaan. Semua tuntutan akan berhasil pada waktu proses.

    // 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();
    }
    
  • Jika Anda menuntut PrincipalPermission, lihat panduan untuk PrincipalPermissionAttribute kedaluwarsa sebagai kesalahan. Panduan itu berlaku untuk PrincipalPermission dan PrincipalPermissionAttribute.

  • Jika Anda benar-benar harus menonaktifkan peringatan ini (yang tidak disarankan), Anda dapat menekan SYSLIB0003 peringatan dalam kode.

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

    Anda juga dapat menekan peringatan dalam file proyek Anda. Melakukannya menonaktifkan peringatan untuk semua file sumber dalam proyek.

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

    Catatan

    Penindasan SYSLIB0003 hanya menonaktifkan peringatan usang terkait CAS. Ini tidak menonaktifkan peringatan lain atau mengubah perilaku runtime .NET 5+.

  • Keamanan

API yang Terpengaruh