Crash-Resistant Oriented Programming¶
Belleği probe etmek ve gerçek fonksiyonları fault-tolerant şekilde chain'lemek için legitimate exception handling'i (SEH/VEH + VirtualQuery) bir crash-resistance primitive olarak kullan; ASLR'yi, fine-grained/JIT re-randomization'ı ve information-hiding savunmalarını yen.
Mechanism¶
Note
Normalde wild bir memory read process'i crash ettirir, dolayısıyla attacker'a tek
bir deneme kalır. CROP (Gawlik et al., NDSS 2016), target'ın kendi exception
machinery'sinden bir crash-resistance primitive inşa eder: Windows
Structured/Vectored Exception Handling (try/except, VEH) artı VirtualQuery(),
kodun keyfi adresleri probe etmesine ve ortaya çıkan access violation'ları
yakalamasına izin verir; ölmek yerine resume eder. Bu, tüm address space'i
taramak için bir memory oracle — fault'lardan sağ çıkan bir read primitive —
sağlar. CROP aslında platform-agnostic bir kavramdır: Windows'ta crash-resistance
SEH/VEH ile kurulurken Linux/macOS'ta aynı primitive POSIX signal handler'ları
(SIGSEGV yakalama) üzerinden inşa edilir — bu belge Windows/browser variant'ına
odaklanır, ama paper her iki platformu da test etti (aşağıdaki ~718 probe/s Windows
ve ~18,357 probe/s Linux Firefox ölçümleri bu cross-platform implementasyonu
yansıtır). Function chaining (gerçek, halihazırda mevcut fonksiyonları
fault-tolerant bir loop içinde invoke etme) ile birleştiğinde, herhangi bir
control-flow hijack olmadan layout'u derandomize eder ve gizli veriyi okur;
böylece ASLR'yi, fine-grained code re-randomization'ı, JIT-ROP savunmalarını ve
crash'lerin bir taramayı durduracağını varsayan information-hiding şemalarını
(CPI, Readactor) kırar.
Walkthrough¶
Kavramsal probe loop'u:
DWORD probeMemory(void *addr) {
__try {
volatile char c = *(char*)addr; // may fault
return PROBE_READABLE;
} __except (EXCEPTION_EXECUTE_HANDLER) {
return PROBE_FAULT; // caught -> keep scanning
}
}
// or query permissions without faulting:
MEMORY_BASIC_INFORMATION mbi;
VirtualQuery(addr, &mbi, sizeof(mbi));
Saldırı taslağı (paper'dan):
- Native code'a call yapma veya read tetikleme yeteneğine sahip bir memory-disclosure/scripting foothold'undan (örn. bir browser) bootstrap et.
- Module base'lerini / TEB'i bulmak için crash-resistant oracle ile tara; paper ~18,357 probe/s (64-bit Firefox/Linux) ve ~718/s (Firefox/Windows) gibi throughput'lar raporlar.
- API'leri
GetProcAddress()ile resolve et (yalnızca bir module base gerekir) ve gerçek fonksiyonları chain'le; paper, tam da EMET/CCFIR gibi savunmaların onları blacklist'lemediği içinLdrInitShimEngineDynamicgibi girişleri kullanır. - Kurtarılan layout'u, diversification/info-hiding savunmasını yenmek ve gerçek payload'ı stage etmek için kullan.
Warning
CROP tek başına code execution değil, bir derandomization / read tekniğidir; değeri, sonraki ROP/JOP'u attacker'ların crash'lemesine dayanan savunmalara karşı güvenilir kılmaktır.
Detection¶
- Process içinde handle edilen anormal derecede yüksek access-violation/exception
oranları; SEH/VEH kurulumuna ve address space üzerindeki
VirtualQuerytaramalarına ilişkin telemetry.
Mitigation¶
- Exception-driven probing'i kısıtlama/izleme, destructive read'lerle execute-only memory ve function-chaining adımını kısıtlayan CFI; paper, fault'ları attacker kodu için non-resumable kılan savunmaları motive eder.