Skip to content

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:

./build_afl.sh

Bir harness'in tek bir input'a karşı tek seferlik çalıştırılması (bir örnek dizininden):

cargo run data/pcch.raw

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ığı
  1. İlgili baseband firmware bölgesini Unicorn içine map'le.
  2. Baseband'in kendi heap rutinlerinin yerine BaseSAFE sanitizing allocator'ını kur (böylece her alloc red-zone'lu olur).
  3. AFL++'ın sağladığı input'u oku, parser'ın gelen mesajı beklediği yere yerleştir ve decoder fonksiyonunu emüle et.
  4. 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.

References