🔍 CVE-2024-40961

5.5
CVSS Score
MEDIUM
2024-07-12
2026-10-15 01:18
✅ 완료

🇰🇷 한글 설명

Linux 커널의 IPv6 라우팅 코드에서 in6_dev_get() 함수의 NULL 반환값을 확인하지 않아 발생하는 NULL 포인터 역참조 취약점. fib6_nh_init() 함수 실행 중 NULL 포인터 접근으로 커널 패닉이 발생하며, 로컬 공격자가 IPv6 라우팅 ioctl 호출을 통해 시스템 서비스 거부를 유발할 수 있다.

💡 쉬운 설명

Linux 커널이 IPv6 네트워크 경로 설정 시 메모리 주소를 제대로 확인하지 않아 충돌하는 버그입니다. 같은 컴퓨터에 접근할 수 있는 사용자가 특정 명령을 실행하면 시스템이 다운될 수 있습니다.

🇺🇸 원문 (English)

In the Linux kernel, the following vulnerability has been resolved: ipv6: prevent possible NULL deref in fib6_nh_init() syzbot reminds us that in6_dev_get() can return NULL. fib6_nh_init() ip6_validate_gw( &idev ) ip6_route_check_nh( idev ) *idev = in6_dev_get(dev); // can be NULL Oops: general protection fault, probably for non-canonical address 0xdffffc00000000bc: 0000 [#1] PREEMPT SMP KASAN PTI KASAN: null-ptr-deref in range [0x00000000000005e0-0x00000000000005e7] CPU: 0 PID: 11237 Comm: syz-executor.3 Not tainted 6.10.0-rc2-syzkaller-00249-gbe27b8965297 #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 06/07/2024 RIP: 0010:fib6_nh_init+0x640/0x2160 net/ipv6/route.c:3606 Code: 00 00 fc ff df 4c 8b 64 24 58 48 8b 44 24 28 4c 8b 74 24 30 48 89 c1 48 89 44 24 28 48 8d 98 e0 05 00 00 48 89 d8 48 c1 e8 03 <42> 0f b6 04 38 84 c0 0f 85 b3 17 00 00 8b 1b 31 ff 89 de e8 b8 8b RSP: 0018:ffffc900032775a0 EFLAGS: 00010202 RAX: 00000000000000bc RBX: 00000000000005e0 RCX: 0000000000000000 RDX: 0000000000000010 RSI: ffffc90003277a54 RDI: ffff88802b3a08d8 RBP: ffffc900032778b0 R08: 00000000000002fc R09: 0000000000000000 R10: 00000000000002fc R11: 0000000000000000 R12: ffff88802b3a08b8 R13: 1ffff9200064eec8 R14: ffffc90003277a00 R15: dffffc0000000000 FS: 00007f940feb06c0(0000) GS:ffff8880b9400000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000000000000 CR3: 00000000245e8000 CR4: 00000000003506f0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: <TASK> ip6_route_info_create+0x99e/0x12b0 net/ipv6/route.c:3809 ip6_route_add+0x28/0x160 net/ipv6/route.c:3853 ipv6_route_ioctl+0x588/0x870 net/ipv6/route.c:4483 inet6_ioctl+0x21a/0x280 net/ipv6/af_inet6.c:579 sock_do_ioctl+0x158/0x460 net/socket.c:1222 sock_ioctl+0x629/0x8e0 net/socket.c:1341 vfs_ioctl fs/ioctl.c:51 [inline] __do_sys_ioctl fs/ioctl.c:907 [inline] __se_sys_ioctl+0xfc/0x170 fs/ioctl.c:893 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xf3/0x230 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x77/0x7f RIP: 0033:0x7f940f07cea9

📍 영향받는 시스템

Linux kernel 6.10.0-rc2 이전 버전 (특정 IPv6 라우팅 기능을 지원하는 모든 배포판)

⚔️ 공격 벡터

SIOCADDRT ioctl을 통한 IPv6 라우트 추가 시스템 콜 악용 (로컬 접근 필요)

🛡️ 대응 방법

Linux 커널을 패치된 버전으로 업데이트 (커널 6.10.0-rc2 이후)

🔧 검증 코드

커널 버전이 6.10.0 미만이면 VULNERABLE으로 표시되며, 6.10.0 이상이면 정확한 패치 레벨 확인 필요. 커널 패치 정보는 /boot/config-* 파일의 CONFIG_IPV6 설정과 함께 확인하거나 git blame으로 fib6_nh_init 함수의 패치 적용 여부 확인 가능.

Shell / Script
uname -r | grep -oE '^[0-9]+\.[0-9]+\.[0-9]' | awk -F. '{if ($1 < 6 || ($1 == 6 && $2 < 10)) print "VULNERABLE"; else print "CHECK_PATCH"}'

📊 CVSS Vector String

CVSS Vector
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H

💻 영향받는 소프트웨어

Linux Kernel