Skip to content

SEHOP

Structured Exception Handler Overwrite Protection — bir thread'in SEH chain'inin integrity'sini exception dispatch sırasında doğrulayan, klasik SEH-overwrite exploitation tekniğini yenen bir Windows mitigation'ı.

Mechanism

Note

32-bit Windows'ta structured exception handling, stack üzerinde EXCEPTION_REGISTRATION_RECORD yapılarından oluşan bir linked list kullanır. Her record bir Next pointer (önceki record'a) ve bir Handler pointer (callback) tutar. Thread'in head'i fs:[0]'dadır. Klasik bir stack overflow, stack üzerindeki bir registration record'u ezerek Handler'ı üzerine yazabilir; böylece bir exception ateşlendiğinde dispatcher attacker'ın kontrol ettiği kodu çağırır — SEH overwrite tekniği. Bu, stack cookie'leri atlar, çünkü exception, return'de cookie kontrol edilmeden önce tetiklenebilir.

SEHOP, tek bir handler yerine chain'in yapısal invariant'ını savunur. Thread başlangıcında, handler'ı ntdll!FinalExceptionHandler olan ve ntdll!RtlInitializeExceptionChain tarafından kaydedilen bilinen bir sembolik terminator record ekler. Yeni record'lar daima list'in head'ine push edildiğinden, bu terminator'ın tail olması garantidir. Bir exception dispatch edildiğinde, ntdll!RtlDispatchException tüm chain'i dolaşır ve onun (a) iyi biçimlendirilmiş (record'lar stack-aligned, in-bounds, monoton sıralı) ve (b) tam olarak o sembolik record'da sonlandığını doğrular. Bir SEH overwrite bu dolaşmayı bozar — bozulmuş Next artık FinalExceptionHandler'a ulaşmaz — böylece dispatcher corruption'ı tespit eder ve hijack edilmiş handler'ı çağırmak yerine process'i sonlandırır.

Korunan boundary: exception-dispatch yolunun control-flow integrity'si. safeseh'in (geçerli handler'ların compile-time allow-list'i) aksine, SEHOP runtime, module-agnostic bir kontroldür ve /SAFESEH ile derlenmemiş binary'leri bile korur.

Walkthrough

Yüksek seviyede, Microsoft'un herkese açık MSRC yazısından ve dokümantasyonundan:

  • Adım 1 — terminator'ı tohumla. Bir thread user mode'a girerken, RtlInitializeExceptionChain, FinalExceptionHandler'ı sembolik bir tail record olarak kaydeder. Record'lar head'e eklendiğinden bu en sonda kalır.
  • Adım 2 — dispatch'te doğrula. Bir exception'da, RtlDispatchException fs:[0]NextNext … şeklinde dolaşır; her record'un mevcut thread stack'inde olduğunu, düzgün hizalandığını, adres olarak arttığını ve dolaşmanın tam olarak FinalExceptionHandler record'unda bittiğini kontrol eder.
  • Sonuç. Ezilmiş bir Handler/Next (SEH-overwrite primitive'i) chain'in validation'ı geçememesine yol açar, böylece hijack edilecek handler asla çağrılmaz.
Bilinen sınırlamalar / bypass'lar (defansif farkındalık)

SEHOP mutlak değildir. x86-merkezli'dir (x64, aynı şekilde chain-walk edilmeyen tablo tabanlı exception handling kullanır). Yayınlanmış araştırmalar, bir attacker'ın hâlâ meşru bir FinalExceptionHandler record'unda biten geçerli görünümlü bir chain forge ettiği, ya da SEH'ten tamamen uzaklaştığı (ör. exception tetiklemeden ROP) bypass'ları gösteriyor. Bu yüzden SEHOP, safeseh, gs-stack-cookie, data-execution-prevention, address-space-layout-randomization ve control-flow-guard arasında bir katmandır.

Detection

  • Crash telemetrisi: SEHOP ihlalleri process'i sonlandırır; fault'u RtlDispatchException / exception-chain validation'da olan WER/Application Error event'lerini ve crash dump'larını arayın, özellikle network'e bakan bir servis üzerinde tekrar ediyorsa (denenmiş bir SEH-overwrite'ın belirtisi).
  • Policy durumu denetimi: SEHOP'un gerçekten enabled olduğunu teyit edin (registry veya Exploit Protection / Windows Defender Exploit Guard raporlaması), çünkü bazı client SKU'larda varsayılan olarak kapalıdır.
  • EDR exploit-guard event'leri: modern Windows, bir process bir SEH-validation failure'ı ile öldürüldüğünde exploit-protection mitigation event'leri ortaya çıkarır.

Mitigation

SEHOP'un kendisi bir mitigation'dır; yapılacak şey onu enable etmek ve enabled tutmaktır.

  • Sistem genelinde: enable etmek için HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\kernel\DisableExceptionChainValidation değerini 0 (DWORD) yapın; 1 disable eder. Windows Server SKU'larında varsayılan olarak enabled; client Windows'ta (Vista/7) tarihsel olarak varsayılan kapalı.
  • Process başına: Windows Security → App & browser control → Exploit protection (EMET'in halefi) üzerinden "Validate exception chains (SEHOP)"'u uygulama başına veya sistem varsayılanı olarak enable edin.
  • Uyumluluk: Microsoft, bazı eski yazılımların (ör. eski Cygwin, Skype, Armadillo ile korunan app'ler) SEHOP açıkken hatalı davranabileceğini belirtir; geniş rollout'tan önce test edin.
  • Defense in depth: /SAFESEH, /GS stack cookie'leri, DEP, ASLR ve CFG ile birleştirin ki bir mitigation'ın yenilmesi güvenilir code execution vermesin.

References