nf_tables anonymous set UAF (CVE-2023-32233)¶
Silinen bir anonymous set bir sonraki generation'da inactive olarak işaretlenmiyor, bu yüzden bir batch request onu hâlâ update/destroy edebiliyor — arbitrary kernel read/write'a ve root'a dönüştürülen bir use-after-free.
Mechanism¶
Note
nf_tables bir generation (genmask) şeması kullanır: bir anonymous set'i bağlayan bir
rule bir transaction içinde silindiğinde, set bir sonraki generation'ın "inactive"
durumuna geçirilmelidir ki hiçbir update'in ona dokunamaması sağlansın. Buradaki bug,
nf_tables_deactivate_set()'in silme sırasında anonim bir nft_set'i inactive olarak
işaretlememesi; bu yüzden eski reference'lar nf_tables_commit()'e kadar hayatta kalıyor.
Set hiçbir zaman inactive olarak işaretlenmediğinden, bir kullanıcı zaten kaldırılmak üzere planlanmış bir set üzerinde hâlâ update'ler veya ikinci bir deactivate+destroy gerçekleştirebiliyor; bu da wild write'lar üretiyor (KASAN, commit sırasında geçersiz bir adrese yapılan bir write rapor ediyor).
Walkthrough¶
Fix, nf_tables_activate_set() ekliyor ve activate path'lerini
(nft_dynset_activate, nft_lookup_activate, nft_objref_map_activate) yeniden
düzenliyor: "silinen anonymous set'leri bir sonraki generation'da inactive olarak işaretle
… Transaction abort edilirse generation bitmask'ini temizle."
Google kernelCTF exploitation taslağı:
- Kullanıcı kontrollü
udatafield'ı (nla_memdup()aracılığıyla) kmalloc-256'ya düşennft_chainyapılarını, ayrıca free edilmiş set ile çakışan sahtenft_rulenesnelerini spray et. - Dangling set aracılığıyla açığa çıkan linked-list pointer'larından
nft_expr_opspointer'larını (KASLR break) ve heap adreslerini leak et. expr->opspointer'ı attacker kontrollü olan sahte bir rule aracılığıyla RIP control elde et: silme işleminft_rule_expr_deactivate()→expr->ops->deactivate()çağırır.- ROP "Telefork":
find_task_by_vpid(1)→switch_task_namespaces()(init_nsproxy) →commit_creds(&init_cred).
Warning
Patryk Sondej ve Piotr Krysiuk tarafından rapor edildi; user namespace'ler aracılığıyla unprivileged bir kullanıcıdan erişilebilir.
Detection¶
nf_tables_commit()içinde KASAN use-after-free / wild write.- Anonymous set'leri silen ve hemen yeniden reference eden batch'ler anormaldir.
Mitigation¶
c1592a89942e9678f7d9c8030efa777c0d57edabcommit'iyle düzeltildi ("netfilter: nf_tables: deactivate anonymous set from preparation phase"). 6.3.1'e kadar etkilenir.- Yerel erişimi kaldırmak için unprivileged user namespace'leri devre dışı bırakın.