BaseSAFE: Baseband SAnitized Fuzzing through Emulation¶
BaseSAFE, closed-source MediaTek baseband kodunu Unicorn içinde rehost eder, AFL++ ile sürer ve heap overflow'ları cihaz dışında ortaya çıkarmak için sanitizing yapan bir drop-in heap allocator ekler.
Mechanism¶
Note
Cellular baseband'ler, modem içinde bir RTOS üzerinde koşan closed-source firmware blob'larıdır — bunları kolayca instrument edemezsiniz ve on-device fuzzing yavaş, gözlemlenmesi zor ve yıkıcıdır. Rehosting bunu aşar: yalnızca ilgilendiğiniz parser'ı firmware image'inden söküp alır ve onu bir workstation üzerindeki CPU emulator'da çalıştırırsınız; burada memory'yi siz kontrol eder, state'i snapshot'layabilir ve bir fuzzer bağlayabilirsiniz.
BaseSAFE bunu Unicorn CPU emulator'ı üzerine kurar ve AFL++'a bağlar; böylece coverage-guided fuzzing, emüle edilen baseband fonksiyonlarını yüksek hızda sürer. Memory-safety bug'larını bulmak için asıl kritik fikir sanitizing drop-in heap allocator'dır: BaseSAFE, baseband'in dahili allocator'ını kendi instrument edilmiş allocator'ı (red-zone'lu, poison'lı) ile değiştirir; böylece bir out-of-bounds write veya use-after-free tam gerçekleştiği anda tespit edilir — emulator memory'sini sessizce bozup çok daha sonra (ya da hiç) crash etmek yerine. Bu, "firmware çalışmaya devam etti" şeklindeki bir non-event'i, fuzzer'ın kaydedebileceği temiz, atfedilebilir bir crash'e dönüştürür.
Bunun bir teknik olarak neden önemli olduğu: baseband'in parser'ları attacker'ın etkilediği, network'ten gelen veriler üzerinde çalışır (radyo, trust boundary'dir). Rehost edilmiş + sanitize edilmiş bir harness, bir savunmacının ya da araştırmacının tam o parser'ları malformed input'larla çalıştırmasına ve aksi halde remotely exploitable olacak heap corruption'ları yakalamasına olanak tanır — gerçek bir rogue base station ya da hedef handset olmadan.
Walkthrough¶
Hedef: MediaTek'in Helio X10 (MT6795) baseband'i, Nucleus RTOS tabanlı bir
modem. BaseSAFE, rogue base station'dan erişilebilen parser'ları fuzz eden
proof-of-concept harness'lar sunar — özellikle NAS EMM (Mobility Management,
örn. ATTACH/ACCEPT decoder'ları) ve ERRC (LTE RRC, ASN.1 RRC
decoder'ları). Repository'deki iki örnek harness examples/ altında yer alır.
AFL++ tarafını build edin:
Bir harness'in tek bir input'a karşı tek seferlik çalıştırılması (bir örnek dizininden):
Coverage-guided bir fuzzing kampanyası başlatın (ERRC örneği):
cd examples/errc
cargo build --release
../../AFLplusplus/afl-fuzz -U -i connections/ -o out/ -m none -- target/release/errc_fuzz @@
-U flag'i AFL++'ı Unicorn mode'a alır; @@ ise mevcut input
dosyasının path'i ile değiştirilir. Seed input'lar her örneğin data/ /
connections/ dizinleri altında gelir (paper ile birlikte geniş bir LTE
signaling test case koleksiyonu yayımlandı).
Harness'in her iterasyonda yaptığı
- İlgili baseband firmware bölgesini Unicorn içine map'le.
- Baseband'in kendi heap rutinlerinin yerine BaseSAFE sanitizing allocator'ını kur (böylece her alloc red-zone'lu olur).
- AFL++'ın sağladığı input'u oku, parser'ın gelen mesajı beklediği yere yerleştir ve decoder fonksiyonunu emüle et.
- Decoder bir allocation'ın dışına yazarsa (heap OOB) ya da free edilmiş memory'ye dokunursa, sanitizer hemen fault verir ve AFL++ bir crash kaydeder.
Bu kurulumu kullanarak yazarlar, MediaTek baseband parser'larında heap out-of-bounds write'lar dahil memory corruption'lar buldu. Raporlanan throughput, core başına saniyede yüzlerce execution, core'lar genelinde toplamda saniyede ~15k test case.
Warning
Harness'lar MT6795 için belirli firmware image'lerine ve offset'lere bağlıdır; rehosting yalnızca emüle ettiğiniz slice kadar sadıktır, dolayısıyla harness dışındaki peripheral ve RTOS etkileşimleri stub'lanmıştır. Yetkili research/savunma analizi içindir.