Skip to content

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ğı:

  1. Kullanıcı kontrollü udata field'ı (nla_memdup() aracılığıyla) kmalloc-256'ya düşen nft_chain yapılarını, ayrıca free edilmiş set ile çakışan sahte nft_rule nesnelerini spray et.
  2. Dangling set aracılığıyla açığa çıkan linked-list pointer'larından nft_expr_ops pointer'larını (KASLR break) ve heap adreslerini leak et.
  3. expr->ops pointer'ı attacker kontrollü olan sahte bir rule aracılığıyla RIP control elde et: silme işlemi nft_rule_expr_deactivate()expr->ops->deactivate() çağırır.
  4. 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

  • c1592a89942e9678f7d9c8030efa777c0d57edab commit'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.

References