🇰🇷 한글 설명
Linux 커널의 Broadcom CAN 드라이버에서 ANYDEV 수신 작업 시 여러 인터페이스로부터 프레임이 동시에 도착할 경우 발생하는 경쟁 상태(Race Condition) 취약점입니다. 이로 인해 잘못된 RX_TIMEOUT 알림이 발생하거나 마지막 프레임 데이터가 손상될 수 있습니다. 이를 해결하기 위해 특정 인터페이스를 추적하여 다른 인터페이스의 프레임을 거부하는 로직이 추가되었습니다.
💡 쉬운 설명
여러 통신 경로를 통해 데이터가 동시에 들어올 때, 시스템이 어떤 경로에서 온 데이터인지 혼동하여 데이터가 깨지거나 오류가 발생하는 문제입니다. 이를 방지하기 위해 처음 연결된 통신 경로만 인정하도록 보안 규칙이 강화되었습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
can: bcm: track a single source interface for ANYDEV timeout/throttle ops
An ANYDEV rx op (ifindex == 0) with an active RX timeout and/or
throttle timer has no defined semantics when matching frames arrive
from several interfaces: bcm_rx_handler() can run concurrently for
the same op on different CPUs, racing hrtimer_cancel()/
bcm_rx_starttimer() against bcm_rx_timeout_handler() and causing
spurious RX_TIMEOUT notifications and last_frames corruption. The
same concurrency lets throttled multiplex frames from different
interfaces clobber the single rx_ifindex/rx_stamp fields shared by
the op.
Add op->if_detected to track the first interface that delivers a
matching frame while a timeout/throttle timer is configured, and
reject frames from any other interface for that op. The claim is
decided in bcm_rx_handler() before hrtimer_cancel() touches
op->timer, so a rejected frame can never disturb the claimed
interface's watchdog. RTR-mode ops are excluded via RX_RTR_FRAME,
independent of kt_ival1/kt_ival2, since those may briefly hold a
stale value from an earlier non-RTR configuration.
The claim is released in bcm_notify() on NETDEV_UNREGISTER and in
bcm_rx_setup() when SETTIMER reconfigures the timer values.
A (re-)claim is only possible on CAN devices in NETREG_REGISTERED
dev->reg_state to cover the release in bcm_notify() where reg_state
becomes NETREG_UNREGISTERING until synchronize_net().
📍 영향받는 시스템
Linux kernel (Broadcom CAN driver 사용 시스템)
⚔️ 공격 벡터
여러 네트워크 인터페이스를 통해 동시에 조작된 프레임을 전송하여 커널 내 경쟁 상태 유도
🛡️ 대응 방법
Broadcom CAN 드라이버의 race condition 패치가 적용된 최신 Linux 커널로 업데이트
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 해결된 패치 버전 이후인지 확인