Skip to content

nf_tables catchall abort-path UAF (CVE-2026-23111)

Catchall abort/activate path'indeki tek bir ters çevrilmiş koşul chain->use'un geri yüklenmesini atlıyor; böylece her abort, hâlâ reference edilen bir chain free edilene kadar sayacı kalıcı olarak azaltıyor — root'a "tek karakter" uzaklıkta.

Alias

Bu canonical not'a, aynı CVE-2026-23111 bug'ını tarif eden nf_tables one-character privesc alias not'u (alias_of: nf-tables-catchall-abort-path-uaf) redirect eder.

Mechanism

Note

Abort path'inde nf_tables, değiştirmek üzere olduğu set element'lerini yeniden activate etmeli ve o element'lerin işaret ettiği chain'lerdeki reference count'ları geri yüklemelidir. Buradaki invariant: geri yüklenen her NFT_GOTO/NFT_JUMP verdict element'i için nft_data_hold() hedef chain'in chain->use'unu artırmalıdır. catchall element'inde ters çevrilmiş bir koşul, kodun tam olarak o element'leri atlamasına neden olur.

Public reproduction'a göre nft_map_catchall_activate() ters çevrilmiş bir nft_set_elem_active() testi içeriyor:

/* buggy */
if (!nft_set_elem_active(ext, genmask))
        continue;          /* wrongly skips the active catchall element */

Aktif catchall verdict element'i atlandığı için nft_setelem_data_activate()nft_data_hold() chain->use'u geri yüklemek üzere hiç çağrılmaz. Bu yüzden her abort döngüsü chain->use'u kalıcı olarak azaltır (bir chain->use underflow); sıfıra ulaştığında DELCHAIN chain'in artık reference edilmediğine inanır, başarılı olur ve catchall element'leri onu hâlâ reference ederken chain free edilir — bir use-after-free. Fix tek !'i kaldırarak koşulu catchall olmayan nft_mapelem_activate() path'iyle eşleştirir.

Walkthrough

Kavramsal reproduction (FuzzingLabs / Exodus; CONFIG_NF_TABLES ve unprivileged user namespace'ler gerektirir):

  1. Verdict'i bir hedef chain'e NFT_GOTO olan bir catchall element'e sahip bir map/verdict set kur.
  2. Atlanan geri yükleme nedeniyle her döngünün chain->use'tan bir reference sızdırdığı, abort eden transaction'ları tekrar tekrar gönder.
  3. chain->use sıfıra ulaştığında chain hâlâ reference edilirken free edilir — UAF.

Rapor edilen exploitation (FuzzingLabs):

  • Free edilmiş nft_chain'i yeniden allocate et, name field'ına kontrollü veri yerleştir.
  • Bir seq_operations spray'i aracılığıyla kernel base'i, ardından bir heap adresini leak et.
  • Control flow'u nft_chain_validate() üzerinden hijack et; bu fonksiyon her rule'un expression'larını dolaşır ve expr->ops->validate (bir function pointer) çağırır; msg_msg-2k slab belleğinde inşa edilen sahte yapıları kullanarak onu yeniden yönlendir, bir ROP zincirine stack-pivot yap ve root için modprobe_path'i overwrite et / SELinux'u devre dışı bırak.

Public sonuçlar bu UAF'ın güvenilirliğini boşta sistemlerde >%99, ağır yük altında ~%80 olarak bildiriyor (Debian Bookworm/Trixie ve Ubuntu 22.04/24.04 LTS genelinde).

Warning

Oliver Sieber (Exodus Intelligence) tarafından keşfedildi; FuzzingLabs tarafından bağımsız reproduction yapıldı; 2026-02-05'te yamalandı. 8fdb05de0e2db89d8f56144c60ab784812e8c3b7 fix commit'i FuzzingLabs tarafından rapor ediliyor ve tek kaynaklı kabul ediliyor.

Detection

  • Tekrarlanan transaction abort'larından sonra nft_chain_validate() / chain destroy içinde kök salan KASAN use-after-free.
  • Bir catchall-verdict map üzerinde abort transaction'larını döngüye sokan bir process anormaldir.

Mitigation

  • Distro güncellemelerini uygulayın (Ubuntu 22.04/24.04/25.10, Debian Bullseye/Bookworm/Trixie, RHEL 10, Amazon Linux, SUSE hepsi advisory yayınladı).
  • CAP_NET_ADMIN-in-netns erişimini kaldırmak için unprivileged user namespace'leri devre dışı bırakın.

References