CVE-2026-78118
Açıklama
Kernel yardımcısı z_waitq_head() (kernel/include/wait_q.h), bir iş parçacığı bekleme kuyruğunun başını okur ancak SMP sistemlerde, bekleme kuyruğu mutasyonunu serileştiren zamanlayıcı spin kilidi _sched_spinlock tutulmadan birkaç yerden çağrılmıştır. Buna neden olan çağrı noktası, kernel/timer.c içindeki z_timer_expiration_handler()'dır; bu fonksiyon timer->wait_q değerini okurken yalnızca zamanlayıcı alt sistemi kilidi timer_lock'ı tutmuş, ardından elde ettiği iş parçacığının bekletilmesini kaldırmış, dönüş değerini ayarlamış ve iş parçacığını hazır hale getirmiştir. kernel/sched.c içindeki halt_thread(), iptal edilen bir iş parçacığını bekleme kuyruğundan kaldırırken yalnızca _sched_spinlock'ı tutar, dolayısıyla bu iki yol karşılıklı olarak dışlayıcı değildir. Bu pencere içerisinde başka bir CPU'da son bekleyen kaldırıldığında, sys_dlist_peek_head() liste nöbetçisini —k_timer nesnesinin kendisine işaret eden bir göstericiyi— struct k_thread * olarak döndürebilir (CONFIG_WAITQ_SCALABLE ile rb_get_min(), yeniden yapılandırılan bir ağacın rastgele bir düğümünü döndürebilir) veya zaten bekletilmesi kaldırılmış ve dinamik olarak tahsis edilmiş iş parçacıkları için serbest bırakılmış bir iş parçacığına işaret eden bir gösterici döndürebilir. Ardından işlemci, söz konusu nesneden okunan göstericiler aracılığıyla sys_dlist_remove() işlemini gerçekleştiren unpend_thread_no_timeout() fonksiyonunu ve gösterici üzerinden koşulsuz yazma yapan arch_thread_return_value_set() fonksiyonunu çağırır. Sonuç, süpervizör bağlamında sınır dışı (out-of-bounds) ve serbest bırakıldıktan sonra kullanım (use-after-free) yazmaları ile zamanlayıcı durum bozulmasıdır; daha hafif bir sonuç ise başka bir yerde tekrar beklemeye alınmış bir iş parçacığının, ilgisiz bir engelleme çağrısından başarılı bir dönüş değeriyle uyandırılmasıdır. Bu iç içe geçmeyi tetiklemek için gereken tüm primitifler —k_timer_start(), k_timer_status_sync(), k_thread_create() ve k_thread_abort()— sistem çağrılarıdır, bu nedenle CONFIG_USERSPACE etkinleştirildiğinde ayrıcalıksız bir kullanıcı modu iş parçacığı, çekirdek sahipliğindeki verilere karşı yarış durumu (race condition) denemesi yapabilir. İstismar; çoklu CPU derlemesi (CONFIG_MP_MAX_NUM_CPUS değerinin birden büyük olması; etkilenen bölge tek işlemcili hedeflerde işlem yapmaz), yerel kod yürütme ve dar bir zamanlama penceresini yakalamayı gerektirir, bu nedenle pratik sonuç genellikle kontrollü bir bozulmadan ziyade bir çekirdek çökmesidir. Düzeltme, yardımcı fonksiyonu halihazırda zamanlayıcı spin kilidini tutan çağrıcılar için z_waitq_head_locked() ve kilidi edinen z_waitq_head() olarak ikiye ayırır ve zamanlayıcı sona erme yöneticisinin baş okuma, bekletmeyi kaldırma ve hazırlama işlemlerini tek bir LOCK_SCHED_SPINLOCK bölgesi altına alır.
Nasıl düzeltilir
- zephyrproject zephyr4.5.0 ya da sonraki bir sürüm
Etkilenen ürünler
| Ürün | Etkilenen sürümler | Düzeltildiği sürüm |
|---|---|---|
| zephyrproject zephyr | 2.2.0 ≤ v < 4.5.0 | 4.5.0 |
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.