🇰🇷 한글 설명
Linux 커널의 xc5000 튜너 드라이버에서 xc5000_release 함수 호출 시 발생하는 Use-After-Free 취약점입니다. cancel_delayed_work()가 지연된 작업의 완전한 종료를 보장하지 않아, 메모리가 해제된 후에도 타이머 작업이 해당 메모리에 접근하여 시스템 불안정이나 보안 문제를 일으킬 수 있습니다.
💡 쉬운 설명
장치를 해제하는 과정에서 작업이 완전히 끝나기도 전에 메모리를 먼저 지워버려 발생하는 오류입니다. 이로 인해 컴퓨터가 갑자기 멈추거나 해킹에 취약해질 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
media: tuner: xc5000: Fix use-after-free in xc5000_release
The original code uses cancel_delayed_work() in xc5000_release(), which
does not guarantee that the delayed work item timer_sleep has fully
completed if it was already running. This leads to use-after-free scenarios
where xc5000_release() may free the xc5000_priv while timer_sleep is still
active and attempts to dereference the xc5000_priv.
A typical race condition is illustrated below:
CPU 0 (release thread) | CPU 1 (delayed work callback)
xc5000_release() | xc5000_do_timer_sleep()
cancel_delayed_work() |
hybrid_tuner_release_state(priv) |
kfree(priv) |
| priv = container_of() // UAF
Replace cancel_delayed_work() with cancel_delayed_work_sync() to ensure
that the timer_sleep is properly canceled before the xc5000_priv memory
is deallocated.
A deadlock concern was considered: xc5000_release() is called in a process
context and is not holding any locks that the timer_sleep work item might
also need. Therefore, the use of the _sync() variant is safe here.
This bug was initially identified through static analysis.
[hverkuil: fix typo in Subject: tunner -> tuner]
📍 영향받는 시스템
Linux kernel (media: tuner: xc5000 드라이버 포함 버전)
⚔️ 공격 벡터
로컬 공격자가 특정 하드웨어 드라이버의 리소스 해제 과정을 유도하여 메모리 오류를 발생시킴
🛡️ 대응 방법
cancel_delayed_work()를 cancel_delayed_work_sync()로 교체하여 작업 완료를 보장하도록 커널 패치 적용
🔧 검증 코드
현재 실행 중인 커널 버전을 확인하여 해당 취약점이 수정된 패치 버전인지 확인합니다.