Skip to content

CET Hardware-enforced Stack Protection (shadow stack)

Intel/AMD CET shadow stack'leri return address'lerin hardware ile korunan bir kopyasını tutar, böylece backward-edge control-flow hijack'leri (ROP) RET anında yakalanır.

Mechanism

Bug class / invariant

CET shadow stack'lerinin dayattığı security invariant şudur: bir fonksiyon yalnızca onu gerçekten çağıran address'e geri döner. Klasik ROP bunu bozar — (yazılabilir) call stack'i kontrol eden bir saldırgan, kaydedilmiş return address'leri ezerek RET ile biten "gadget"ları zincirler. Hardware-enforced Stack Protection (Intel CET / AMD Shadow Stack), CPU'nun her CALL'da yazdığı ve her RET'te doğruladığı ikinci bir hardware ile korunan shadow stack tutar. Shadow stack, özel shadow-stack semantiğiyle işaretlenmiş page'lerde yaşar; sıradan store'lar onu taklit edemez. RET anında CPU, normal stack'teki return address'i shadow-stack kopyasıyla karşılaştırır; bir uyuşmazlık #CP (control-protection) exception'ı tetikler. Bozulmuş return address shadow stack'e hiç ulaşmadığı için, sapma heuristic yerine yapısal olarak yakalanır.

Walkthrough

Yüksek seviye, kavramsal (Microsoft'un public dokümantasyonundan):

  1. Bir process veya kernel opt-in yapar (user mode bir linker flag'i ile PE-header bit'ini set eder; kernel mode ise destekleyen hardware'de sistem genelinde yapılandırılır — 11. nesil Intel Core ya da AMD Zen 3 ve daha yenisi).
  2. Her CALL'da return address hem data stack'e hem de shadow stack'e push edilir.
  3. Bir güvenlik açığı saldırgana stack-buffer overflow verir; saldırgan kaydedilmiş return address'i bir gadget pointer'ı ile ezer — klasik ROP kurulumu.
  4. RET anında CPU, (sahte) data-stack address'ini pop eder ama onu el değmemiş shadow-stack address'iyle karşılaştırır.
  5. Uyuşmazlık #CP'yi tetikler; OS bunu fatal bir control-protection fault olarak ele alır ve gadget çalışmadan önce ilgili thread/process'i sonlandırır.

Not: Bu sayfa CET'in Windows / Microsoft-mode tarafını anlatır. Linux/glibc tarafındaki arch_prctl(ARCH_SHSTK_*) opt-in'i, CET_SHSTK MSR/feature detail'i ve ELF GNU-property note bayrağı için bkz. Intel CET shadow stack.

Aşağıdaki snippet'ler benign / defensive verification içindir — bir binary'nin CET shadow-stack talep edip etmediğini ve canlı bir process'in mitigation policy'sini incelemeye yarar (hiçbir exploit adımı yoktur):

# 1) Binary CET/shadow-stack opt-in yapmış mı? PE load-config'i incele.
#    dumpbin (MSVC toolchain) "CET Shadow Stack" / "CETCompat" satırını gösterir.
dumpbin /loadconfig C:\Path\To\app.exe | findstr /I "CET Shadow"

# 2) Canlı / kayıtlı mitigation policy: UserShadowStack durumu (Enable / StrictMode / AuditMode).
Get-ProcessMitigation -Name app.exe | Select-Object -ExpandProperty UserShadowStack

# 3) Çalışan bir process için aynı policy'yi PID üzerinden sorgula.
Get-ProcessMitigation -Id (Get-Process app).Id | Select-Object -ExpandProperty UserShadowStack

# 4) Cross-platform / ELF tarafı: GNU-property note SHSTK bit'ini oku (binutils).
#    readelf -n çıktısında "x86 feature: ... SHSTK" görünür.
readelf -n /path/to/binary | grep -i -A1 'NT_GNU_PROPERTY'

Get-ProcessMitigation çıktısındaki UserShadowStack ve UserShadowStackStrictMode alanları (sırasıyla Set-ProcessMitigation -Enable UserShadowStack / UserShadowStackStrictMode ile set edilir) shadow stack'in o image için zorunlu kılınıp kılınmadığını gösterir; AuditUserShadowStack ise audit-mode (block etmeden logla) durumudur.

Warning

CET yalnızca backward edge'i korur. Forward-edge hijack'leri (indirect call/jump'lar) Indirect Branch Tracking gerektirir — bkz. Control-flow Enforcement for indirect branch. RET'ten kaçınan counterfeit-object ve JOP tarzı saldırılar hâlâ geçerli olabilir.

Detection

  • #CP (control-protection) exception / crash telemetrisi — CET-enabled process'lerde tekrar eden STATUS crash'leri bir ROP chain denemesinin güçlü bir işaretidir.
  • control-flow protection fault'larına atıfta bulunan Windows Event log'ları / WER raporları.
  • EDR: shadow stack'lere opt-in yapan ama untrusted input işlerken erken crash olan process'ler; exploit-delivery vektörleriyle (dokümanlar, browser renderer'ları) ilişkilendir.
  • Audit-mode rollout (block etmeden logla) — enforcement öncesinde uyumluluk sorunlarını ve olası ihlalleri yüzeye çıkarmak için.

Mitigation

  • Destekleyen CPU'larda Hardware-enforced Stack Protection (user mode) ve Kernel-mode Hardware-enforced Stack Protection'ı etkinleştir.
  • Binary'lerin koruma talep etmesi için shadow-stack/CET uyumlu linker flag'i ile derle.
  • Forward-edge kapsamı için Control Flow Guard / eXtended Flow Guard ile, kodun doğrudan inject edilememesi için Data Execution Prevention ile birleştir.
  • CPU microcode'unu ve OS'u patch'li tut.

References