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,
RtlDispatchExceptionfs:[0]→Next→Next… ş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 olarakFinalExceptionHandlerrecord'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 Errorevent'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\DisableExceptionChainValidationdeğerini0(DWORD) yapın;1disable 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,/GSstack cookie'leri, DEP, ASLR ve CFG ile birleştirin ki bir mitigation'ın yenilmesi güvenilir code execution vermesin.