B-PUAF universal rooting (CVE-2024-46740)¶
CVE-2024-46740'ın kavramsal kataloğu: bir use-after-free'ye çöken ve public "B-PUAF" universal-root chain'lerinde kullanılan bir Android
binderout-of-bounds-write.
B-PUAF nedir
"B-PUAF" burada bir proje codename'idir (binder physical/page use-after-free
chain'leri için); bu bir binder (drivers/android/binder.c) bug'ıdır, bir
GPU bug'ı değildir. CVE-2024-46740'ın bir GPU bileşeni yoktur.
Mechanism¶
Root cause
drivers/android/binder.c içinde, binder_transaction'da binder objeleri
arasındaki raw-data kopyası bir bounds check'ten yoksundur. Raw data, data
section boyutunu aştığında, kopya bitişik offsets section'ını overwrite eder.
Transaction cleanup sırasında bozuk offset'ler walk edilir ve arbitrary binder
node refcount'larını decrement etmek için kullanılır — node'ları erkenden
release eder ve diğer holder'ları dangling pointer'larla bırakır. OOB write
(CWE-787) tetikleyicidir; ortaya çıkan use-after-free (CWE-416) exploit
edilebilir state'tir.
Aşılan security boundary app sandbox → kernel'dır: binder her untrusted Android app'ten erişilebilir, dolayısıyla buradaki bir refcount-confusion UAF doğrudan bir local privilege escalation yüzeyidir.
Kavramsal buffer layout (şematik; boyutlar/sıralama kernel'e göre değişir):
binder transaction buffer
+------------------------+------------------------+
| data section | offsets section |
| (raw transaction data) | (binder object indices)|
+------------------------+------------------------+
| ^
| bounds check | bitişik (adjacent)
| yok / eksik |
v |
raw-data kopyası ──────┘
data section'ı aşar ve offsets array'ine taşar (OOB write, CWE-787)
cleanup walk:
bozuk offset ──► yanlış binder node ──► refcount-- (premature)
│
▼
node erken release edilir,
holder'da dangling pointer kalır
│
▼
use-after-free (CWE-416)
Walkthrough¶
Üst-seviye, public advisory ve "B-PUAF" tanımlarından:
- Offset'leri boz. Raw data'sı data section'ı aşıp offsets array'ine taşan
crafted bir
BINDER_WRITE_READtransaction submit et. - Premature free. Cleanup bir node refcount'unu erkenden decrement eder ve bir kernel objesini, dangling bir pointer kalırken free eder.
- Reclaim. Free edilmiş slab slot'unu attacker etkili bir objeyle yeniden allocate et; bu bir type confusion üretir.
- R/W → root kur. Confusion'ı bir kernel read/write'a dönüştür,
credentials/
taskstate'ini overwrite et ve SELinux'u yen. (Bkz.use-after-free,dirtycred-credential-swap.)
Detection¶
- Tutarsız data vs. offsets boyutlarıyla bozuk
BINDER_WRITE_READioctl'leri issue eden untrusted app'ler. - Kernel logları: binder oops'ları, binder path'lerinde
KASAN: use-after-free, beklenmedik node-release mesajları, etkilenen build'lerde panic'ler. - Sandboxed bir app UID'sinden anormal credential geçişleri / SELinux enforcing→permissive flip'leri; bir app UID'ye parent olan yeni root process'ler.
- Filo görünümü: 2024-11-05 patch seviyesinin altındaki cihazlar.
Mitigation¶
- Android Security Bulletin — November 2024 (2024-11-05 SPL) fix'ini uygula; fix 5.4 / 5.10 / 5.15 / 6.1 / 6.6 / 6.10 stable branch'lerine backport edildi (kesin point-release sürümleri için kernel.org stable changelog'a / linux-cve duyurusuna bakın).
- SELinux'u enforcing tut; app install kaynaklarını kısıtla.
- Test cihazlarında OOB'yi yüzeye çıkarmak için build-time KASAN / kernel hardening.