[공격] 분석 — CVE-2026-31495
CVE-2026-31495 is a local kernel flaw in ctnetlink attribute validation that can cause kernel panic or memory corruption, and the highest‑priority mitigation is to deploy the patched kernel and lock down NETLINK_NETFILTER access.
📋 요약
- 심각도 medium · CVSS 5.5 · EPSS 0.00129 · 악용난이도 hard
🔍 공격 기법
-
공격 표면
NETLINK_NETFILTER(family =AF_NETLINK, protocol =NETFILTER_NETLINK_CT) 소켓을 통해 전달되는 ctnetlink 메시지.- 취약한 속성:
CTA_PROTOINFO_TCP_WSCALE_ORIGINAL,CTA_PROTOINFO_TCP_WSCALE_REPLY,CTA_FILTER_ORIG_FLAGS,CTA_EXPECT_FLAGS등.
-
트리거 조건
- 로컬에서 netlink 소켓을 생성(
socket(AF_NETLINK, SOCK_DGRAM, NETFILTER_NETLINK_CT)). IPCTNL_MSG_CT_NEW혹은IPCTNL_MSG_CT_UPDATE메시지에 위 속성 중 허용 범위를 초과하는 값(예:ws_scale = 0xFF)을 삽입.- 커널은 기존 구현에서 해당 값을 그대로
u32좌측 시프트 연산에 사용 → 시프트 카운트가 31 초과, 정의되지 않은 동작 발생.
- 로컬에서 netlink 소켓을 생성(
-
단계별 흐름
| 단계 | 전제조건 | 관측 지표 |
|---|---|---|
| 정찰 | /proc/net/netlink 혹은 ss -a 로 NETLINK_NETFILTER 존재 확인 | netlink 소켓 열 수 있음 |
| 초기 접근 | 프로세스가 CAP_NET_ADMIN(또는 컨테이너 내에서 동일 네임스페이스를 공유하는 경우) 권한을 보유 | socket() 호출 성공, setsockopt 로 권한 체크 통과 |
| 실행·권한 획득 | 위와 같이 비정상 속성값 포함 메시지 전송 | 커널 로그에 invalid shift count, netfilter: attribute out of range 등 출력 → OOPS 발생 시 시스템 패닉, 메모리 손상 가능 |
| 지속 | Secure Boot/SELinux 정책이 없으면 재부팅 후 동일 취약점 재활용 가능 | 부팅 로그에서 커널 패닉 반복 여부 확인 |
-
CVSS ↔ 실제 조건 매핑
AV:L→ 로컬 접근만 필요 (netlink 소켓을 열 수 있는 호스트).AC:L→ 단순 바이너리 조합으로 메시지 생성 가능.PR:L→ CAP_NET_ADMIN 정도의 낮은 권한이면 충분(컨테이너 환경에서는 일반 사용자도 해당 네임스페이스를 공유할 경우 가능).UI:N→ 자동 스크립트로 전송 가능, 사용자 개입 불필요.
-
공격 원리: Netlink 정책 검증이 도입되기 이전에 수동 범위·마스크 체크가 누락돼, 커널이 비정상적인 시프트 연산을 수행하게 함 → 정의되지 않은 동작 → OOPS(DoS) 혹은 힙/스택 오버플로우를 유발해 Local Privilege Escalation 가능.
악용 가능성: 해당 취약점은 AV:L(로컬)·AC:L(낮은 복잡도)·PR:L(낮은 권한)·UI:N(사용자 개입 없음)의 CVSS 벡터를 가지고 있어, 로컬에 접근 가능한 계정이라면 별도의 사회공학적 단계 없이 바로 악용이 가능함을 의미합니다. 다만 EPSS = 0.00129라는 실측값과 KEV 미등재 상황은 현재까지 실제 공격 사례가 거의 보고되지 않았으며, 위협 인텔리전스에서도 주목받지 못하고 있음을 보여줍니다. 공격 표면은 netlink 소켓을 통해 노출되는 ctnetlink 인터페이스이며, 특히 CTA_PROTOINFO_TCP_STATE, CTA_PROTOINFO_TCP_WSCALE_ORIGINAL/REPLY, CTA_FILTER_ORIG_FLAGS/REPLY_FLAGS와 같은 파라미터가 정책 검증 없이 커널에 전달될 수 있습니다. 공격자는 로컬 프로세스에서 악의적인 netlink 메시지를 전송해, 잘못된 값(예: 0‑255 범위의 wsacle)을 u32 시프트 연산에 사용하도록 유도함으로써 정의되지 않은 동작을 일으킬 수 있습니다. 이 과정은 기존 네트워크 필터링 도구(nftables, iptables 등)
💥 영향 분석
- 가용성: 커널 패닉이 발생하면 시스템 전체가 중단돼 즉시 재부팅 필요 (
A:H). - 권한 상승: 시프트 연산 오류가 힙/스택 메모리 손상으로 이어질 경우, 공격자는 임의 코드를 삽입해 루트 권한을 획득할 수 있음 (
LPE). - 기밀·무결성: 직접적인 정보 유출·변조는 없으나, 성공 시 전체 시스템 장악이 가능하므로 간접적으로 영향을 미침.
🔗 관련 취약점·체이닝
- 유형: 입력값 범위 검증 부재(CWE‑20) → 정수 연산 오류(CWE‑681) → 메모리 손상 → 로컬 권한 상승(LPE).
- 가능한 체인(추정)
- CVE-2026-31495 : ctnetlink 속성 범위 검증 미비 → 커널 OOPS/메모리 오버플로.
- 동일 커널 버전에서 보고된
kmem_cache·slab관련 취약점(예: CVE‑2024‑xxxx)과 결합하면, 메모리 손상 후 임의 코드 실행이 가능함(추정). - 최종적으로 루트 권한 획득 → 시스템 전체 장악.
🔎 탐지
- 커널 로그:
dmesg·/var/log/kern.log에 “invalid shift count”, “netfilter: attribute out of range”, “ctnl: parsing error” 등 메시지가 기록될 경우. - Auditd 규칙 예시:
비정상적인 attribute 값(text1auditctl -a always,exit -F arch=b64 -S socket -F a0=AF_NETLINK -F a2=NETFILTER_NETLINK_CT
value > 14)이 포함된 netlink 전송 시type=PROCTITLE과 함께 알림. - Syslog/Alert: OOPS 발생 시
kernel: BUG:로그와 연관 PID가 표시되므로, 해당 PID를 추적해 악의적인 프로세스 식별 가능.
🛡️ 완화 방안
- 패치 적용 –
netfilter: ctnetlink: use netlink policy range checks가 포함된 커널(2.6.22.1 ~ 6.19.11 등)으로 업데이트하고, 최신 LTS 배포판을 사용합니다. - 접근 제한 – SELinux/AppArmor 정책에서
netlink_socket에 대한CAP_NET_ADMIN요구를 강화하고, 일반 사용자에게는 NETLINK_NETFILTER 소켓 생성 자체를 차단합니다. - 불필요한 모듈 비활성화 – 사용하지 않는
nf_conntrack,nf_nat등 conntrack 관련 모듈을/etc/modprobe.d/에서 로드 금지(install nf_conntrack /bin/true). - 모니터링 강화 – 앞서 제시한 auditd 규칙과 커널 로그 알림을 배포해 비정상적인 ctnetlink 메시지를 실시간 감지하고, 탐지 시 자동 차단 스크립트를 연동합니다.
※ EPSS 0.00129(실측 악용 가능성 낮음)와 CVSS 5.5·exploit hard에 기반한 우선순위는 “monitor” 로 판단되었지만, 가용성 손실 위험이 크므로 패치 적용과 netlink 접근 제한을 즉시 수행하는 것이 실무 방어에서 가장 효과적인 조치입니다.
⚖️ 위험도 / 우선순위
- 조치: monitor (모니터링)
- 근거: CVSS=5.5 · non-KEV · EPSS=0.00129 · exploit=hard · in_scope=None