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.