🇰🇷 한글 설명
Linux 커널의 xfrm 구성 요소에서 RCU(Read-Copy-Update) 잠금 메커니즘이 누락되어 발생하는 취약점입니다. xfrm_trans_reinject 함수가 tasklet에서 workqueue로 변경되면서 프로세스 컨텍스트에서 실행될 때 적절한 RCU 읽기 잠금과 skb 데이터 구조에 대한 참조 카운팅이 이루어지지 않아 데이터 불일치나 시스템 불안정을 초래할 수 있습니다.
💡 쉬운 설명
리눅스 운영체제의 네트워크 처리 과정에서 데이터 보호를 위한 잠금 장치가 제대로 작동하지 않는 문제입니다. 이로 인해 네트워크 패킷을 처리하는 중에 시스템이 충돌하거나 예상치 못한 오류가 발생할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
xfrm: add missing rcu_read_lock(), skb_dst_force() and dev_hold() for xfrm_trans_reinject()
syzbot reported a suspicious RCU usage warning in ip6_pkt_drop():
WARNING: suspicious RCU usage in ip6_pkt_drop
include/net/addrconf.h:389 suspicious rcu_dereference_check() usage!
Call Trace:
__in6_dev_get_safely include/net/addrconf.h:389 [inline]
ip6_pkt_drop+0x596/0x610 net/ipv6/route.c:4620
ip6_pkt_discard+0x1c/0x30 net/ipv6/route.c:4651
xfrm_trans_reinject+0x324/0x630 net/xfrm/xfrm_input.c:806
process_one_work kernel/workqueue.c:3322 [inline]
process_scheduled_works+0xa8e/0x14e0 kernel/workqueue.c:3405
worker_thread+0xa47/0xfb0 kernel/workqueue.c:3486
When commit 4f4920669d21 ("xfrm: Reinject transport-mode packets through
workqueue") converted xfrm_trans_reinject from a tasklet to a workqueue,
the reinjection loop ceased running in softirq context. Workqueue workers
run in process context where local_bh_disable() does not enter an RCU
read-side critical section under CONFIG_PREEMPT_RCU.
Because finish callbacks (such as ip6_rcv_finish) expect to run under an
RCU read lock (performing route lookups, l3mdev lookups, and accessing
RCU-protected data structures), invoking them in workqueue context without
rcu_read_lock() triggers RCU lockdep warnings.
Furthermore, packets queued to the workqueue via xfrm_trans_queue_net()
may carry non-refcounted (noref) dst entries (e.g. from ip_route_input_noref).
Additionally, on netdevice unregistration, dst_dev_put() replaces dst->dev
with blackhole_netdev, so dst entries do not keep skb->dev alive while
queued in the workqueue.
Fix these issues by:
1. Calling skb_dst_force(skb) in xfrm_trans_queue_net() while still in the
caller's RCU section to ensure dst is reference-counted before queuing.
2. Holding a reference on skb->dev via dev_hold()/dev_put() across workqueue
deferral so skb->dev remains valid during finish() callback processing.
3. Acquiring rcu_read_lock() around the finish callback invocation loop in
xfrm_trans_reinject().
📍 영향받는 시스템
Linux Kernel (xfrm 모듈을 사용하는 버전)
⚔️ 공격 벡터
특수하게 조작된 네트워크 패킷을 전송하여 커널의 xfrm 재삽입(reinject) 로직을 트리거함으로써 발생
🛡️ 대응 방법
커널 패치를 적용하여 xfrm_trans_reinject에 rcu_read_lock(), skb_dst_force(), dev_hold()를 추가한 최신 커널로 업데이트
🔧 검증 코드
현재 실행 중인 커널 버전을 확인하여 취약점이 해결된 패치 버전인지 확인합니다.
📊 CVSS Vector String
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
💻 영향받는 소프트웨어
NVIDIA Cloud Gaming Guest Driver for Linux