🇰🇷 한글 설명
리눅스 커널의 Thunderbolt 드라이버에서 tb_dp_dprx_work 함수 실행 중 Use-After-Free(UAF) 취약점이 발견되었습니다. 기존의 cancel_delayed_work() 방식은 지연된 작업이 완전히 종료되었음을 보장하지 못해, 메모리가 해제된 후에도 해당 메모리에 접근을 시도하는 레이스 컨디션 문제를 일으킵니다.
💡 쉬운 설명
컴퓨터 부품인 Thunderbolt를 사용하는 과정에서, 이미 삭제된 메모리 정보를 다시 사용하려고 시도하여 시스템 오류나 보안 문제가 발생할 수 있는 결함입니다. 작업이 끝날 때까지 기다리지 않고 메모리를 먼저 지워버려서 발생하는 문제입니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
thunderbolt: Fix use-after-free in tb_dp_dprx_work
The original code relies on cancel_delayed_work() in tb_dp_dprx_stop(),
which does not ensure that the delayed work item tunnel->dprx_work has
fully completed if it was already running. This leads to use-after-free
scenarios where tb_tunnel is deallocated by tb_tunnel_put(), while
tunnel->dprx_work remains active and attempts to dereference tb_tunnel
in tb_dp_dprx_work().
A typical race condition is illustrated below:
CPU 0 | CPU 1
tb_dp_tunnel_active() |
tb_deactivate_and_free_tunnel()| tb_dp_dprx_start()
tb_tunnel_deactivate() | queue_delayed_work()
tb_dp_activate() |
tb_dp_dprx_stop() | tb_dp_dprx_work() //delayed worker
cancel_delayed_work() |
tb_tunnel_put(tunnel); |
| tunnel = container_of(...); //UAF
| tunnel-> //UAF
Replacing cancel_delayed_work() with cancel_delayed_work_sync() is
not feasible as it would introduce a deadlock: both tb_dp_dprx_work()
and the cleanup path acquire tb->lock, and cancel_delayed_work_sync()
would wait indefinitely for the work item that cannot proceed.
Instead, implement proper reference counting:
- If cancel_delayed_work() returns true (work is pending), we release
the reference in the stop function.
- If it returns false (work is executing or already completed), the
reference is released in delayed work function itself.
This ensures the tb_tunnel remains valid during work item execution
while preventing memory leaks.
This bug was found by static analysis.
📍 영향받는 시스템
Thunderbolt 드라이버를 사용하는 리눅스 커널 버전
⚔️ 공격 벡터
특정 타이밍에 Thunderbolt 장치를 연결하거나 해제하는 레이스 컨디션 유도
🛡️ 대응 방법
리눅스 커널을 최신 보안 패치가 적용된 버전으로 업데이트하여 참조 횟수(Reference Counting) 로직이 수정된 패치를 적용해야 합니다.
🔧 검증 코드
현재 실행 중인 커널 버전을 확인하여 취약점이 해결된 최신 패치 버전인지 확인합니다.