High Entropy ASLR (HEASLR)¶
Image ve allocation base'lerine 32-bit ASLR'ın yapabildiğinden çok daha fazla entropy eklemek için tam 64-bit address space'i kullanan Windows 64-bit bottom-up randomization'ı.
Mechanism¶
Why entropy is the security property
ASLR, brute force'a ve tahmine yalnızca randomize edilmiş bir base'deki entropy bit sayısıyla orantılı olarak direnir. 32-bit Windows'ta kullanılabilir address space o kadar küçüktür ki yalnızca bir avuç bit randomize edilebilir; bu yüzden klasik ASLR bazen spraying veya brute force ile yenilebiliyordu. High Entropy ASLR (HEASLR), çok daha büyük 64-bit virtual address space'i kullanır: bir 64-bit process'in bottom-up allocation'ları (heap'ler, stack'ler ve rebase edilmiş image'ler) Microsoft'un belgelerine göre 24 bit'e kadar ek entropy — kabaca 1 TB'lik varyans ile yerleştirilebilir. Daha fazla entropy, information leak'i olmayan bir attacker'ın üstel olarak daha büyük bir arama uzayıyla karşılaşması anlamına gelir ve guess-and-brute-force stratejilerini pratik olmaktan çıkarır.
HEASLR, link zamanında /HIGHENTROPYVA seçeneğiyle istenir; bu seçenek, 64-bit-aware bir kernel'e image'in 64-bit space'in herhangi bir yerine yerleştirilmesinin güvenli olduğunu söyleyen bir PE header flag'i (IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA) set eder. Modern toolchain'lerde 64-bit image'ler için default olarak etkindir, ama yalnızca /DYNAMICBASE de set edildiğinde devreye girer (high-entropy yerleşiminin bir anlam ifade etmesi için ASLR'ın açık olması gerekir). 32-bit image'ler için görmezden gelinir. Exploit Protection terimleriyle HEASLR, Randomize memory allocations (Bottom-up ASLR)'ın high-entropy modudur; "Don't use high entropy" toggle'ı onu devre dışı bırakır.
Walkthrough¶
Faydanın kavramsal reproduction'ı, Microsoft /HIGHENTROPYVA ve Exploit Protection referanslarından:
- Bir 64-bit process, ASLR'a (
/DYNAMICBASE) ve high-entropy yerleşimine (/HIGHENTROPYVA, default) opt-in yapar. - Load ve allocation zamanında kernel, dar low 4 GB yerine geniş 64-bit aralıktan base'ler seçer ve bottom-up allocation'lara ~24 bit entropy ekler.
- Yalnızca bir corruption primitive'i tutan — ama pointer leak'i olmayan — bir attacker, devasa bir aralıktan bir base tahmin etmek zorundadır; tekrarlayan tahminler istatistiksel olarak umutsuzdur ve hardened bir process'te başarmak yerine hedefi crash ettirir.
- Attacker için kalan gerçekçi yol bir info leak'tir, ki high entropy onları tam olarak buna yatırım yapmaya zorlar.
- Verification (defensive): Build'in gerçekten opt-in yaptığını PE header'dan teyit et — gönderilen image üzerinde
dumpbin /headers(veyalink /dump /headers) çalıştır veOPTIONAL HEADER VALUESaltındakiDLL characteristicslistesinde hem High Entropy Virtual Addresses (yaniIMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VAbit'i) hem de Dynamic base satırlarının bulunduğunu doğrula. İkisi birlikte göründüğünde HEASLR aktiftir; Dynamic base yoksa high-entropy flag'i kernel tarafından görmezden gelinir.
> dumpbin /headers app.exe
...
OPTIONAL HEADER VALUES
...
8160 DLL characteristics
High Entropy Virtual Addresses
Dynamic base
NX compatible
Terminal Server Aware
İllustrative-only çıktı; gerçek değerleri kendi image'inde doğrula. Toplu auditing için BinSkim ile aynı kontrolü tek satırda koşturabilirsin (BA2015 EnableHighEntropyVirtualAddresses / BA2009 EnableAddressSpaceLayoutRandomization kuralları):
Pointer-truncation incompatibility
Bazı uygulamalar, her base'in 4 GB'ın altında oturduğunu varsayarak pointer'ları 32-bit variable'larda saklar. Böyle kod high-entropy 64-bit base'ler altında kırılır; bu yüzden Windows, daha düşük entropy'li bottom-up randomization'a geri düşmek için per-app bir "Don't use high entropy" seçeneği sağlar.
Detection¶
- HEASLR önleyici bir özelliktir, runtime bir detector değil. İlgili posture sinyali binary auditing'tir: gönderilen EXE/DLL'leri enumerate et ve high-entropy VA / dynamic-base PE karakteristiklerini eksik olan image'leri işaretle (BinSkim veya hardening linter'ları gibi araçlar bunu raporlar).
- Bir legacy uygulamada high entropy etkinleştirildikten/zorlandıktan kısa süre sonra gelen crash'ler, bir saldırıdan ziyade pointer-truncation uyumsuzluğunu gösterir.
Mitigation¶
/HIGHENTROPYVAve/DYNAMICBASEile 64-bit build et (ikisi de modern MSVC'de default), böylece image'ler maksimum-entropy randomize edilmiş base'ler alır.- Exploit Protection'da Bottom-up ASLR high-entropy'yi etkin tut; yalnızca doğrulanmış pointer-truncation uyumsuzlukları için "Don't use high entropy"ye geri düş.
- Force randomization for images (Mandatory ASLR) ile eşleştir, böylece opt-in yapmayan module'ler bile rebase edilir — onsuz, tek bir fixed-base legacy DLL entropy kazanımını baltalar.
- Güvenlik açısından hassas yazılım için 64-bit build'leri tercih et; entropy avantajı 32-bit image'ler için temelden mevcut değildir.
Randomization gücünü artırmanın kernel tarafındaki karşılığı için bkz. Kernel ASLR.