Skip to content

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:

if (nft_chain_is_bound(chain))
        return -EOPNOTSUPP;

Kavramsal tetikleyici (CAP_NET_ADMIN gerektirir, user namespace'ler üzerinden erişilebilir):

  1. Bir jump/immediate expression aracılığıyla bound (anonim) bir chain oluştur; chain ID'sini not et.
  2. O chain'i isimle değil NFTA_RULE_CHAIN_ID ile reference eden bir NEWRULE gönder — eksik kontrol geçmesine izin verir.
  3. 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_destroy warning'i bulunan bir KASAN use-after-free.
  • Binding chain'lere karşı NFTA_RULE_CHAIN_ID kullanan NEWRULE istekleri anormaldir.

Mitigation

  • 6.5-rc4'te 0ebc1064e4874d5987722a2ddbc18f94aa53b211 commit'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.

References