Skip to content

offset2lib

64-bit Linux'ta bir ASLR zayıflığı: executable PIE-derlendiğinde aynı mmap region'ında shared library'lere bitişik map edilir, böylece executable'daki bir adresi leak etmek libc'yi sabit bir offset üzerinden açığa çıkarır — "offset2lib".

Mechanism

Note

64-bit Linux'ta bir PIE (Position Independent Executable), dynamic loader tarafından shared library'lerle aynı mmap alanına yüklenir, tam libc'nin yanına paketlenir. Bu yüzden executable ile library'ler arasındaki randomization entropy paylaşır: herhangi bir executable adresi ile karşılık gelen libc adresi arasındaki mesafe, tam ASLR etkin olsa bile çalıştırmalar arasında sabittir. Marco-Gisbert ve Ripoll bu sabite offset2lib adını verdi. Sonuç: uygulamaya ait tek bir adresi leak etmek (ya da executable'ı brute force ile de-randomize etmek), saldırganın diğer her mmapped region'ı — library'ler, mapped dosyalar — onların randomization'ını bağımsız olarak yenmeden, sabit bir offset ekleyerek hesaplamasına izin verir.

Zayıflık, aksi takdirde güçlü olan üç savunmadan aynı anda zincirlenir: NX, ASLR ve stack-smashing protector (SSP). Özgün çalışma, vulnerable bir PIE server'a karşı üçünün de tam bir bypass'ını bir saniyenin altında gösterdi.

Walkthrough

Yayınlanan proof-of-concept (bir forking server), fork()'lanan bir child'ın parent'ın address space layout'unu koruduğundan yararlanarak executable'ı byte-byte de-randomize eder, böylece her tahmin yeniden randomize edilmeden test edilebilir.

1. Leak / brute-force ONE address inside the PIE executable.
2. base_exec  = leaked_addr - known_offset_within_executable
3. base_libc  = base_exec   + offset2lib        # the fixed distance
4. Build a ret2libc / ROP chain at base_libc (e.g. system("/bin/sh")).

Warning

Brute force, bir forking server'ın child'ları parent ile aynı layout'ta yeniden spawn etmesi nedeniyle uygulanabilirdir: yanlış bir tahmin child'ı crash ettirir, doğru bir tahmin etmez, böylece saldırgan tam ASLR entropy'siyle savaşmak yerine prob başına bir bit/byte öğrenir. Bu, ASLR brute force'un istismar ettiği aynı özelliktir.

Offset neden sabit

Loader, executable'ı ve library'leri bitişik yerleştirdiği için, göreli layout link/load anında sabitlenir. "Executable'ın mutlak entropy'sinden, executable'dan heap/library'lere olan daha az entropy mesafesi" vardır, bu yüzden executable region'ı ele geçirmek, library region'ını fiilen bedavaya ele geçirir. Düzeltme, executable'ı mmap/library base'inden bağımsız olarak randomize etmektir (ASLR-NG ve sonraki kernel değişikliklerinin aldığı yön).

Mitigation

  • PIE executable'ı, library'lerden ayrı bir randomized region'da map et, böylece sabit bir offset2lib var olmasın (ASLR-NG / iyileştirilmiş kernel ASLR).
  • ASLR'ı doğru yapılmış PIE ile birlikte kullan; executable ve libc entropy paylaşırsa PIE tek başına yardımcı olmaz.
  • fork/respawn'da yeniden randomize ederek ve crash'leri rate-limit ederek forking-server brute force'unu yen.

References