[단독방어] 분석 — CVE-2025-71085
CVE-2025-71085 allows remote attackers to trigger a kernel OOPS in affected Linux kernels by sending crafted IPv6 CALIPSO packets, and the fastest mitigation is to disable the CALIPSO netlabel subsystem immediately.
📋 요약
- 심각도 high · CVSS 7.5 · EPSS 0.00239 · 악용난이도 moderate
🔍 공격 기법
netlabelctl 로 CALIPSO 라벨을 조작하면 calipso_skbuff_setattr() 가 호출되고, 여기서 skb_cow() 에 headroom 값이 INT_MAX 보다 크게 전달됩니다. 정수 캐스트 오류로 delta가 음수가 되어 pskb_expand_head() 에 nhead < 0 가 전달돼 BUG_ON 이 발생하고 커널 OOPS → 시스템 패닉(DoS) 으로 이어집니다. 네트워크를 통한 원격 IPv6 패킷 전송만으로 트리거 가능합니다.
악용 가능성: 이 취약점은 CVSS AV:N/AC:L/PR:N/UI:N 로 평가되므로 공격자는 네트워크만 접근하면 별도의 권한 상승이나 사용자 개입 없이도 악용할 수 있습니다. pkb_expand_head() 의 BUG_ON 은 headroom > INT_MAX 가 되는 상황에서 발생하므로, 공격자는 IPv6 패킷을 구성해 커널이 헤드룸 계산 시 정수 오버플로우가 일어나도록 만들면 됩니다. 실제 위협 정도는 EPSS 0.00239(≈0.24 %) 로 낮지만, 이 값은 전 세계 Linux‑kernel 사용량 대비 실제 악용 사례가 드물다는 의미이며, KEV에 등재되지 않았더라도 커널 전체에 퍼지는 위험성을 무시할 수 없습니다. 공격 표면은 IPv6 스택의 calipso_skbuff_setattr() 가 호출되는 모든 경로—예를 들어 netlink RTM_NEWLINK, raw IPv6 socket, 혹은 IPsec SA 설정 시 전달되는 옵션—에서 노출됩니다. 특히 헤드룸을 조작할 수 있는 사용자 공간 프로그램(예: ping6, ip 명령)이나 커스텀 패킷 생성 도구가 해당 파라미터를 임의로 지정하면 트리거가 가능합니다. 따라서 공격자는 네트워크 경계에서 IPv6 패킷을 변조하거나, 로컬에서 특권 없이도 헤드룸 값을 조작할 수 있는 애플리케이션을 이용해 이 버그를 유발할 수 있습니다. 이와 같은 조건이 충족될 경우 커널 oops 가 발생하여 시스템 전체가 중단되거나, 이후 권한 상승 단계로 이어질 가능성이 존재합니다.
💥 영향 분석
성공 시 해당 호스트는 즉시 커널 패닉을 일으켜 재부팅되며, 서비스 가용성이 상실됩니다. CALIPSO 라벨링을 사용하는 다수의 서버가 동시에 영향을 받을 경우 대규모 서비스 거부 공격으로 확대될 수 있습니다.
🔗 관련 취약점·체이닝
- 과거 skb headroom 처리 오류와 유사한 커널 버그(CVE‑2019‑XXXXX 등)와 결합하면 동일 경로를 통한 DoS 가능성이 높아집니다.
- CALIPSO 라벨링을 이용한 권한 상승 취약점과 연계될 경우, 초기 DoS 후 복구 과정에서 남은 루트 권한을 활용해 추가 침투가 시도될 수 있습니다.
🔎 탐지
로그 지표
- 커널 로그(
dmesg,/var/log/kern.log)에pskb_expand_head.*nhead < 0혹은BUG: unable to handle kernel메시지가 기록됨. auditd이벤트(type=EXECVE)에서netlabelctl실행 시 인자에calipso add·map add가 포함될 경우 의심 대상.
SIEM 탐지 규칙 예시
-
Kernel OOPS 감지 (Elastic/Kibana)
text1event.dataset:"syslog" and message:/pskb_expand_head.*nhead < 0/2| stats count() by host, @timestamp3| where count > 0오탐: 디버그 빌드에서 동일 문자열이 남을 수 있음 →
kernel.severity:"critical"필터 추가. -
netlabelctl 실행 감시 (Splunk)
text1index=audit sourcetype=auditd:execve proc_name=netlabelctl2("calipso add" OR "map add")3| stats count by host, user, _time span=1m4| where count > 3오탐: 정기 라벨 갱신 작업(예: root/cron) →
user!="root"혹은proc.cwd!="/etc/netlabel"조건으로 화이트리스트. -
IPv6 패킷 헤드룸 비정상 증가 (eBPF Netfilter 로그)
text1source:netflow ipv6.next_header=43 and packet.length > 21474836472| stats count by src_ip, host, _time span=1m3| where count > 5오탐: 대용량 멀티미디어 스트림 →
packet.length가 실제 INT_MAX(≈2 147 483 647) 이상인 경우에만 알림.
튜닝 포인트
- 커널 디버그 레벨 로그(
kernel.debug)를 필터링해 오탐 감소. - 정상 라벨 관리 작업은
cron.daily실행 시process.start_time과user=root를 화이트리스트에 추가.
🛡️ 완화 방안
즉시(긴급 차단)
- CALIPSO 서브시스템 비활성화:
/etc/sysctl.d/99-calipso.conf에net.ipv6.calipso_enabled = 0(존재 시) 혹은net.ipv6.conf.all.disable_ipv6 = 1로 설정 후sysctl -p /etc/sysctl.d/99-calipso.conf.
난이도: ★☆☆ (단일 sysctl 적용) → 운영 영향: CALIPSO 라벨링을 사용하는 서비스가 즉시 중단됨.
검증:sysctl -a | grep calipso로 값 확인,netlabelctl실행 시 오류 발생 여부 테스트.
단기(완화)
-
netlabelctl실행 제한: AppArmor 프로파일 또는 SELinux 정책에서netlabelctl에cap_net_admin과cap_sys_admin권한을 차단하고,/usr/sbin/netlabelctl의 실행 자체를auditallow로만 허용.
난이도: ★★☆ (정책 작성·배포) → 운영 영향: 다른 네트워크 관리 도구가 동일 권한을 필요로 하면 일시적 오류 발생 가능.
검증: 정책 적용 후auditd에 “AVC denied” 로그 확인, 정상 IPv6 트래픽이 차단되지 않는지 ping 테스트. -
커널 파라미터 제한:
/etc/sysctl.d/99-skb.conf에net.core.somaxconn = 1024등 비정상적인 헤드룸 확장을 억제하는 일반적인 네트워크 파라미터를 강화(직접적인 방어는 아니지만 과도한 headroom 할당을 감소).
난이도: ★☆☆ (sysctl 재로드) → 운영 영향: 최소, 기존 서비스에 큰 변화 없음.
검증:sysctl -a | grep somaxconn로 확인 후 부하 테스트.
근본(해결)
- 공식 패치 적용: Linux 커널 5.15.199 이상, 6.1.161 이상 등 취약 버전이 포함되지 않은 최신 릴리즈로 업그레이드. 패키지 매니저(
apt,yum,dnf)를 이용해linux-image를 최신으로 교체하고 재부팅.
난이도: ★★☆ (버전 호환성 검증 및 재부팅 필요) → 운영 영향: 서비스 재시작 필요, 테스트 환경에서 사전 검증 권고.
검증:uname -r로 커널 버전 확인, 취약 함수(calipso_skbuff_setattr)가 포함되지 않은지 소스 코드 diff 검토.
잔여 리스크
패치 적용 전까지는 위 즉시·단기 조치를 유지해야 하며, 다른 skb headroom 관련 버그가 존재할 가능성이 있으므로 지속적인 커널 로그 모니터링을 권장합니다. 패치 후에도 pskb_expand_head 오류 메시지가 남아 있다면 추가적인 커널 옵션이나 보안 모듈(AppArmor/SELinux) 정책을 재검토하십시오.
⚖️ 위험도 / 우선순위
- 조치: scheduled (이번 주 내)
- 근거: CVSS=7.5 · non-KEV · EPSS=0.00239 · exploit=moderate · in_scope=None