🇰🇷 한글 설명
리눅스 커널의 IPv6 멀티캐스트 구현에서 RCU 보호 목록을 업데이트할 때 rcu_assign_pointer() 대신 직접적인 포인터 할당을 사용하는 취약점이 발견되었습니다. 이로 인해 잠금 없이 목록을 탐색하는 동시 읽기 작업과 경합이 발생하여 데이터 불일치나 시스템 불안정을 초래할 수 있습니다.
💡 쉬운 설명
컴퓨터가 데이터를 읽고 쓰는 과정에서 순서를 제대로 맞추지 않아 정보가 꼬이는 문제가 발생할 수 있습니다. 이로 인해 네트워크 기능이 오작동하거나 시스템이 불안정해질 위험이 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
ipv6: mcast: use rcu_assign_pointer() for __rcu list updates
Several places in net/ipv6/mcast.c update RCU-protected lists
(np->ipv6_mc_list, idev->mc_list, idev->mc_tomb) using direct pointer
assignments instead of rcu_assign_pointer():
1. In __ipv6_dev_mc_dec(), unlinking a group from idev->mc_list did:
*map = ma->next;
without rcu_assign_pointer() while concurrent readers traverse
idev->mc_list locklessly under rcu_read_lock().
2. In ipv6_sock_mc_drop() and __ipv6_sock_mc_close(), unlinking a group
from np->ipv6_mc_list directly assigned *lnk = mc_lst->next and
np->ipv6_mc_list = mc_lst->next without rcu_assign_pointer(), racing
with lockless readers in inet6_mc_check().
3. In __ipv6_sock_mc_join(), mc_lst->next was initialized to
np->ipv6_mc_list via raw assignment before publishing mc_lst.
4. In mld_del_delrec() and __ipv6_dev_mc_inc(), __rcu source pointers
passed into rcu_assign_pointer() lacked explicit dereference helpers.
Fix these by consistently using rcu_assign_pointer() along with
mc_dereference() / sock_dereference().
📍 영향받는 시스템
RCU 보호 목록을 사용하는 리눅스 커널 (IPv6 멀티캐스트 관련 모듈)
⚔️ 공격 벡터
네트워크 패킷을 통한 멀티캐스트 그룹 가입/탈퇴 조작으로 커널 내 레이스 컨디션 유도
🛡️ 대응 방법
리눅스 커널을 최신 보안 패치가 적용된 버전으로 업데이트하여 rcu_assign_pointer()가 적용된 수정본을 사용해야 합니다.
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 수정된 패치 버전 이후인지 확인합니다.