🇰🇷 한글 설명
Linux 커널 Bluetooth L2CAP 서브시스템에서 l2cap_chan이 l2cap_conn에 두 번 연결되는 TOCTOU 경쟁 조건이 존재합니다. 동시에 실행되는 connect()와 bind() 호출 간 상태 불일치로 인해 불변식이 깨지며, 이는 메모리 손상 또는 커널 크래시로 이어질 수 있습니다.
💡 쉬운 설명
여러 프로그램이 동시에 블루투스 연결을 시도할 때 내부 상태가 꼬이는 문제입니다. 공격자는 이를 이용해 시스템을 불안정하게 만들거나 권한 상승을 시도할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
Bluetooth: L2CAP: refuse __l2cap_chan_add if chan already has conn
l2cap_chan may be linked to l2cap_conn at most once. This is assumed in
several places, eg l2cap_chan_del cleanup.
There is a TOCTOU race where the invariant is violated:
[Task 1] [Task 2]
l2cap_chan_connect l2cap_sock_bind
l2cap_chan_lock lock_sock
l2cap_state_change if (sk->sk_state != BT_OPEN)
chan->state = BT_CONNECT
l2cap_sock_state_change_cb chan->state = BT_BOUND
sk->sk_state = BT_BOUND
lock_sock <------------------ release_sock
sk->sk_state = BT_CONNECT
l2cap_sock_connect() does not check sk->sk_state, so since chan->state
is now BT_BOUND, subsequent connect() ends up with second
__l2cap_chan_add.
Explicitly document and check the invariant in __l2cap_chan_add with
WARN_ON_ONCE. The only callsite where it could be hit is
l2cap_chan_connect, so add pre-check there to avoid relying on
chan->state. chan->state read/write is not properly guarded currently so
there can be other TOCTOUC problems.
Add l2cap_lock_chan in l2cap_sock_bind() to guard chan->state write.
📍 영향받는 시스템
패치가 적용되지 않은 Linux 커널 (Bluetooth L2CAP 모듈 사용 환경)
⚔️ 공격 벡터
로컬 사용자가 경쟁 조건을 유발하도록 동시 connect()/bind() 호출을 반복하여 커널 상태를 손상시킴
🛡️ 대응 방법
배포판 제공 최신 커널 업데이트 적용 또는 해당 커널 패치 커밋 반영 후 재부팅
🔧 검증 코드
출력된 커널 버전을 배포판 보안 공지와 대조하여 CVE-2026-99239 수정 버전 이상인지 확인하며, 해당 버전 이하이면 취약한 것으로 판단합니다.