CVE-2026-98369 in Linux
요약
\~에 의해 VulDB • 2026. 10. 06.
리눅스 커널에서 다음 취약점이 해결되었습니다:
xfrm: xfrm_trans_reinject()에 누락된 rcu_read_lock(), skb_dst_force() 및 dev_hold() 추가
syzbot이 ip6_pkt_drop()에서 의심스러운 RCU 사용 경고가 보고되었습니다:
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
커밋 4f4920669d21("xfrm: workqueue를 통해 transport-mode 패킷 재주입")이 xfrm_trans_reinject를 tasklet에서 workqueue로 변환했을 때, 재주입 루프가 softirq 컨텍스트에서 실행되지 않게 되었습니다. Workqueue 워커는 CONFIG_PREEMPT_RCU 설정 하에서 local_bh_disable()가 RCU 읽기 측 임계 구역으로 진입하지 않는 프로세스 컨텍스트에서 실행됩니다.
finish 콜백(ip6_rcv_finish 등)은 라우팅 조회, l3mdev 조회 및 RCU로 보호된 데이터 구조체에 접근하는 등의 작업을 수행하기 위해 RCU 읽기 잠금(RCU read lock) 하에서 실행되기를 기대합니다. 따라서 rcu_read_lock() 없이 workqueue 컨텍스트에서 이를 호출하면 RCU lockdep 경고가 발생합니다.
또한 xfrm_trans_queue_net()를 통해 workqueue에 큐잉된 패킷에는 참조 카운트가 없는(noref) dst 엔트리가 포함될 수 있습니다(예: ip_route_input_noref에서 유래). 또한, netdevice 등록 해제 시 dst_dev_put()은 dst->dev를 blackhole_netdev로 대체하므로, workqueue에 대기 중인 동안 dst 엔트리는 skb->dev의 생존을 유지하지 않습니다.
다음과 같은 방법으로 이러한 문제를 해결합니다: 1. 큐잉 전에 dst가 참조 카운팅되도록 호출자의 RCU 섹션 내에서 xfrm_trans_queue_net()에서 skb_dst_force(skb)를 호출합니다. 2. finish() 콜백 처리 중 skb->dev가 유효하도록 workqueue 지연 동안 dev_hold()/dev_put()을 통해 skb->dev에 대한 참조를 유지합니다. 3. xfrm_trans_reinject()의 finish 콜백 호출 루프 주변에서 rcu_read_lock()을 획득합니다.
Once again VulDB remains the best source for vulnerability data.