🇰🇷 한글 설명
Linux 커널의 xfrm6_get_saddr() 함수가 ipv6_dev_get_saddr()의 반환값을 검증하지 않아, 적절한 소스 주소를 찾을 수 없을 때 초기화되지 않은 메모리를 사용하는 취약점입니다. 이로 인해 xfrm_state_find()에서 초기화되지 않은 값이 사용되어 KMSAN 경고가 발생하고 메모리 안정성 문제가 발생합니다.
💡 쉬운 설명
Linux 커널의 IPv6 네트워크 설정에서 주소를 찾지 못할 때 쓰레기 값(초기화되지 않은 메모리)을 사용하는 버그입니다. 이는 시스템 불안정이나 예상 못한 동작을 유발할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
xfrm6: fix uninitialized saddr in xfrm6_get_saddr()
xfrm6_get_saddr() does not check the return value of
ipv6_dev_get_saddr(). When ipv6_dev_get_saddr() fails to find a suitable
source address (returns -EADDRNOTAVAIL), saddr->in6 is left
uninitialized, but xfrm6_get_saddr() still returns 0 (success).
This causes the caller xfrm_tmpl_resolve_one() to use the uninitialized
address in xfrm_state_find(), triggering KMSAN warning:
=====================================================
BUG: KMSAN: uninit-value in xfrm_state_find+0x2424/0xa940
xfrm_state_find+0x2424/0xa940
xfrm_resolve_and_create_bundle+0x906/0x5a20
xfrm_lookup_with_ifid+0xcc0/0x3770
xfrm_lookup_route+0x63/0x2b0
ip_route_output_flow+0x1ce/0x270
udp_sendmsg+0x2ce1/0x3400
inet_sendmsg+0x1ef/0x2a0
__sock_sendmsg+0x278/0x3d0
__sys_sendto+0x593/0x720
__x64_sys_sendto+0x130/0x200
x64_sys_call+0x332b/0x3e70
do_syscall_64+0xd3/0xf80
entry_SYSCALL_64_after_hwframe+0x77/0x7f
Local variable tmp.i.i created at:
xfrm_resolve_and_create_bundle+0x3e3/0x5a20
xfrm_lookup_with_ifid+0xcc0/0x3770
=====================================================
Fix by checking the return value of ipv6_dev_get_saddr() and propagating
the error.
📍 영향받는 시스템
Linux kernel 모든 버전 (정확한 영향 범위는 배포판별로 백포트 여부에 따라 상이)
⚔️ 공격 벡터
로컬 공격자가 특정 네트워크 조건(IPv6 주소 할당 실패)을 유발하는 UDP 패킷을 전송하여 xfrm6_get_saddr() 오류 경로 트리거
🛡️ 대응 방법
Linux 커널을 최신 버전으로 업데이트하거나, xfrm6_get_saddr() 함수의 반환값 검증 패치 적용
🔧 검증 코드
현재 커널 버전 확인 후 배포판 보안 권고사항에서 해당 취약점 패치 적용 여부 확인 필요