🇰🇷 한글 설명
Linux 커널의 CAN 장치 드라이버에서 init_can_skb() 함수가 skb의 헤더 초기화(mac_header, network_header, transport_header 리셋)를 누락하여, 수신된 CAN skb가 mac_header=0xFFFF 상태로 전달됩니다. 이로 인해 SOCK_PACKET 경로의 packet_rcv_spkt()에서 길이 계산이 오버플로되어 skb_under_panic 및 커널 BUG가 발생하고 시스템 전체가 패닉될 수 있습니다.
💡 쉬운 설명
CAN 통신 장치가 받은 데이터 패킷의 위치 정보를 제대로 설정하지 않아서, 특정 네트워크 처리 과정에서 계산 오류가 발생합니다. 그 결과 리눅스 시스템이 갑자기 멈추거나 재부팅될 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
can: dev: init_can_skb(): restore skb header initialization
Commit 9f10374bb024 ("can: remove private CAN skb headroom infrastructure")
removed the skb_reset_mac_header()/skb_reset_network_header()/
skb_reset_transport_header() calls from init_can_skb(). As a result, RX
skbs from alloc_can_skb() and friends again carry mac_header = 0xFFFF.
When such an skb reaches packet_rcv_spkt() (SOCK_PACKET), the push length
calculation overflows and triggers skb_under_panic -> kernel BUG -> full
machine panic.
The same issue was originally reported in 2014 on linux-can and fixed by
commit 969439016d2c ("can: add missing initialisations in CAN related
skbuffs"). packet_rcv_spkt() itself has never been hardened: only
packet_rcv() and tpacket_rcv() gained dev_has_header() checks in
commit d549699048b4 ("net/packet: fix packet receive on L3 devices
without visible hard header").
📍 영향받는 시스템
커널 버전 9f10374bb024 커밋 이후의 Linux 커널 중 CAN 서브시스템을 사용하는 시스템 (CVSS 미정)
⚔️ 공격 벡터
CAN 버스 또는 가상 CAN 인터페이스로 조작된 프레임을 수신시켜 SOCK_PACKET 소켓 경로에서 커널 패닉을 유발하는 서비스 거부(DoS) 공격
🛡️ 대응 방법
패치된 Linux 커널 버전으로 업데이트하고, 해당 수정이 포함된 init_can_skb() 헤더 초기화 복원 커밋을 적용하며, 필요 시 SOCK_PACKET 사용을 제한
🔧 검증 코드
출력된 커널 버전이 패치가 포함된 버전인지 배포판 보안 공지와 대조하고, CAN 모듈이 로드되지 않았다면 이 취약점의 영향을 받지 않습니다.
uname -r && (lsmod | grep -E '^can' || echo 'CAN 모듈 미로드')