netfilter nf_tables CVE-2024-26925 abort race¶
Abort path'inde GC sequence critical section'ı içinde commit mutex'i bırakılır, böylece async GC worker araya girip expired object'leri toplar ve bir double-free'ye yol açar.
Mechanism¶
Note
nf_tables, expired set element'lerin garbage collection'ını bir generation
sequence ile korur: nft_gc_seq_begin() … nft_gc_seq_end(). Invariant,
commit mutex'inin o pencere boyunca kesintisiz tutulması gerektiğidir,
böylece başka bir CPU'daki asynchronous GC worker aynı sequence'te
çalışamasın. Abort path bunu bozdu.
Resmi kayıt: "The commit mutex should not be released during the critical section between nft_gc_seq_begin() and nft_gc_seq_end(), otherwise, async GC worker could collect expired objects and get the released commit lock within the same GC sequence."
Sorunlu release, bir modül dependency'sini yüklemek için mutex'i geçici olarak
bırakıp yeniden alan ve sonra transaction'ı replay eden
nf_tables_module_autoload()'dan geldi. Lock'u sequence ortasında bırakmak, async
GC worker'ın commit lock'u aynı sequence number içinde kapmasına izin verir,
güvenli set GC'sinin dayandığı varsayımı bozar — ve sonra ikinci kez free edilen
bir object'i toplar (double-free → LPE).
Walkthrough¶
Fix, mutex release'ini abort phase'inin sonuna, nft_gc_seq_end()'den sonraya
taşır, böylece GC sequence penceresine lock olmadan asla yeniden girilmez.
Kavramsal tekrar üretim path'i (race; CAP_NET_ADMIN gerektirir, user
namespace'leri üzerinden reachable):
nf_tables_module_autoload()'u zorlayan (henüz yüklenmemiş bir modüle atıfta bulunan bir rule/expr) ve sonra abort eden bir nf_tables batch submit edin.- Eşzamanlı olarak set element'lerini yaşlandırın, böylece async GC worker çalışmaya uygun olsun.
- Abort path mutex'i sequence ortasında release ettiğinde, GC worker, abort logic'inin de free ettiği expired bir object'i toplar — bir double-free.
Warning
Çoğu nf_tables race'i gibi, exploit edilebilirlik dar bir pencereyi kazanmaya bağlıdır; reliability, CPU'ları pin'lemekten ve autoload/abort döngüsünü tekrar tekrar pompalamaktan gelir. Devam eden exploitation, double-free edilen chunk'ın standart slab reclaim'ini kullanır.
Detection¶
- nf_tables async GC worker'ında (
nft_trans_gc_*) ya danf_tables_abort()'ta köklenen KASAN double-free / use-after-free raporları. - Modül autoload tetikleyen tekrarlı NEWTABLE/abort batch'leri, bir unprivileged process'ten anormaldir.
Mitigation¶
- Mainline'da commit
0d459e2ffb541841714839e8228b845458ed3b27(v6.9-rc3) ile, stable line'lar boyunca backport'larla düzeltildi (4.19.316+, 5.4/5.10/5.15/6.1/6.4/6.5–6.8.4 serileri). Kuan-Ting Chen (DEVCORE) tarafından raporlandı. - Local reach'i kaldırmak için unprivileged user namespace'leri kısıtlayın.