Zafiyet.live Keşfet. Değerlendir. Düzelt. Doğrula.
  • Yama var
  • Son 7 gün

CVE-2026-98870

Linux ksmbd: Bağlantı sonlandığında eski kanalların tüm oturumlardan kaldırılmaması nedeniyle bellek sonrası kullanım (use-after-free) açığı

Linux

Yüksek 8,8 CVSS 3.1
Yayımlandı
Güncellendi
24 Eki 2026
Açık yaşı
5 gün
Kaydı açan
Linux

ÖzetTürkçe

Linux çekirdeğindeki ksmbd bileşeninde, ksmbd_sessions_deregister fonksiyonu bir bağlantının kanallarını diğer oturumların kanal listelerinden yalnızca conn->binding bayrağı hâlâ ayarlıyken kaldırmaktadır. conn->binding geçici bir bayraktır; bağlama SESSION_SETUP işlemi tamamlandığında veya aynı bağlantı üzerinde sonraki bağlama dışı bir SESSION_SETUP işleminde (bağlanmış bir kanal üzerinde yeniden kimlik doğrulama ya da SessionId==0 ile yeni kurulum) temizlenir. Bu nedenle, bir bağlantı kanalını başka bir oturumun ksmbd_chann_list listesine bağladıktan sonra conn->binding bayrağını temizlerse, bağlantı koptuğunda o kanal sahip oturumun listesinde kalır. Kanalın chann->conn işaretçisi artık serbest bırakılmış bir ksmbd_conn yapısına işaret eder. Sahip bağlantı daha sonra sonlandığında, ikinci döngü bu bayat kanala erişir ve serbest bırakılmış ksmbd_conn yapısına yazma yapan bellek sonrası kullanım (use-after-free) oluşur; aynı bayat kanal /proc üzerinden show_proc_session tarafından da dolaşılır. Kanal listesi hiçbir zaman boşalmadığı için oturum da bellekte sızdırılmış olur. Düzeltme, bağlantının sonlandırılmasında conn->binding koşulunu kaldırarak her bağlantının kanallarını her oturumdan her zaman kaldırmasını sağlar. CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H vektörüne göre CVSS puanı 8.8 (YÜKSEK) olarak belirtilmiştir. Etkilenen sürümler: >= 5.15.222, < 5.16; düzeltme sürüm 5.16 içindedir.

Kaynaktaki açıklama (İngilizce)

In the Linux kernel, the following vulnerability has been resolved:

ksmbd: remove stale channels from all sessions on teardown

ksmbd_sessions_deregister() removes a connection's channels from other
sessions' channel lists only while conn->binding is still set:

if (conn->binding) {
hash_for_each_safe(sessions_table, ...)
ksmbd_chann_del(conn, sess);
}

conn->binding is a transient flag: it is cleared once a binding
SESSION_SETUP completes, and also by a subsequent non-binding
SESSION_SETUP on the same connection (a reauthentication on a bound
channel, or a new SessionId==0 setup). A connection that has bound a
channel into another session's ksmbd_chann_list and then clears
conn->binding leaves that channel behind when it disconnects: the
channel, whose chann->conn points at the now freed struct ksmbd_conn,
stays on the owner session's list.

When the owning connection later tears down, the second loop
dereferences the stale channel:

xa_for_each(&sess->ksmbd_chann_list, chann_id, chann)
if (chann->conn != conn)
ksmbd_conn_set_exiting(chann->conn); /* freed */

which is a use-after-free write into the freed ksmbd_conn (the same
stale channel is also walked by show_proc_session() through /proc). The
session is leaked as well, because its channel list never empties.

Remove the conn->binding gate so a connection always removes its
channels from every session on teardown.

Bu açığın açıklamasını Türkçeye çevirdik. Adım adım çözüm önerilerini kritik ve yeni açıklar için hazırlıyoruz; düzeltilmiş sürüm aşağıdaki tabloda, ayrıntılar üreticinin duyurusunda.

Etkilenen sürümler1 yazılım

YazılımEtkilenenDüzeltildiği sürüm
Linux ≥ 5.15.222, < 5.16 5.16

Kaynaklar7 kaynak

Kayıt geçmişi

  1. Yayımlandı

İlgili açıklar

Türkçe metin, resmi kayıtlardaki bilgilerle yapay zekâ yardımıyla yazıldı ve yayından önce otomatik kontrollerden geçti. Bir değişikliği uygulamadan önce üreticinin duyurusuna mutlaka bakın.