[방어] 분석 — CVE-2026-31469
The CVE-2026-31469 use‑after‑free in virtio_net can be mitigated immediately by enabling NAPI_TX (napi_tx=1) and permanently fixed by applying the kernel patches that add skb_dst_drop() in start_xmit.
📋 요약
- 심각도 high · CVSS 7.8 · EPSS 0.00135 · 악용난이도 hard
🔍 공격 기법
- virtio_net 드라이버가
napi_tx=N로 설정되고, 해당 net_device에서IFF_XMIT_DST_RELEASE플래그가 해제될 때 발생합니다. - 네트워크 네임스페이스가 삭제되는 순간 아직 전송 대기 중인 skb 가 virtio transmit ring 에 남아 있으면,
dst_ops구조체가 이미 해제된 상태가 됩니다. - 이후 새로운 패킷이 전송되면
free_old_xmit()→dst_release()호출 과정에서 해제된dst_ops를 참조하여 커널 페이지 폴트(Use‑After‑Free)가 발생합니다. - 공격자는 네임스페이스 삭제와 동시에 특수하게 조작한 패킷을 전송함으로써 커널 주소 공간에 임의 코드를 실행할 수 있습니다.
악용 가능성: 이 취약점은 CVSS 벡터 AV:L/AC:L/PR:L/UI:N 로 정의되므로 공격자는 로컬 권한만으로도 복잡도가 낮은 절차를 수행하면 된다(예: 루트가 아닌 일반 사용자라도 네임스페이스와 tc 명령을 이용해 IFF_XMIT_DST_RELEASE 플래그를 조작 가능). napi_tx=N 로 설정된 virtio_net 드라이버는 전송 큐에 남아 있는 skb‑dst 구조체가 해제되지 않은 상태로 오래 머물 수 있어, 네트워크 네임스페이스가 파괴될 때 이미 해제된 dst_ops 를 다시 참조하게 된다. 공격 표면은 netlink 인터페이스를 통한 tc 필터 설정·네임스페이스 생성·삭제와 virtio_net 드라이버 자체이며, 외부 네트워크 트래픽이 직접 노출되는 경로는 아니다. EPSS 값 0.00135(≈0.135 %)는 실제 악용 가능성이 매우 낮은 편이지만, 완전히 무시할 수 없으며 KEV 목록에 등재되지 않은 점은 아직 대규모 공격이 관측되지 않았음을 의미한다. 따라서 이 취약점은 이론적 심각도는 중간 수준(UAF)이나, 로컬 환경에서 네임스페이스와 tc 설정을 조작할 수 있는 조건이 충족될 경우 제한된 범위 내에서 코드 실행이 가능하다. 실제 위험은 공격자가 해당 호스트에 접근 권한을 이미 보유하고 있거나, 컨테이너 탈출·네임스페이스 공유 환경을 악용하는 시나리오에 국한된다.
💥 영향 분석
- 성공 시 커널 레벨에서 임의 코드 실행이 가능해져 루트 권한 획득 및 전체 시스템 장악이 이루어집니다.
- 시스템 불안정(커널 패닉)과 서비스 중단이 동반될 수 있으며, 공격자가 메모리 내용을 읽거나 변조함으로써 민감 데이터 유출 위험도 존재합니다.
🔗 관련 취약점·체이닝
- 동일한
dst_release흐름을 이용하는 다른 네트워크 드라이버(예: e1000e, ixgbe)에서도 UAF가 보고된 바 있어, 해당 드라이버와 연계된 공격 체인으로 확장될 가능성이 있습니다. - 메모리 손상(Memory‑Corruption) 기반 권한 상승 취약점과 결합하여 권한 상승 후 파일 시스템 접근·루트킷 설치 등 추가 악용이 가능합니다.
🔎 탐지
로그 지표
dmesg혹은 커널 로그에 “Unable to handle kernel paging request” 와 함께Call Trace:가 기록됩니다. 특히 아래와 같은 함수명이 포함됩니다.free_old_xmitdst_releaseskb_dst_drop(패치 적용 시)
SIEM 쿼리 예시 (Elastic/Kibana)
1event.module:kernel AND message:"Unable to handle kernel paging request" 2AND (message:*free_old_xmit* OR message:*dst_release*) 3| stats count by host, container.id 4| where count > 0Splunk 검색식
1index=linux _raw="Unable to handle kernel paging request" 2| regex _raw="(free_old_xmit|dst_release)" 3| stats dc(host) as affected_hosts by host정규식 패턴 (로그 파일용)
^.*Unable to handle kernel paging request.*(free_old_xmit|dst_release).*$
오탐 튜닝
- 정상적인 커널 OOPS 로그에도
free_old_xmit가 등장할 수 있으므로, 추가 조건으로src_namespace_destroyed와 같은 네임스페이스 삭제 이벤트(netns: destroy)가 동일 시점에 기록된 경우만 알림을 발생시킵니다. - 위 조합이 없으면 경보 레벨을 “Info” 로 낮추고, 관리자에게 검토를 요청합니다.
🛡️ 완화 방안
즉시(긴급 차단) – 오늘 당장 적용할 임시 조치
napi_tx를 강제로 활성화합니다.(모듈 파라미터가 존재하지 않을 경우,text1echo 1 > /sys/module/virtio_net/parameters/napi_tx/etc/modprobe.d/virtio_net.conf에options virtio_net napi_tx=1을 추가하고modprobe -r virtio_net && modprobe virtio_net로 재로드)
단기(완화)
- 모든 virtio_net 인터페이스에
IFF_XMIT_DST_RELEASE플래그를 강제로 설정합니다.bash1for dev in $(ls /sys/class/net | grep ^vnet); do2 ip link set $dev xmit_dst_release on3done - 커널 로그 모니터링 에이전트를 배포하여 위 탐지 쿼리를 실시간 알림으로 전환하고, 발생 시 자동으로 해당 인터페이스를
down상태로 전환하도록 스크립트 연동합니다. - 영향받는 커널 버전에 대해 Red Hat/CentOS 등 공급자의 백포트 패치를 적용합니다(예:
kernel‑5.15.208.el9이상).
근본(해결)
- 해당 취약점이 포함된 커밋(
virtio_net: Fix UAF on dst_ops …)이 들어있는 최신 안정 커널로 업그레이드합니다. 지원되는 최소 버전은 6.7.0‑rc1 이후이며, 배포판별 패키지 이름은linux-image-<ver>입니다. - 업그레이드 후
uname -r로 버전을 확인하고,dmesg | grep "virtio_net"에서 “skb_dst_drop” 로그가 출력되는지 검증합니다.
각 조치별 구현 난이도·운영 영향·검증
| 단계 | 난이도 | 운영 영향 | 검증 방법 |
|---|---|---|---|
즉시 차단 (napi_tx=1) | 낮음 (파일 쓰기) | 인터페이스 재로드 시 일시적 트래픽 중단 | ethtool -i <if> 로 모듈 파라미터 확인, `dmes |
⚖️ 위험도 / 우선순위
- 조치: scheduled (이번 주 내)
- 근거: CVSS=7.8 · non-KEV · EPSS=0.00135 · exploit=hard · in_scope=None