🇰🇷 한글 설명
Linux 커널의 RDS 프로토콜에서 IPv6가 비활성화된 상태로 부팅될 경우, inet6_addr_lst 구조체가 초기화되지 않아 NULL 역참조가 발생하는 취약점입니다. 이 상태에서 RDS 소켓을 IPv6 주소에 바인딩하려고 시도하면 시스템 크래시(Kernel Panic)가 발생할 수 있습니다.
💡 쉬운 설명
컴퓨터에서 IPv6라는 통신 방식을 꺼두었을 때, 특정 프로그램(RDS)이 이 기능이 꺼져 있다는 사실을 인지하지 못하고 잘못된 메모리 주소에 접근하여 시스템이 멈추는 문제입니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
rds: Fix inet6_addr_lst NULL dereference when IPv6 is disabled
When booting with the 'ipv6.disable=1' parameter, inet6_addr_lst
is never initialized because inet6_init() exits before addrconf_init()
is called to initialize it. An attempt to bind an RDS socket to
an ipv6 address results in a crash in __ipv6_chk_addr_and_flags()
KASAN: null-ptr-deref in range [0x0000000000000008-0x000000000000000f]
RIP: 0010:__ipv6_chk_addr_and_flags+0x1df/0x7e0
Call Trace:
<TASK>
ipv6_chk_addr+0x3b/0x50
rds_tcp_laddr_check+0x155/0x3b0 [rds_tcp]
rds_trans_get_preferred+0x15d/0x2d0 [rds]
? trace_hardirqs_on+0x2d/0x110
rds_bind+0x1433/0x1d60 [rds]
? rds_remove_bound+0xd50/0xd50 [rds]
? aa_af_perm+0x250/0x250
? __might_fault+0xde/0x190
? __sys_bind+0x1dc/0x210
__sys_bind+0x1dc/0x210
? __ia32_sys_socketpair+0x100/0x100
? restore_fpregs_from_fpstate+0x53/0x100
__x64_sys_bind+0x73/0xb0
? syscall_enter_from_user_mode+0x1c/0x50
do_syscall_64+0x34/0x80
entry_SYSCALL_64_after_hwframe+0x6e/0xd8
RIP: 0033:0x7f47f8269ea9
</TASK>
The following code reproduces the issue:
struct sockaddr_in6 addr;
s = socket(PF_RDS, SOCK_SEQPACKET, 0);
memset(&addr, 0, sizeof(addr));
inet_pton(AF_INET6, ADDRESS, &addr.sin6_addr);
addr.sin6_family = AF_INET6;
addr.sin6_port = htons(PORT);
bind(s, &addr, sizeof(addr));
Found by InfoTeCS on behalf of Linux Verification Center
(linuxtesting.org) with Syzkaller.
📍 영향받는 시스템
IPv6가 비활성화된(ipv6.disable=1) 설정의 Linux 커널 시스템
⚔️ 공격 벡터
로컬 사용자가 IPv6 주소를 사용하여 RDS 소켓 바인딩(bind) 시스템 콜을 호출하여 발생
🛡️ 대응 방법
해당 취약점이 수정된 최신 버전의 Linux 커널로 업데이트
🔧 검증 코드
출력된 커널 버전이 취약점이 패치된 배포판의 보안 업데이트 버전인지 확인