🇰🇷 한글 설명
Linux 커널의 AMT(Automatic Multicast Tunneling) 드라이버에서 릴레이의 General Query를 큐를 거쳐 전송하는 과정에서, 큐에 남아 있던 skb가 이미 해제된 터널을 참조하여 use-after-free가 발생하는 문제가 수정되었습니다. 수정 후 쿼리는 수신 경로에서 직접 전송되며, 큐 경로 및 관련 코드가 제거되었습니다.
💡 쉬운 설명
네트워크 패킷이 대기열에 오래 머무는 동안 그 패킷이 가리키던 연결 정보가 이미 삭제되어, 잘못된 메모리를 읽어 시스템이 불안정해질 수 있는 문제입니다. 이번 수정은 패킷을 대기열에 넣지 않고 바로 보내도록 바꿔 이 문제를 없앱니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
amt: send the relay's General Query directly from the receive path
An skb queued in a qdisc can outlive the tunnel it references
through a raw pointer in skb->cb. For example, with igmp_qrv set
to 1 on the relay a tunnel lives for 135s, so a netem delay of
180s on the amt device outlives it; when the tunnel expires and is
freed, the subsequent dequeue triggers a use-after-free in
amt_dev_xmit().
BUG: KASAN: slab-use-after-free in amt_dev_xmit+0x2763/0x2e20
Call Trace:
amt_dev_xmit+0x2763/0x2e20 [drivers/net/amt.c:1262]
dev_hard_start_xmit+0x22f/0x620
sch_direct_xmit+0x12e/0xac0
netem_dequeue+0x333/0xc50
net_tx_action+0x35c/0xa60
amt_send_igmp_gq() and amt_send_mld_gq() are only called from
amt_request_handler(), inside the rcu_read_lock_bh() section of
amt_rcv(). amt_request_handler() already has the tunnel the query is
for: it found or created it inside that section. Queuing the query with
dev_queue_xmit() only leads back into amt_dev_xmit(), which strips the
Ethernet header and calls amt_send_membership_query() for that tunnel.
Make that call directly from the two senders instead, the same way
amt_send_advertisement() transmits from the receive path. The query
never waits in a qdisc, the tunnel is only dereferenced inside the
RCU section that found or created it, and nothing is stored in
skb->cb, so no lookup or refcount is needed. Remove the query branch
of amt_dev_xmit(), amt_skb_cb() and struct amt_skb_cb, which have no
users left.
Behaviour changes:
- The relay's own General Queries no longer pass through the amt
device's egress path: its qdisc, tc egress (clsact/tcx), the
netfilter egress hook and packet taps. They are still visible as
UDP on the underlay.
- A query that is sent successfully is no longer counted as
tx_dropped. The old query branch left through the unlock label,
which counted every sent query as dropped.
- A query that reaches amt_dev_xmit() on a relay from elsewhere,
such as a userspace querier, is now dropped at the IGMP/MLD type
switch. Before, it trusted whatever skb->cb held, and a NULL
tunnel hit the WARN_ON(1).
📍 영향받는 시스템
AMT 드라이버(drivers/net/amt.c)를 포함하는 Linux 커널 버전 (수정 커밋 이전 버전)
⚔️ 공격 벡터
AMT 릴레이 환경에서 지연된 패킷이 큐에 머무는 동안 터널이 만료되어 해제되면, 이후 디큐 과정에서 메모리 손상 또는 커널 크래시가 발생할 수 있음
🛡️ 대응 방법
해당 수정이 포함된 최신 Linux 커널 버전으로 업데이트하고 재부팅
🔧 검증 코드
출력된 커널 버전을 배포판의 보안 권고나 커널 changelog와 비교해 CVE-2026-98968 수정이 포함되었는지 확인하며, 배포판 패키지 관리자의 변경 로그를 함께 확인합니다.