[방어] 분석 — CVE-2026-31402
CVE-2026-31402 is a critical remote heap‑overflow in the NFSv4 LOCK replay cache that allows unauthenticated attackers to corrupt kernel memory; immediate mitigation is to block external NFS (port 2049) or disable the replay cache while applying the upstream kernel patch.
📋 요약
- 심각도 critical · CVSS 9.8 · EPSS 0.0049 · 악용난이도 moderate
🔍 공격 기법
두 개의 협조적인 NFSv4 클라이언트가 필요합니다. 첫 번째 클라이언트는 1024 바이트까지 허용되는 매우 긴 lock owner 문자열을 포함한 LOCK 요청으로 잠금을 설정하고, 두 번째 클라이언트가 동일 파일에 충돌하는 LOCK 요청을 전송하면 nfsd4_encode_operation()이 고정 112 바이트 버퍼(rp_ibuf)로 전체 응답을 복사하면서 경계 검사를 하지 않아 슬랩 메모리 밖으로 최대 944 바이트를 기록합니다. 인증이 필요 없으며 네트워크만 열려 있으면 원격에서 트리거할 수 있습니다.
💥 영향 분석
슬랩‑out‑of‑bounds 쓰기로 인한 힙 손상은 커널 패닉, 시스템 재부팅 또는 루트 권한을 얻는 원격 코드 실행(RCE)으로 이어질 수 있습니다. 또한 전체 호스트가 서비스 거부(DoS) 상태에 빠지며, NFS를 사용하는 모든 애플리케이션이 영향을 받습니다.
🔗 관련 취약점·체이닝
- 추정: CWE‑122 (Heap‑based Buffer Overflow) 유형의 다른 파일 시스템 데몬 취약점과 연계될 수 있습니다.
- 추정: 동일한 메모리 손상 경로를 이용해 커널 권한 상승을 목표로 하는 로컬 익스플로잇 체인에 결합될 가능성이 존재합니다.
🔎 탐지
-
로그 지표
dmesg/ kernel 로그: “nfsd4_encode_operation” 문자열과 함께 “bytes copied” 혹은 “slab out of bounds” 메시지가 나타날 경우.- auditd 로그(
type=PROCTITLE): NFS 서버 프로세스(rpc.nfsd)가LOCK_DENIED응답을 생성하면서 XDR 버퍼 길이가 비정상적으로 큰(>256) 경우. - netfilter NFLOG: 포트 2049(UDP/TCP)에서 동일 클라이언트 IP가 짧은 시간 내에 다수의 LOCK 요청과 거부 응답을 교환할 때 기록.
-
SIEM 쿼리 예시 (예: Splunk, Elastic)
text1index=kernel_logs ("nfsd4_encode_operation" AND "bytes copied")2 OR (msg="NFSv4 LOCK_DENIED" AND xdr_len>256)3| stats count by host, src_ip, _time4| where count > 5 -
정규식 예시
text1/LOCK_DENIED.*opaque_length=\d{3,}/ -
오탐 튜닝
- 정상적인 대용량 파일 잠금(예: HPC 클러스터)에서는 owner 길이가 512 바이트 이하인 경우만 경보 제외.
- 동일 src_ip에서 1분 내에 10건 이상 발생하면 고위험으로 승격하고, 그 이하이면 “정보” 레벨로 낮춤.
🛡️ 완화 방안
- 즉시(긴급 차단)
iptables/nftables규칙을 추가해 신뢰되지 않은 서브넷에서 NFSv4 LOCK 요청을 차단합니다.
1nft add rule ip filter input ip saddr <untrusted_subnet> tcp dport 2049 ct state new log drop comment "Block NFSv4 LOCK"-
구현 난이도 ★☆☆ (간단한 방화벽 규칙) / 운영 영향 ★★ (NFS 사용 서비스가 차단될 수 있음) / 검증: 해당 서브넷에서
lockd명령 실행 시 연결 거부 확인. -
단기(완화)
- NFS 서버 설정 파일
/etc/exports에secure,root_squash옵션을 강제하고, 허용 클라이언트를 명시적으로 지정합니다.- 구현 난이도 ★★★ / 운영 영향 ★ (일부 합법적인 원격 클라이언트가 차단될 수 있음) / 검증:
exportfs -v출력에 적용된 옵션 확인 및 정상 클라이언트에서 LOCK 요청 성공 여부 테스트.
- 구현 난이도 ★★★ / 운영 영향 ★ (일부 합법적인 원격 클라이언트가 차단될 수 있음) / 검증:
- SELinux 정책을 이용해
rpc.nfsd_t프로세스의 메모리 할당 범위를 제한하고, 비정상적인 slab write 시 감사 로그를 생성하도록 규칙 추가.- 구현 난이도 ★★★ / 운영 영향 ★★ (정책 재로드 필요) / 검증:
ausearch -m avc -ts recent로 관련 AVC 거부 로그 확인.
- 구현 난이도 ★★★ / 운영 영향 ★★ (정책 재로드 필요) / 검증:
- NFS 서버 설정 파일
-
근본(해결)
- 커널 패치를 적용하여
NFSD4_REPLAY_ISIZE를 충분히 크게 늘린 최신 커널 버전(예: 6.7 이후)으로 업그레이드합니다.- 구현 난이도 ★★★★ (커널 교체 및 재부팅) / 운영 영향 ★★★ (재시작 시 서비스 중단) / 검증: `grep NFSD4_REPLAY_ISIZE /boot/config-$(uname
- 커널 패치를 적용하여
⚖️ 위험도 / 우선순위
- 조치: scheduled (이번 주 내)
- 근거: CVSS=9.8 · non-KEV · EPSS=0.0049 · exploit=moderate · in_scope=None