CVE-2026-98284 in Linux
요약
\~에 의해 VulDB • 2026. 10. 06.
리눅스 커널에서 다음 취약점이 해결되었습니다:
netlink: 잠금 없는(lockless) 리더가 nlk->groups를 사용하는 동안 이를 해제하지 마십시오
netlink_realloc_groups()는 netlink_table_grab() 내에서 krealloc()을 사용합니다. NLGRPSZ(groups)가 다른 kmalloc bucket에 해당할 경우, 이전 비트맵이 즉시 해제됩니다.
nlk->groups / nlk->ngroups의 두 가지 리더(netlink table lock을 보유하지 않음)가 있습니다:
1) sk_diag_dump_groups(). 해시된(바인딩된) 소켓은 __netlink_diag_dump() 내의 rhashtable 순회에서 덤프되며, 여기서는 RCU만 유지됩니다. 덤프 중 mc_list 부분만이 nl_table_lock을 보유합니다.
2) netlink_native_seq_show()( /proc/net/netlink). 이 순회는 commit 21e4902aea80("netlink: Lockless lookup with RCU grace period in socket release") 이후로 잠금 없이(lockless) 수행됩니다.
두 리더 모두 해제된 버퍼를 읽을 수 있으며, sk_diag_dump_groups()는 이전(더 작은) 버퍼의 끝 너머도 읽을 수 있습니다. 이는 @groups 포인터와 새로운 @ngroups 값을 함께 로드하여 NETLINK_DIAG_GROUPS 속성에 결과를 복사하는 경우에 발생합니다.
이것은 commit f773608026ee("netlink: access nlk groups safely in netlink bind and getname")가 bind() 및 getname()에 대해 수정한 것과 동일한 유형의 버그입니다. 이 두 리더는 누락되었습니다. sk_diag_dump_groups()에서 테이블 잠금을 단순히 획득하는 것은 옵션이 아닙니다. 이는 덤프의 mc_list 섹션에서 nl_table_lock이 이미 보유된 상태에서도 호출되기 때문입니다.
잠금 없는 리더들을 안전하게 만듭니다:
- krealloc()에 의해 수행되는 암시적 kfree()에 의존하기보다, RCU grace period 이후에 새 비트맵을 할당하고 이전 것을 해제합니다. - @ngroups 전에 @groups를 release sematics로 게시하며, 잠금 없는 리더는 먼저 @ngroups를 로드하도록 합니다. 이를 통해 리더가 새로운(더 큰) 크구를 이전(더 작은) 버퍼와 짝짓는 일은 절대 발생하지 않으며, 새 포인터를 가져오면서 여전히 이전 크기를 보고 있는 리더는 초기화된 비트맵을 보게 됩니다.
netlink_realloc_groups()는 프로세스 컨텍스트(bind() 및 setsockopt())에서 호출되므로, 테이블이 해제된 후 kfree_rcu_mightsleep()를 사용할 수 있습니다.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.