Skip to content

Allocation Oracle (Information Hiding Entropy Reduction)

Memory okumadan information-hiding/ASLR'ı yen: address space'i allocation request'leriyle probe et ve gizli region'ın nerede olduğuna dair bir oracle olarak success/failure'ı kullan.

Mechanism

Neden çalışır

Information-hiding (IH) savunmaları — CPI'nın safe region'ı, JIT/CFI metadata'sı, isolated stack'ler — hassas bir alanı, devasa ve seyrek 64-bit virtual address space içinde rastgele gizli bir adrese yerleştirir ve attacker'ın onu bulamayacağına bahse girer. Onu bulmanın klasik yolu memory'yi okuyup bir pointer aramaktır, ama read/write ile probe etmek, map'lenmemiş bir hole'a dokunduğun an process'i crash eder.

Allocation oracle bu crash'i ortadan kaldırır. Adresleri dereference etmek yerine attacker, allocator'dan seçtiği bir boyutta memory map etmesini ister. Allocator, contiguous bir mapping'i yalnızca en azından o boyutta boş bir hole varsa yerleştirir; dolayısıyla allocation'ın success'ı ya da failure'ı, address space'teki gap'lerin boyutunu açığa çıkarır — read yok, write yok, crash yok.

Attacker, talep edilen boyut üzerinde binary-search yaparak gizli region'ı çevreleyen hole'ları ölçer ve konumunu çıkarır; böylece IH'in dayandığı entropy'yi çökertir. IH'in varsaydığı invariant — address space'in layout'u kendisi bir secret'tır — yanlıştır, çünkü allocator onu yapısal olarak leak eder. Oikonomopoulos ve diğerleri bunu gerçek server'lara (nginx, lighttpd) karşı gösterdi.

Walkthrough

Oracle bir komut satırı değil, bir primitive'dir; kavramsal olarak:

// Attacker controls an allocation primitive reachable in the victim
// (e.g. a request that triggers mmap of an attacker-influenced size).

size_t probe(size_t sz) {
    void *p = victim_alloc(sz);     // does the victim place a mapping of sz bytes?
    int ok = (p != NULL);           // success => a hole >= sz exists nearby
    victim_free(p);
    return ok;                      // 1 bit of layout information, no memory read
}

// Binary-search the largest allocatable size to size the gap, then
// repeat at chosen base hints to localize the hidden region. As the
// measured holes shrink, the candidate range for the hidden area
// narrows -> IH entropy is reduced to brute-forceable.

Beklenen davranış: arama ilerledikçe allocate edilebilir boyut, map'lenmiş region'lar arasındaki boş gap'i takip eder; allocation'ların fail etmeye başladığı sınır, map'lenmiş bir object'in kenarını işaretler ve attacker'ın çok sayıda probe boyunca gizli region'ın konumunu triangulate etmesine olanak tanır — hepsi tek bir fault'a yol açan access olmadan.

Bu information hiding'i hedef alır, ASLR entropy'sini değil

Oracle tam da IH savunmaları probe edilemez bir address space varsaydığı için çalışır. Bir write/control primitive ile doğal olarak eşleşir: gizli region bir kez konumlandırıldığında, secret metadata (örn. CPI'nın safe region'ı) erişilebilir hale gelir.

Mitigation

Onu durduran şey: allocation davranışını layout'tan bağımsız hale getirmek (placement'ı randomize etmek, oracle tarzı boyut probe'lamayı reddetmek), allocation primitive'ini güçlü biçimde sandbox'lamak ya da güvenlik için information hiding'e hiç güvenmemek — makalenin tezi, IH'in bu tür yapısal oracle'lar karşısında temelde zayıf olduğudur.

References