CVE-2026-23435
Açıklama
Linux çekirdeğinde aşağıdaki güvenlik açığı giderilmiştir: perf/x86: Event pointer kurulumunu x86_pmu_enable() içinde daha erkene taşıyın Üretim ortamındaki bir AMD EPYC sistemi, PMU NMI işleyicisinde bir NULL pointer dereference nedeniyle çökmüştür: BUG: kernel NULL pointer dereference, address: 0000000000000198 RIP: x86_perf_event_update+0xc/0xa0 Call Trace: <NMI> amd_pmu_v2_handle_irq+0x1a6/0x390 perf_event_nmi_handler+0x24/0x40 Hatalı komut, RDI=0 iken `cmpq $0x0, 0x198(%rdi)` şeklindedir ve bu durum, x86_perf_event_update() içindeki hwc = &event->hw ve event değerinin NULL olduğu `if (unlikely(!hwc->event_base))` kontrolüne karşılık gelmektedir. CPU 106 üzerindeki vmcore'un drgn incelemesi, cpuc->active_mask ile cpuc->events[] arasında bir uyumsuzluk olduğunu göstermiştir: active_mask: 0x1e (bitler 1, 2, 3, 4) events[1]: 0xff1100136cbd4f38 (geçerli) events[2]: 0x0 (NULL, ancak active_mask bit 2 ayarlı) events[3]: 0xff1100076fd2cf38 (geçerli) events[4]: 0xff1100079e990a90 (geçerli) events[2]'yi doldurması gereken olay, event_list[2] içerisinde hw.idx=2 ve hw.state=0x0 olarak bulunmuştur; bu da x86_pmu_start()'ın çalıştığını (hw.state'i temizler ve active_mask'i ayarlar) ancak events[2]'nin hiçbir zaman doldurulmadığını doğrulamaktadır. Başka bir olay (event_list[0]), hw.state=0x7 (STOPPED|UPTODATE|ARCH) değerine sahipti; bu da PMU olayları yeniden planladığında durdurulmuş olduğunu göstererek throttle-then-reschedule dizisinin gerçekleştiğini doğrulamıştır. Kök neden, cpuc->events[idx] atamasını x86_pmu_start() dışına çıkarıp x86_pmu_enable()'ın 2. adımına, PERF_HES_ARCH kontrolünden sonraya taşıyan 7e772a93eb61 ("perf/x86: Fix NULL event access and potential PEBS record loss") commit'idir. Bu durum, x86_pmu_enable() üzerinden geçmeden pmu->start() çağıran tüm yolları —özellikle de unthrottle yolunu— bozmuştur: perf_adjust_freq_unthr_events() -> perf_event_unthrottle_group() -> perf_event_unthrottle() -> event->pmu->start(event, 0) -> x86_pmu_start() // active_mask'i ayarlar ancak events[]'i ayarlamaz Yarış durumu (race sequence) şöyledir: 1. Bir grup perf olayı taşar ve perf_event_throttle_group() aracılığıyla grup kısıtlamasını (throttle) tetikler. Tüm olaylar durdurulur: active_mask bitleri temizlenir, events[] korunur (7e772a93eb61 commit'inden sonra x86_pmu_stop artık events[]'i temizlememektedir). 2. Hala kısıtlanmışken (PERF_HES_STOPPED), diğer zamanlama etkinlikleri nedeniyle x86_pmu_enable() çalışır. Sayaçların taşınması gereken durdurulmuş olaylar için PERF_HES_ARCH ayarlanır ve events[old_idx] temizlenir. x86_pmu_enable()'ın 2. adımında, PERF_HES_ARCH bu olayların atlanmasına neden olur — events[new_idx] asla ayarlanmaz. 3. Zamanlayıcı tıkı (timer tick), pmu->start() aracılığıyla grubu kısıtlama dışı bırakır (unthrottle). 7e772a93eb61 commit'i events[] atamasını x86_pmu_start()'dan kaldırdığı için, active_mask[new_idx] ayarlanır ancak events[new_idx] NULL kalmaya devam eder. 4. Bir PMC taşma NMI'sı tetiklenir. İşleyici aktif sayaçları gezer, active_mask[2]'nin ayarlı olduğunu görür, NULL olan events[2]'yi okur ve bunu dereference ederek çöker. x86_pmu_enable() içindeki cpuc->events[hwc->idx] atamasını PERF_HES_ARCH kontrolünden öncesine taşıyarak, hemen başlatılmayan olaylar için bile events[] dizisinin doldurulması sağlanmıştır. Bu, pmu->start() üzerinden giden unthrottle yolunun her zaman geçerli bir event pointer bulmasını sağlar.
Nasıl düzeltilir
- linux linux_kernel6.18, 6.18.20, 6.19.10 ya da sonraki bir sürüm
Etkilenen ürünler
| Ürün | Etkilenen sürümler | Düzeltildiği sürüm |
|---|---|---|
| linux linux_kernel | 6.17.13 ≤ v < 6.18, 6.18.2 ≤ v < 6.18.20, 6.19.1 ≤ v < 6.19.10, 6.19, 7.0 | 6.18, 6.18.20, 6.19.10 |
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.