🇰🇷 한글 설명
Linux 커널의 TIPC 모듈에서 tipc_node_find_by_name()이 RCU 읽기 잠금을 해제한 뒤 노드에 대한 참조를 획득하지 않아, LINK_SET, LINK_GET, LINK_RESET_STATS 핸들러가 타이머에 의해 해제된 노드에 접근할 수 있는 use-after-free 취약점입니다. 수정은 RCU 임계 구역을 벗어나기 전에 kref_get_unless_zero()로 참조를 확보하고 모든 종료 경로에서 해제하는 것입니다.
💡 쉬운 설명
리눅스 커널의 클러스터 통신 기능에서 이미 삭제된 메모리를 다시 사용하는 버그입니다. 특정 타이밍에 관리 요청을 처리하면 시스템이 비정상 종료되거나 메모리 내용이 노출될 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
tipc: hold a reference to nodes found by link name
tipc_node_find_by_name() returns a node after dropping its RCU read lock
without taking a reference. The LINK_SET, LINK_GET and LINK_RESET_STATS
handlers then lock and access the node, racing with timer-driven cleanup of
a down peer. Generic netlink serialization does not exclude the node
timer.
The following interleaving can leave a handler using a freed node:
CPU 0: find the node under RCU and release the node read lock
CPU 1: tipc_node_timeout() clears the links and unlinks the down node
CPU 1: drop the list and timer references, queuing tipc_node_free()
CPU 0: leave the RCU read-side critical section
CPU 1: complete the grace period and free the node
CPU 0: acquire the node lock through the stale pointer
LINK_SET also uses the node's media address after releasing the node lock,
when passing queued packets to tipc_bearer_xmit().
KASAN on v7.3-rc5 reported:
BUG: KASAN: slab-use-after-free in _raw_read_lock_bh
Write of size 4 at addr ffff88807e06f008 by task poc/92
Call Trace:
_raw_read_lock_bh kernel/locking/spinlock.c:287
tipc_nl_node_set_link net/tipc/node.c:2475
genl_family_rcv_msg_doit net/netlink/genetlink.c:1114
genl_rcv_msg net/netlink/genetlink.c:1209
netlink_rcv_skb net/netlink/af_netlink.c:2575
Allocated by task 0:
tipc_node_create net/tipc/node.c:539
tipc_node_check_dest net/tipc/node.c:1196
tipc_disc_rcv net/tipc/discover.c:252
Freed by task 92:
kfree mm/slub.c:6801
rcu_core kernel/rcu/tree.c:2919
Last potentially related work creation:
__call_rcu_common.constprop.0 kernel/rcu/tree.c:3181
tipc_node_timeout net/tipc/node.c:814
Acquire a reference to the selected node with kref_get_unless_zero() before
leaving RCU, returning NULL if the node has already been released. Release
that reference on every caller exit after the last node access, including
transmission in LINK_SET. Keep the existing link lookup order and locking
so concurrent link removal still takes the existing error paths.
📍 영향받는 시스템
TIPC 프로토콜을 사용하는 Linux 커널 (수정 이전 버전, KASAN 보고는 v7.3-rc5 기준)
⚔️ 공격 벡터
로컬 사용자가 TIPC 넷링크 관리 요청을 반복 전송하여 노드 타이머 정리와 경쟁 상태를 유발함으로써 해제된 메모리 접근을 일으킴
🛡️ 대응 방법
커널을 해당 CVE 수정이 포함된 최신 안정 버전으로 업데이트하고, 배포판 보안 업데이트를 적용하며, 불필요한 경우 tipc 모듈을 비활성화합니다.
🔧 검증 코드
커널 버전이 수정된 릴리스 이상인지 확인하고, tipc 모듈이 로드되지 않았다면 이 취약점의 영향을 받지 않습니다.
uname -r && (lsmod | grep -i tipc || echo 'tipc module not loaded')