Kestrel
CVE-2026-31504DGX_A· 2026년 8월 2일 AM 03:40

[공격] 분석 — CVE-2026-31504

A local low‑privilege race condition in packet fanout handling (CVE-2026-31504) can be exploited to achieve full kernel compromise, so immediate patching is required.

📋 요약

  • 심각도 high · CVSS 7.8 · EPSS 0.00135 · 악용난이도 hard

🔍 공격 기법

  • 공격 전제 – 로컬 시스템에 낮은 권한(Low privilege) 계정이 존재하고, 커널 버전이 3.1.1–6.19.11 중 하나이며 패치가 적용되지 않은 경우. EPSS 0.00135는 실제 악용 가능성이 낮지만 완전히 배제되지 않음을 의미합니다(실측값).
  • 정찰uname -r 등으로 커널 버전을 확인하고, 해당 버전이 취약 목록에 포함되는지 교차검증된 데이터(다중 소스 일관성)로 검증합니다.
  • 초기 접근 – 로컬 계정에서 socket(AF_PACKET, SOCK_RAW, …) 로 패킷 소켓을 생성하고, 특정 네트워크 인터페이스에 바인드합니다(bind). 이 단계는 일반 사용자도 수행 가능하며, PR:L·AV:L·AC:L·UI:N 조건을 만족합니다.
  • 레이스 트리거 – 두 스레드를 동시 실행합니다.
    1. 첫 번째 스레드는 packet_release() 가 호출되는 상황(소켓 닫기 또는 인터페이스 다운)까지 대기합니다.
    2. 두 번째 스레드는 동일 인터페이스에 대해 인위적으로 NETDEV_UP 이벤트를 발생시킵니다(ifconfig up, ip link set up).
      이때 packet_release()bind_lock을 해제한直후 po->num이 여전히 0이 아니며, NETDEV_UP이 팬아웃 그룹의 arr[]에 소켓을 재등록합니다. 재등록 시 f->sk_ref가 증가하지 않아 dangling pointer 가 남게 됩니다(Use‑After‑Free).
  • 실행·권한 획득 – UAF를 이용해 커널 힙에 임의 객체를 스프레이하고, f->arr[] 에 삽입된 포인터를 조작해 함수 포인터 혹은 call_rcu 콜백을 덮어씁니다. 이를 통해 커널 코드 실행이 가능해지며, 최종적으로 root 권한을 획득합니다.
  • 지속·영향 – 커널 레벨 루트 쉘을 얻은 뒤, 지속성을 위해 init_module 로 백도어를 삽입하거나 systemd 서비스 파일을 조작할 수 있습니다.

CVSS 벡터(AV:L/AC:L/PR:L/UI:N)는 위와 같이 로컬·저복잡도·낮은 권한·사용자 개입 없음 상황과 정확히 일치합니다.

악용 가능성: 이 취약은 AV:L (로컬) · AC:L (낮은 복잡도) · PR:L (낮은 권한) · UI:N (사용자 개입 없음)의 CVSS 벡터가 의미하듯, 공격자는 동일 호스트 내에서 특별한 전제조건 없이 로컬 프로세스로 접근할 수 있습니다. 실제 악용을 위해서는 packet_release() 실행 중에 NETDEV_UP 이벤트를 강제로 발생시켜 __fanout_link() 가 재등록되는 순간을 레이스시키는 것이 핵심이며, 이는 네트워크 인터페이스의 up/down을 반복하는 간단한 스크립트로 충분히 구현 가능합니다. f->arr[] 배열에 남은 dangling pointer가 존재하므로, 재등록된 소켓이 커널 메모리를 임의 조작하게 되면 권한 상승이나 서비스 거부(DoS) 효과를 얻을 수 있습니다. EPSS 0.00135라는 실측값은 전체 CVE 중 매우 낮지만, 로컬 환경에서 반복적인 시도만으로 성공 확률이 존재함을 보여주며, KEV에 등재되지 않은 점은 아직 대규모 공격 캠페인이 관찰되지 않았기 때문입니다. 따라서 공격 표면은 packet_release() → fanout_release() → __fanout_link() 경로와 NETDEV_UP 노티피케이션을 처리하는 netlink 인터페이스이며, 이들 함수가 노출된 커널 모듈에 의해 직접 호출될 수 있는 모든 로컬 프로세스가 잠재적인 공격 대상이 됩니다. 레이스 윈도우는 짧지만 복잡한 동시성 제어를 요구하지 않아 AC:L 조건을 만족하고, 권한 요구가 낮아 PR:L 등급을 유지합니다. 결국 이 취약은 로컬 악의적 사용자가 인터페이스 상태 변화를 조작함으로써 비교적 쉬운 단계(초기 접근·레이스 트리거)

💥 영향 분석

  • 성공 시 공격자는 커널 모드에서 임의 코드를 실행할 수 있어 전체 시스템을 장악합니다.
  • 루트 셸 확보 → 파일 시스템, 네트워크, 메모리 전부 제어 가능.
  • 침해된 호스트가 클러스터·컨테이너 환경에 포함될 경우, 동일 커널 이미지가 배포된 다른 노드에도 연쇄적인 위험이 확산될 수 있습니다.

🔗 관련 취약점·체이닝

  • CWE‑416 (Use After Free) – 현재 결함 자체가 UAF이며, 기존에 보고된 CVE-2025-38617 와 동일한 코드 경로를 추가 감사(Claude Code)하여 발견되었습니다.
  • 가능한 체인
    • 권한 상승 : 로컬 비특권 계정 → 커널 권한 상승 (UAF).
    • KASLR 우회 : 메모리 레이아웃을 추정하기 위해 힙 스프레이·커널 로그 분석을 병행할 수 있습니다(추정).
    • 다른 네트워크 스택 결함 : 예를 들어 CVE‑2024‑XXXX 와 같은 netfilter hook 취약점과 조합하면 원격에서 트리거 조건을 만든 뒤 로컬 UAF로 이어지는 복합 공격이 가능할 수 있습니다(추정).

🔎 탐지

  • 커널 로그(dmesg)에 packet fanout use after free, NULL pointer dereference in __fanout_link 와 유사한 OOPS 메시지가 발생하면 즉시 경보.
  • netdev_up 이벤트와 동시에 packet_release 가 호출되는 비정상적인 빈도 상승을 auditd 혹은 eBPF 기반 트레이싱(bpftrace 'kprobe:packet_release /.../ { @cnt++; }') 로 모니터링.
  • f->arr[] 의 포인터 값이 해제된 주소 영역(예: kmalloc‑free 후 재사용)과 일치하는 경우 메모리 무결성 경고를 생성.

🛡️ 완화 방안

  1. 패치 적용 – upstream 커밋에서 packet_release()bind_lock 보유 중에 po->num = 0 으로 초기화하도록 수정된 커널 패치를 즉시 배포합니다.
  2. 임시 방어 – 비특권 사용자가 PACKET 소켓을 생성하지 못하도록 /proc/sys/net/core/bpf_jit_enable 과 유사하게 net.ipv4.conf.all.rp_filter=1 등 sysctl 로 제한하거나, SELinux/AppArmor 정책에 cap_net_raw 를 요구하도록 설정합니다.
  3. 네트워크 인터페이스 관리 – 불필요한 NETDEV_UP/DOWN 이벤트를 최소화하고, 자동 플러그인(Hot‑plug) 환경에서는 해당 인터페이스에 대한 접근을 제한합니다.
  4. 모니터링 강화 – 위 탐지 항목을 SIEM/EDR 에 연동해 실시간 알림을 구성하고, 의심스러운 커널 OOPS 발생 시 자동 롤백 혹은 호스트 격리 절차를 실행합니다.

위 조치를 통해 CVE-2026-31504 로 인한 커널 권한 상승 위험을 효과적으로 차단할 수 있습니다.

⚖️ 위험도 / 우선순위

  • 조치: scheduled (이번 주 내)
  • 근거: CVSS=7.8 · non-KEV · EPSS=0.00135 · exploit=hard · in_scope=None
※ 본 분석은 Kestrel AI 심층 분석 결과입니다. 참고용이며, 실제 대응 전에는 전문가 검토가 필요합니다.

댓글(0)

댓글 작성 은 로그인 후 이용할 수 있어요.

다른 사용자의 댓글은 자유롭게 읽을 수 있어요.

로그인하기

불러오는 중…