CVE-2026-72139
Açıklama
Linux çekirdeğinde aşağıdaki güvenlik açığı giderilmiştir: tcp: tcp_connect içinde md5sig_info kfree işlemini RCU grace period sonrasına ertele tcp_connect() (net/ipv4/tcp_output.c) içindeki md5+ao uzlaştırmasının iki simetrik dalı vardır: if (needs_md5) { tcp_ao_destroy_sock(sk, false); } else if (needs_ao) { tcp_clear_md5_list(sk); kfree(rcu_replace_pointer(tp->md5sig_info, NULL, ...)); } Her iki dal da, soket TCP_SYN_SENT durumundayken ve zaten inet ehash üzerindeyken (tcp_v4_connect() içinde inet_hash_connect() tarafından eklenmiş) soket başına bir auth-info nesnesini serbest bırakır. Her iki dala da, bh_lock_sock_nested() alınmadan önce ilgili info işaretçisini örtük RCU aracılığıyla yükleyen softirq RX yolu okuyucuları tarafından erişilebilir. needs_md5 dalı, önceki yamada tcp_ao_destroy_sock() içindeki call_rcu() serbest bırakmasının yeniden devreye alınmasıyla düzeltilmiştir: eşdeğer anahtar başına döngü, RCU geri çağrısı olan tcp_ao_info_free_rcu() içinde çalışır; dolayısıyla her tcp_ao_key'i serbest bıraktığı sırada, kapsayıcıyı yakalamış olan tüm softirq okuyucuları rcu_read_unlock() işlemini zaten tamamlamıştır. needs_ao dalı aynı şekilde simetrik değildir. Kapsayıcı serbest bırakması kfree_rcu(md5sig, rcu) aracılığıyla ertelenebilir -- struct tcp_md5sig_info gerekli rcu üyesini zaten taşır (include/net/tcp.h:1999-2002) ve ağacın geri kalanı bunu tcp_md5sig_info_add() geri alma yollarında zaten yapar (net/ipv4/tcp_ipv4.c:1410, 1436). Ancak anahtar başına yıkım, kapsayıcının RCU grace period'undan ÖNCE süreç bağlamında tcp_clear_md5_list() tarafından yapılır: bu işlev &md5sig->head üzerinde yürür ve her tcp_md5sig_key'i düz hlist_del + kfree ile serbest bırakır. __tcp_md5_do_lookup() / __tcp_md5_do_lookup_exact() (tcp_ipv4.c:1253, 1298) içindeki eşzamanlı bir softirq okuyucusu aynı listeyi hlist_for_each_entry_rcu() aracılığıyla yürür ve anahtarların kendileri üzerindeki bu düz kfree ile yarışır -- aynı yarış penceresinde, TCP-AO hatasıyla aynı sınıfta anahtar başına slab serbest bırakıldıktan sonra kullanım hatası. Bunu iki yarıda düzeltin: 1. tcp_connect() içindeki düz kfree() işlemini kfree_rcu() olarak değiştirin, böylece md5sig_info kapsayıcısı md5sig yaşam döngüsünün geri kalanına katılır. Yerel değişkenin yukarı taşınması mekaniktir ve gereklidir çünkü kfree_rcu() bir lvalue bekleyen bir makrodur. 2. tcp_clear_md5_list() işlevini RCU açısından güvenli hale getirin: hlist_del + kfree(key) yerine hlist_del_rcu + kfree_rcu(key, rcu) kullanın. struct tcp_md5sig_key rcu üyesini zaten taşır (include/net/tcp.h:1995) ve tcp_md5_do_del() (net/ipv4/tcp_ipv4.c:1456) zaten kfree_rcu kullanır; dolayısıyla bu, tek seferlik bir değişiklik getirmek yerine dosyanın geri kalanının izlediği yaşam döngüsü değişmezini geri yükler. tcp_clear_md5_list() işlevinin diğer çağıranı tcp_md5_destruct_sock() (net/ipv4/tcp.c:412) olup, soket zaten hash'ten çıkarılmış ve erişilemez durumdayken sock yıkıcısından çalışır; oradaki ek grace period gereksiz ancak zararsızdır. Yardımcı işlevi koşulsuz olarak RCU açısından güvenli hale getirmek daha temiz bir sözleşmedir. needs_ao dalına, AO tarafındaki splat'ı göstermek için kullanılan userns yeniden üreticisi tarafından erişilemez (yeniden üretici her iki anahtarı da kurar ancak connect eşi AO anahtarıyla değil MD5 anahtarıyla eşleştiği için needs_md5 dalında sonlanır); ancak simetrik yarış mevcuttur ve bu koda dokunan bir bakımcı hangi dalın RCU'dan kaçtığını ve hangisinin kaçmadığını düşünmek zorunda kalmamalıdır. [ayrıca bunun tcp-diag ile yarıştığını bulan Qihang'e teşekkürler]
Nasıl düzeltilir
- Linux Linux33a1bee413628378fd036a4f2b17ba86b0bc560c, da48b9bf1eb95a9cfd09d615ca58cfc2b03de369, b74cd55038905d5e74c1de109ab78a30b2ea0e1f ya da sonraki bir sürüm
Etkilenen ürünler
| Ürün | Etkilenen sürümler | Düzeltildiği sürüm |
|---|---|---|
| Linux Linux | 51e547e8c89c661f6fbede4a28b1d33b13625683 ≤ v < 33a1bee413628378fd036a4f2b17ba86b0bc560c, 51e547e8c89c661f6fbede4a28b1d33b13625683 ≤ v < da48b9bf1eb95a9cfd09d615ca58cfc2b03de369, 51e547e8c89c661f6fbede4a28b1d33b13625683 ≤ v < b74cd55038905d5e74c1de109ab78a30b2ea0e1f, 6.18 | 33a1bee413628378fd036a4f2b17ba86b0bc560c, da48b9bf1eb95a9cfd09d615ca58cfc2b03de369, b74cd55038905d5e74c1de109ab78a30b2ea0e1f |
Sürümünüzü kontrol edin
Ürünü seçin ve kullandığınız sürümü yazın; sürümün etkilenen aralıkta olup olmadığını görün.
Attack Surface Management
Alan adlarınıza bağlı varlıkları, bu varlıklarda çalışan teknolojileri ve bilinen zafiyetleri tek listede görün.