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)
RETanı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):
- 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).
- Her
CALL'da return address hem data stack'e hem de shadow stack'e push edilir. - Bir güvenlik açığı saldırgana stack-buffer overflow verir; saldırgan kaydedilmiş return address'i bir gadget pointer'ı ile ezer — klasik ROP kurulumu.
RETanında CPU, (sahte) data-stack address'ini pop eder ama onu el değmemiş shadow-stack address'iyle karşılaştırır.- 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_SHSTKMSR/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 edenSTATUScrash'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.