🇰🇷 한글 설명
Linux 커널의 VXLAN 네트워킹 구성 요소에서 IPv6가 비활성화된 상태로 부팅될 경우 발생하는 NULL 포인터 역참조 취약점입니다. IPv6가 꺼져 있으면 nd_tbl이 초기화되지 않는데, 이때 IPv6 패킷이 유입되면 커널이 잘못된 메모리 주소에 접근하여 시스템 오류(Oops)를 유발합니다.
💡 쉬운 설명
컴퓨터 설정에서 IPv6 기능을 꺼두었을 때, 누군가 강제로 IPv6 데이터를 보내면 시스템이 길을 찾지 못해 멈추거나 오류가 발생하는 문제입니다. 이는 시스템의 안정성을 해칠 수 있는 결함입니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
net: vxlan: fix nd_tbl NULL dereference when IPv6 is disabled
When booting with the 'ipv6.disable=1' parameter, the nd_tbl is never
initialized because inet6_init() exits before ndisc_init() is called
which initializes it. If an IPv6 packet is injected into the interface,
route_shortcircuit() is called and a NULL pointer dereference happens on
neigh_lookup().
BUG: kernel NULL pointer dereference, address: 0000000000000380
Oops: Oops: 0000 [#1] SMP NOPTI
[...]
RIP: 0010:neigh_lookup+0x20/0x270
[...]
Call Trace:
<TASK>
vxlan_xmit+0x638/0x1ef0 [vxlan]
dev_hard_start_xmit+0x9e/0x2e0
__dev_queue_xmit+0xbee/0x14e0
packet_sendmsg+0x116f/0x1930
__sys_sendto+0x1f5/0x200
__x64_sys_sendto+0x24/0x30
do_syscall_64+0x12f/0x1590
entry_SYSCALL_64_after_hwframe+0x76/0x7e
Fix this by adding an early check on route_shortcircuit() when protocol
is ETH_P_IPV6. Note that ipv6_mod_enabled() cannot be used here because
VXLAN can be built-in even when IPv6 is built as a module.
📍 영향받는 시스템
IPv6가 비활성화된(ipv6.disable=1) 상태로 실행 중인 Linux 커널 기반 시스템
⚔️ 공격 벡터
IPv6가 비활성화된 VXLAN 인터페이스로 조작된 IPv6 패킷을 주입
🛡️ 대응 방법
커널 패치를 적용하여 route_shortcircuit() 호출 시 프로토콜이 ETH_P_IPV6인 경우에 대한 조기 검사 로직을 추가
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 수정된 패치 버전인지 확인