CVE-2026-19939
Açıklama
AVDTP sinyalleşme katmanı, yerel cihaz bir AVDTP isteği gönderdiğinde avdtp_send_cmd() içinde 6 saniyelik bir komut zaman aşımı (AVDTP_TIMEOUT) kurar. subsys/bluetooth/host/classic/avdtp.c dosyasındaki her yanıt işleyicisi, bekleyen isteği temizlemeden önce session->timeout_work işlemini iptal eder ancak bt_avdtp_l2cap_disconnected() yalnızca session->req kısmını temizler ve ertelenebilir işlemi kurulu bırakır. struct bt_avdtp session yapısı, örnekleri bağlantı başına statik bir dizide bulunan struct bt_a2dp yapısının ilk üyesidir ve subsys/bluetooth/host/classic/a2dp.c içindeki a2dp_get_connection(), session->br_chan.chan.conn değeri NULL olduğu anda ilgili yuvayı memset() ile sıfırlar; bu durum L2CAP katmanı tarafından bağlantı kesme geri çağrımı döndükten hemen sonra gerçekleştirilir. Uzak bir Bluetooth BR/EDR eşi, AVDTP sinyalleşme kanalını açarak, yerel uygulamanın bir AVDTP prosedürü başlatmasına izin vererek (standart A2DP akışı bağlı geri çağrımdan bt_a2dp_discover() başlatır), ardından yanıt vermeden sinyalleşme kanalını kapatıp kalan zaman aşımı penceresi içinde kanalı yeniden açarak bu durumu tetikler. Yeniden bağlanma işlemi a2dp_accept() → a2dp_get_connection() aşamasına ulaşır ve çalışma öğesinin struct _timeout yapısı çekirdeğin genel zaman aşımı listesine hala bağlıyken tüm struct bt_a2dp yapısını sıfırlar. Hem bağlantının kesilme hem de yeniden kurulma anları saldırgan tarafından seçildiğinden herhangi bir yarış durumunun kazanılmasına gerek yoktur; şifreli bir BR/EDR bağlantısı gereklidir ve CONFIG_BT_A2DP (deneysel) etkinleştirilmiş olmalıdır. Varsayılan CONFIG_TIMEOUT_BACKEND_DLIST arka ucuyla çekirdek, bir zaman aşımının aktif olup olmadığına liste düğümünün bağlı olup olmadığını test ederek karar verir; dolayısıyla memset() işleminden sonra çekirdek, genel zaman aşımı listesinde hala bulunan bir düğümü boş olarak değerlendirir: duyuru yolu, bağlantıları ve işleyici işaretçisi NULL olan bir düğümü listeden çıkarır ve geri dönüştürülmüş oturum üzerindeki bir sonraki bt_work_reschedule() aynı düğümü zaten kendisini içeren bir listeye yeniden ekler. Bunun sonucu, her zamanlayıcının, zaman diliminin ve uyku modunun bağımlı olduğu tek çekirdek veri yapısının bozulmasıdır —sıfırlanmış veya bayat liste işaretçileri üzerinden yazmalar ve NULL işleyici dağıtımı— bu da sadece A2DP oturumuyla sınırlı bir hata yerine sistem genelinde bir çökmeye veya donmaya yol açar. Çözüm, bt_avdtp_l2cap_disconnected() fonksiyonunun başında session->timeout_work işlemini iptal eder ve k_work_init_delayable() fonksiyonunu avdtp_send_cmd() içerisinden oturum kurulum yolları olan bt_avdtp_connect() ve bt_avdtp_l2cap_accept() fonksiyonlarına taşır; böylece çalışma öğesi, bir bağlantı kesme geri çağrısı çalışmadan önce her zaman başlatılmış olur.
Nasıl düzeltilir
Etkilenen ürünler
| Ürün | Etkilenen sürümler | Düzeltildiği sürüm |
|---|---|---|
| zephyrproject zephyr | 3.7.0 ≤ v ≤ 4.4.2 | — |
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.