🇰🇷 한글 설명
Linux 커널의 bridge 모듈에서 IPv6가 비활성화된 상태로 부팅될 경우, nd_tbl이 초기화되지 않아 NULL 포인터 역참조가 발생하는 취약점입니다. neigh_suppress 기능이 활성화된 상태에서 ICMPv6 Neighbor Discovery 패킷이 브리지에 도달하면 커널 패닉이 발생할 수 있습니다.
💡 쉬운 설명
컴퓨터의 네트워크 설정에서 IPv6를 꺼두었을 때, 특정 네트워크 신호가 들어오면 시스템이 처리할 수 없는 빈 공간을 참조하여 시스템이 멈추거나 오류가 발생하는 문제입니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
net: bridge: 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. Then, if neigh_suppress is enabled and an ICMPv6
Neighbor Discovery packet reaches the bridge, br_do_suppress_nd() will
dereference ipv6_stub->nd_tbl which is NULL, passing it to
neigh_lookup(). This causes a kernel NULL pointer dereference.
BUG: kernel NULL pointer dereference, address: 0000000000000268
Oops: 0000 [#1] PREEMPT SMP NOPTI
[...]
RIP: 0010:neigh_lookup+0x16/0xe0
[...]
Call Trace:
<IRQ>
? neigh_lookup+0x16/0xe0
br_do_suppress_nd+0x160/0x290 [bridge]
br_handle_frame_finish+0x500/0x620 [bridge]
br_handle_frame+0x353/0x440 [bridge]
__netif_receive_skb_core.constprop.0+0x298/0x1110
__netif_receive_skb_one_core+0x3d/0xa0
process_backlog+0xa0/0x140
__napi_poll+0x2c/0x170
net_rx_action+0x2c4/0x3a0
handle_softirqs+0xd0/0x270
do_softirq+0x3f/0x60
Fix this by replacing IS_ENABLED(IPV6) call with ipv6_mod_enabled() in
the callers. This is in essence disabling NS/NA suppression when IPv6 is
disabled.
📍 영향받는 시스템
IPv6가 비활성화(ipv6.disable=1)되고 neigh_suppress가 활성화된 Linux 커널 시스템
⚔️ 공격 벡터
네트워크를 통해 조작된 ICMPv6 Neighbor Discovery 패킷을 전송하여 커널 NULL 포인터 역참조 유도
🛡️ 대응 방법
커널 패치를 적용하여 IS_ENABLED(IPV6) 호출을 ipv6_mod_enabled()로 교체하여 IPv6 비활성화 시 NS/NA 억제 기능을 차단해야 함
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 수정된 패치 버전 이후인지 확인하십시오.