Skip to content

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:

  1. Bir 64-bit process, ASLR'a (/DYNAMICBASE) ve high-entropy yerleşimine (/HIGHENTROPYVA, default) opt-in yapar.
  2. 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.
  3. 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.
  4. Attacker için kalan gerçekçi yol bir info leak'tir, ki high entropy onları tam olarak buna yatırım yapmaya zorlar.
  5. Verification (defensive): Build'in gerçekten opt-in yaptığını PE header'dan teyit et — gönderilen image üzerinde dumpbin /headers (veya link /dump /headers) çalıştır ve OPTIONAL HEADER VALUES altındaki DLL characteristics listesinde hem High Entropy Virtual Addresses (yani IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA bit'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ı):

> binskim.exe analyze "C:\path\*.exe" --output results.sarif

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

  • /HIGHENTROPYVA ve /DYNAMICBASE ile 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.

References