netfilter nftables CVE-2023-4147 privesc¶
NFTA_RULE_CHAIN_IDüzerinden bir bound chain'e rule eklemek reddedilmiyor; bu da bir rule'un zaten free edilmiş bir chain yapısını reference etmesine olanak veriyor — root'a yükseltilen bir use-after-free.
Mechanism¶
Note
Bir bound chain (NFT_CHAIN_BINDING flag'i, örneğin bir immediate/jump expression'a
bağlanmış anonim bir chain) onu bağlayan expression'a aittir ve onunla birlikte yok
edilebilir. Buradaki invariant şu: bir bound chain'e yeni bir rule eklenemez.
newrule path'i nft_chain_is_bound() kontrolünü yalnızca NFTA_RULE_CHAIN
name-lookup path'inde uyguluyordu, NFTA_RULE_CHAIN_ID id-lookup path'inde değil.
Yani zaten free edilmiş olabilecek bir bound chain'e bir rule eklenebiliyor; bu da bir UAF
üretiyor (WARNING ... nf_tables_chain_destroy olarak gözlemleniyor). Gerçek tetikleyici,
bir NFT_CHAIN_BINDING chain'ine karşı kullanılan NFTA_RULE_CHAIN_ID'dir.
Walkthrough¶
Fix, bound-chain reddini her iki lookup path'ini de kapsayacak şekilde taşıyor:
Kavramsal tetikleyici (CAP_NET_ADMIN gerektirir, user namespace'ler üzerinden erişilebilir):
- Bir jump/immediate expression aracılığıyla bound (anonim) bir chain oluştur; chain ID'sini not et.
- O chain'i isimle değil
NFTA_RULE_CHAIN_IDile reference eden birNEWRULEgönder — eksik kontrol geçmesine izin verir. - Bağlayan expression chain'i serbest bıraktığı anda rule'un reference'ı boşta kalır — use-after-free.
Warning
İkincil raporlamada bir public PoC referans gösteriliyor, ancak ayrıntılı exploit iç işleyişi bağımsız olarak doğrulanmadı; burada doğrulanan gerçekler vulnerable function, UAF mekanizması, etkilenen sürümler ve fix commit'idir. Exploit-primitive ayrıntılarını doğrulanmamış kabul edin.
Detection¶
- Trace içinde
nf_tables_chain_destroywarning'i bulunan bir KASAN use-after-free. - Binding chain'lere karşı
NFTA_RULE_CHAIN_IDkullananNEWRULEistekleri anormaldir.
Mitigation¶
- 6.5-rc4'te
0ebc1064e4874d5987722a2ddbc18f94aa53b211commit'iyle düzeltildi ("netfilter: nf_tables: disallow rule addition to bound chain via NFTA_RULE_CHAIN_ID").Fixes: d0e2c7de92c7("netfilter: nf_tables: add NFT_CHAIN_BINDING") olarak işaretli. Etkilenen aralıklar: 5.9–<5.10.190, 5.11–<5.15.124, 5.16–<6.1.43, 6.2–<6.4.8, 6.5-rc1..rc3. - Yerel erişimi kaldırmak için unprivileged user namespace'leri devre dışı bırakın.