CVE-2026-99005 in Linuxinformação

Sumário

de VulDB • 24/10/2026

No kernel do Linux, a seguinte vulnerabilidade foi resolvida:

drm/i915/gt: Desmascarar interrupções apenas quando ACTIVE for verdadeiro.

Existe uma pequena janela de corrida (race condition) entre `intel_rps_boost()` lendo um estado ACTIVE obsoleto e enfileirando `rps->work`, onde o valor de ACTIVE pode ser alterado por chamadas assíncronas acionadas pela liberação do wakeref (`wakeref drop`). Isso significa que `rps_work()` poderia ser acionado após o GT ter sido estacionado (parked), fazendo com que a desmascaramento das interrupções RPS PM ocorresse sem segurar o bloqueio de energia em tempo real (PM wakelock). Esta sequência de eventos pode ser observada durante o teste unitário `live_rc6_ctx_wa()`:

1) live_rc6_ctx_wa() -> intel_engine_pm_put() -> wakeref_put()

ASSÍNCRONO 1) callback do wakeref_put() -> __engine_park() -> intel_gt_pm_put_async() -> intel_gt_pm_put_async_untracked() -> intel_wakeref_put_async()

ASSÍNCRONO 2) callback do wakeref_put_async() -> __gt_park() -> intel_rps_park() -> intel_rps_clear_active() [limpa ACTIVE]
COM INTERRUPÇÕES: -> rps_disable_interrupts() -> cancel_work_sync(rps->work) -> rps_reset_interrupts() [rps->pm_iir = 0]
SEM INTERRUPÇÕES (modo TIMER): -> rps_stop_timer() -> cancel_work_sync(rps->work)

2) live_rc6_ctx_wa() -> intel_gt_wait_for_idle() -> intel_gt_retire_requests_timeout() -> dma_fence_wait_timeout() -> ops->wait() [i915_fence_wait()]
-> i915_request_wait_timeout() -> intel_rps_boost() -> intel_rps_is_active() [verifica ACTIVE]
[JANELA DE CORRIDA ABERTA]
-> queue_work(rps->work) -> retire_requests() -> i915_request_retire() -> intel_rps_dec_waiters() [de 1 para 0]

Se ASSÍNCRONO 1 e ASSÍNCRONO 2 forem executados durante a [JANELA DE CORRIDA ABERTA], então:

3) rps_work() é executado na fila de trabalho (workqueue) e pode satisfazer o teste "(!pm_iir && !client_boost)" (no modo TIMER, rps->pm_iir é zerado por uma chamada anterior a rps_work() ou não recebe um novo valor após o evento intel_rps_unpark()), então ele salta para o rótulo "out", contornando a proteção `intel_rps_is_active()` e executa gen6_gt_pm_unmask_irq();

4) O GT está estacionado (parked) e o bloqueio de energia em tempo real é liberado, restando apenas uma referência bruta em __gt_park() -> intel_display_power_put_async() por 100ms; então, a gravação MMIO em gen6_gt_pm_unmask_irq() detecta a ausência do wakelock via assert_rpm_wakelock_held() e gera o taint no kernel "RPM wakelock ref not held during HW access".

O commit 3e7abf814193 ("drm/i915: Extract GT render power state management") removeu a proteção "if (rps->interrupts_enabled)" que gen6_pm_rps_work() tinha ao redor desse desmascaramento em i915_irq.c. INTEL_RPS_ACTIVE delimita a mesma janela, pois é definida em intel_rps_unpark() antes de rps_enable_interrupts() e rps_start_timer(), e limpa em intel_rps_park() antes de rps_stop_timer() e rps_disable_interrupts().

Pular o desmascaramento quando RPS não está mais ativo (atingir a operação de desmascaramento é independente do modo INTERRUPT). Isso não impede que a operação RPS retome no próximo unpark. No modo de interrupção, intel_rps_unpark() chama rps_enable_interrupts(), o que habilita e desmascara as interrupções PM. No modo timer, ele chama rps_start_timer(), reiniciando a avaliação periódica da ocupação do motor (engine-busyness). O timer gera eventos de software RPS e enfileira rps_work() diretamente, independentemente do envio de interrupção PM. Nenhum dos modos requer que o worker tardio desmascare as interrupções enquanto o GT está estacionado.

(cherry picked from commit ca4a6deadad15b91ee083afe445fa6bdbfb68206)

If you want to get the best quality for vulnerability data then you always have to consider VulDB.

Responsável

Linux

Reservar

25/09/2026

Divulgação

23/10/2026

Moderação

aceite

Entrada

VDB-425836

EPSS

0.00000

KEV

não

Atividades

muito baixo

Fontes

Interested in the pricing of exploits?

See the underground prices here!