CVE-2026-99248 in Linux
요약
\~에 의해 VulDB • 2026. 11. 03.
리눅스 커널에서 다음 취약점이 해결되었습니다:
i2c: xiic: clk WARN 홍수를 수정하기 위해 비관리형 런타임 PM 복원
devres 변환으로 인해 수동 pm_runtime_enable()/disable() 호출이 devm_pm_runtime_set_active_enabled()로 대체되었고, 제거 시점의 런타임 PM 정리(teardown)가 삭제되었습니다. 관리형 리소스 해제(managed release)는 잘못된 순서로 런타임 PM을 종료합니다: 즉, pm_runtime_disable() 이전에 pm_runtime_dont_use_autosuspend()를 호출하는데, 이는 런타임 PM이 여전히 활성화된 상태이며, devres가 LIFO(후입선출) 구조이기 때문에 devm_clk_get_enabled()의 해제가 이후에 실행됩니다.
제거(remove) 시점에서 pm_runtime_put_sync()는 자동 서스펜드 타이머가 설정된 상태로 장치를 활성(active)으로 유지합니다. use_autosuspend를 지우면 rpm_idle()이 즉시 서스펜드를 시도하고, xiic_i2c_runtime_suspend()에서 clk_disable()을 호출하여 클럭을 비활성화합니다. 이후 devm_clk_get_enabled() 해제는 이미 비활성화된 클럭에 대해 clk_disable_unprepare()를 수행하므로, 정리(teardown) 시마다 "clkN already disabled"라는 clk_core_disable() WARN이 발생합니다.
관리형 헬퍼 함수를 제거하고 비관리형 런타임 PM 설정 및 정리를 복원하여, 런타임 PM이 probe 단계에서 한 번 활성화되고 remove 단계에서 한 번 비활성화되며 클럭 enable 카운트가 균형(balanced)을 유지되도록 합니다.
제거 정리 순서를 조정하여 런타임 PM이 사용 카운트 감소 전에 비활성화되도록 합니다: pm_runtime_put_sync() 대신 pm_runtime_disable() 이후에 pm_runtime_put_noidle()를 호출합니다. 자동 서스펜드가 활성화된 상태에서 카운트를 먼저 감소시키면 자동 서스펜드 타이머가 설정되며, pm_runtime_disable() 이전에 프리엠션(preemption)이 발생하면 타이머가 만료되어 장치를 서스펜드하고 클럭을 비활성화하며, 이는 devm 해제 시 다시 비활성화되면서 동일한 WARN을 유발합니다.
비관리형 IRQ 요청도 복원됩니다. probe 오류 경로에서는 goto 문을 통해 런타임 PM을 수동으로 정리(unwind)하며, devm에 등록된 핸들러는 나중에 devres unwind 동안에만 해지되므로, 수동 정리 과정(및 그 이후에 추가될 미래의 실패 단계 전체) 동안 활성 상태로 남아있게 됩니다. IRQ를 request_threaded_irq()로 요청하고 probe 오류 경로 및 remove 함수에서 명시적으로 해제합니다. 또한 probe 오류 경로는 use_autosuspend를 지워 제거(teardown) 시점과 일치시킵니다.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.