Bagikan melalui


Bingkai Keamanan: Manajemen Pengecualian | Mitigasi

Produk/Layanan Artikel
WCF
API Web
Aplikasi Web

WCF- Jangan sertakan simpul serviceDebug dalam file konfigurasi

Judul Detail
Komponen WCF
Fase SDL Build
Teknologi yang Berlaku Generik, NET Framework 3
Atribut T/A
Referensi MSDN, Fortify Kingdom
Langkah-langkah Layanan Windows Communication Framework (WCF) dapat dikonfigurasi untuk membongkar informasi penelusuran kesalahan. Informasi debug tidak boleh digunakan di lingkungan produksi. Tag <serviceDebug> menentukan apakah fitur informasi debug diaktifkan untuk layanan WCF. Jika atribut includeExceptionDetailInFaults diatur ke true, informasi pengecualian dari aplikasi akan dikembalikan ke klien. Penyerang dapat memanfaatkan informasi tambahan yang mereka peroleh dari output penelusuran kesalahan untuk memasang serangan yang ditargetkan pada kerangka kerja, database, atau sumber daya lain yang digunakan oleh aplikasi.

Contoh

File konfigurasi berikut mencakup tag <serviceDebug>:

<configuration> 
<system.serviceModel> 
<behaviors> 
<serviceBehaviors> 
<behavior name=""MyServiceBehavior""> 
<serviceDebug includeExceptionDetailInFaults=""True"" httpHelpPageEnabled=""True""/> 
... 

Nonaktifkan informasi penelusuran kesalahan di dalam layanan. Ini dapat dicapai dengan menghapus tag <serviceDebug> dari file konfigurasi aplikasi Anda.

WCF- Jangan sertakan simpul serviceMetadata dalam file konfigurasi

Judul Detail
Komponen WCF
Fase SDL Build
Teknologi yang Berlaku Generik
Atribut Generik, Kerangka Kerja NET 3
Referensi MSDN, Fortify Kingdom
Langkah-langkah Mengekspos informasi tentang layanan secara publik dapat memberi penyerang wawasan berharga tentang bagaimana mereka dapat mengeksploitasi layanan. Tag <serviceMetadata> mengaktifkan fitur penerbitan metadata. Metadata layanan dapat berisi informasi sensitif yang seharusnya tidak dapat diakses oleh publik. Minimal, hanya mengizinkan pengguna tepercaya untuk mengakses metadata dan memastikan bahwa informasi yang tidak perlu tidak terekspos. Lebih baik lagi, sepenuhnya menonaktifkan kemampuan untuk memublikasikan metadata. Konfigurasi WCF yang aman tidak akan berisi tag <serviceMetadata>.

Pastikan penanganan pengecualian yang tepat dilakukan di API Web ASP.NET

Judul Detail
Komponen API Web
Fase SDL Build
Teknologi yang Berlaku MVC 5, MVC 6
Atribut T/A
Referensi Penanganan Pengecualian di API Web ASP.NET, Validasi Model di API Web ASP.NET
Langkah-langkah Secara default, sebagian besar pengecualian yang tidak tertangkap di API Web ASP.NET diterjemahkan ke dalam respons HTTP dengan kode status 500, Internal Server Error

Contoh

Untuk mengontrol kode status yang dikembalikan oleh API, HttpResponseException dapat digunakan seperti yang ditunjukkan di bawah ini:

public Product GetProduct(int id)
{
    Product item = repository.Get(id);
    if (item == null)
    {
        throw new HttpResponseException(HttpStatusCode.NotFound);
    }
    return item;
}

Contoh

Untuk kontrol lebih lanjut pada respons pengecualian, kelas HttpResponseMessage dapat digunakan seperti yang ditunjukkan di bawah ini:

public Product GetProduct(int id)
{
    Product item = repository.Get(id);
    if (item == null)
    {
        var resp = new HttpResponseMessage(HttpStatusCode.NotFound)
        {
            Content = new StringContent(string.Format("No product with ID = {0}", id)),
            ReasonPhrase = "Product ID Not Found"
        }
        throw new HttpResponseException(resp);
    }
    return item;
}

Untuk menangkap pengecualian tidak tertangani yang bukan dari jenis HttpResponseException, Filter Pengecualian dapat digunakan. Filter pengecualian mengimplementasikan antarmuka System.Web.Http.Filters.IExceptionFilter. Cara paling sederhana untuk menulis filter pengecualian adalah dengan menurunkan dari kelas System.Web.Http.Filters.ExceptionFilterAttribute dan menimpa metode OnException.

Contoh

Berikut adalah filter yang mengonversi pengecualian NotImplementedException menjadi kode status HTTP 501, Not Implemented:

namespace ProductStore.Filters
{
    using System;
    using System.Net;
    using System.Net.Http;
    using System.Web.Http.Filters;

    public class NotImplExceptionFilterAttribute : ExceptionFilterAttribute 
    {
        public override void OnException(HttpActionExecutedContext context)
        {
            if (context.Exception is NotImplementedException)
            {
                context.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented);
            }
        }
    }
}

Ada beberapa cara untuk mendaftarkan filter pengecualian API Web:

  • Menurut tindakan
  • Menurut pengontrol
  • Secara global

Contoh

Untuk menerapkan filter ke tindakan tertentu, tambahkan filter sebagai atribut ke tindakan:

public class ProductsController : ApiController
{
    [NotImplExceptionFilter]
    public Contact GetContact(int id)
    {
        throw new NotImplementedException("This method is not implemented");
    }
}

Contoh

Untuk menerapkan filter ke semua tindakan pada controller, tambahkan filter sebagai atribut ke kelas controller:

[NotImplExceptionFilter]
public class ProductsController : ApiController
{
    // ...
}

Contoh

Untuk menerapkan filter secara global ke semua pengontrol API Web, tambahkan instans filter ke koleksi GlobalConfiguration.Configuration.Filters. Filter pengecualian dalam koleksi ini berlaku untuk setiap tindakan pengontrol API Web.

GlobalConfiguration.Configuration.Filters.Add(
    new ProductStore.NotImplExceptionFilterAttribute());

Contoh

Untuk validasi model, status model dapat diteruskan ke metode CreateErrorResponse seperti yang ditunjukkan di bawah ini:

public HttpResponseMessage PostProduct(Product item)
{
    if (!ModelState.IsValid)
    {
        return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
    }
    // Implementation not shown...
}

Periksa tautan di bagian referensi untuk detail tambahan tentang penanganan luar biasa dan validasi model di API Web ASP.NET

Jangan mengekspos detail keamanan dalam pesan kesalahan

Judul Detail
Komponen Aplikasi Web
Fase SDL Build
Teknologi yang Berlaku Generik
Atribut T/A
Referensi T/A
Langkah-langkah

Pesan kesalahan umum diberikan langsung kepada pengguna tanpa menyertakan data aplikasi sensitif. Contoh data sensitif meliputi:

  • Nama server
  • String koneksi
  • Nama pengguna
  • Sandi
  • Prosedur SQL
  • Rincian kegagalan SQL dinamis
  • Pelacakan tumpukan dan baris kode
  • Variabel yang disimpan dalam memori
  • Lokasi drive dan folder
  • Titik pemasangan aplikasi
  • Pengaturan konfigurasi host
  • Detail aplikasi internal lainnya

Menjebak semua kesalahan dalam aplikasi dan menyediakan pesan kesalahan umum, serta mengaktifkan kesalahan kustom dalam IIS akan membantu mencegah pengungkapan informasi. Database SQL Server dan penanganan Pengecualian .NET, di antara arsitektur penanganan kesalahan lainnya, sangat bertele-tele dan sangat berguna bagi pengguna jahat yang membuat profil aplikasi Anda. Jangan langsung menampilkan konten kelas yang diturunkan dari kelas Pengecualian .NET, dan pastikan bahwa Anda memiliki penanganan pengecualian yang tepat sehingga pengecualian yang tidak diharapkan tidak dimunculkan langsung ke pengguna secara tidak sengaja.

  • Berikan pesan kesalahan umum secara langsung kepada pengguna yang mengabstraksikan detail spesifik yang ditemukan langsung dalam pengecualian/pesan kesalahan
  • Jangan tampilkan konten kelas pengecualian .NET langsung ke pengguna
  • Jebak semua pesan kesalahan dan jika sesuai, beri tahu pengguna melalui pesan kesalahan umum yang dikirim ke klien aplikasi
  • Jangan mengekspos konten kelas Pengecualian langsung ke pengguna, terutama nilai yang dikembalikan dari .ToString(), atau nilai properti Pesan atau StackTrace. Catat informasi ini dengan aman dan tampilkan pesan yang lebih tidak berbahaya kepada pengguna

Halaman penanganan kesalahan Terapkan Default

Judul Detail
Komponen Aplikasi Web
Fase SDL Build
Teknologi yang Berlaku Generik
Atribut T/A
Referensi Edit Kotak Dialog Pengaturan Halaman Kesalahan ASP.NET
Langkah-langkah

Ketika aplikasi ASP.NET gagal dan menyebabkan Kesalahan Server Internal HTTP/1.x 500, atau konfigurasi fitur (seperti Pemfilteran Permintaan) mencegah halaman ditampilkan, pesan kesalahan akan dihasilkan. Administrator dapat memilih apakah aplikasi harus menampilkan pesan yang ramah kepada klien, pesan kesalahan terperinci kepada klien, atau pesan kesalahan terperinci ke localhost saja. Tag <customErrors> dalam web.config memiliki tiga mode:

  • On: Menentukan bahwa kesalahan kustom diaktifkan. Jika tidak ada atribut defaultRedirect yang ditentukan, pengguna akan melihat kesalahan generik. Kesalahan kustom ditunjukkan kepada klien jarak jauh dan host lokal
  • Off: Menentukan bahwa kesalahan kustom dinonaktifkan. Kesalahan ASP.NET terperinci ditunjukkan kepada klien jarak jauh dan host lokal
  • RemoteOnly: Menentukan bahwa kesalahan kustom hanya ditampilkan kepada klien jarak jauh, dan kesalahan ASP.NET ditampilkan ke host lokal. Ini adalah nilai default

Buka file web.config untuk aplikasi/situs dan pastikan bahwa tag memiliki <customErrors mode="RemoteOnly" /> atau <customErrors mode="On" /> yang ditentukan.

Atur Metode Penyebaran ke Ritel di IIS

Judul Detail
Komponen Aplikasi Web
Fase SDL Penyebaran
Teknologi yang Berlaku Generik
Atribut T/A
Referensi Elemen penyebaran (Skema Pengaturan ASP.NET)
Langkah-langkah

Pengalih <deployment retail> ini ditujukan untuk digunakan oleh server IIS produksi. Pengalih ini digunakan untuk membantu aplikasi berjalan dengan performa terbaik dan setidaknya kemungkinan kebocoran informasi keamanan dengan menonaktifkan kemampuan aplikasi untuk menghasilkan output jejak pada halaman, menonaktifkan kemampuan untuk menampilkan pesan kesalahan terperinci kepada pengguna akhir, dan menonaktifkan pengalih debug.

Seringkali waktu, pengalih dan opsi yang berfokus pada pengembang, seperti pelacakan permintaan dan penelusuran kesalahan yang gagal, diaktifkan selama pengembangan aktif. Disarankan agar metode penyebaran pada server produksi apa pun diatur ke ritel. buka file machine.config dan pastikan bahwa <deployment retail="true" /> tetap diatur ke true.

Pengecualian harus gagal dengan aman

Judul Detail
Komponen Aplikasi Web
Fase SDL Build
Teknologi yang Berlaku Generik
Atribut T/A
Referensi Gagal dengan aman
Langkah-langkah Aplikasi harus gagal dengan aman. Metode apa pun yang mengembalikan nilai Boolean, berdasarkan keputusan tertentu yang dibuat, harus memiliki blok pengecualian yang dibuat dengan hati-hati. Ada banyak kesalahan logis karena masalah keamanan merayap, ketika blok pengecualian ditulis sembarangan.

Contoh

        public static bool ValidateDomain(string pathToValidate, Uri currentUrl)
        {
            try
            {
                if (!string.IsNullOrWhiteSpace(pathToValidate))
                {
                    var domain = RetrieveDomain(currentUrl);
                    var replyPath = new Uri(pathToValidate);
                    var replyDomain = RetrieveDomain(replyPath);

                    if (string.Compare(domain, replyDomain, StringComparison.OrdinalIgnoreCase) != 0)
                    {
                        //// Adding additional check to enable CMS urls if they are not hosted on same domain.
                        if (!string.IsNullOrWhiteSpace(Utilities.CmsBase))
                        {
                            var cmsDomain = RetrieveDomain(new Uri(Utilities.Base.Trim()));
                            if (string.Compare(cmDomain, replyDomain, StringComparison.OrdinalIgnoreCase) != 0)
                            {
                                return false;
                            }
                            else
                            {
                                return true;
                            }
                        }

                        return false;
                    }
                }

                return true;
            }
            catch (UriFormatException ex)
            {
                LogHelper.LogException("Utilities:ValidateDomain", ex);
                return true;
            }
        }

Metode di atas akan selalu mengembalikan True, jika beberapa pengecualian terjadi. JJika pengguna akhir memberikan URL yang salah format, yang dipatuhi oleh browser, tetapi tidak konstruktor Uri(), ini akan melemparkan pengecualian, dan korban akan dibawa ke URL yang valid tetapi salah format.