
🔐 CVE-2026-31431(CopyFail) 전체 사례 연구 — Linux 커널의 심각한 권한 상승 취약점. 기술 분석, 검증 스크립트, 하드닝 및 침해 대응 플레이북을 포함합니다. 교육 목적으로 제공됩니다.
완전한 사례 연구 — 2017년 이후 거의 모든 Linux 배포판에 영향을 미치는 치명적인 취약점이 어떻게 발견되었는지, 어떻게 작동하는지, 어떻게 테스트하는지, (안전한 환경에서) 어떻게 재현하는지, 그리고 어떻게 수정하는지.
이 저장소는 교육 목적으로만 제공됩니다. 여기에 포함된 정보는 보안 전문가, 연구원 및 사이버보안 학생을 대상으로 합니다. 명시적 승인 없이 여기에 설명된 어떤 기술도 시스템에 사용하지 마십시오. 이 정보의 오용은 브라질 법률 제12.737/2012호(캐롤라이나 디크만 법) 및 인터넷 민간 프레임워크(법률 제12.965/2014호)에 따른 범죄에 해당할 수 있습니다.
CopyFail 취약점은 보안 기업 Theori 가 Linux 커널 코드, 특히 메모리 공간 간 데이터 복사를 담당하는 하위 시스템을 분석하던 중 발견했습니다.
2026년 3월 → Theori 연구원들이 커널에서 비정상적인 동작 식별
2026년 3월 → 커널 보안 팀에 책임 있는 공개 (Responsible Disclosure)
약 1주일 후 → kernel.org에서 업스트림 패치 제공
2026년 5월 → 익스플로잇 코드 (PoC) 공개
2026/05/01 → Microsoft 기술 분석 게시
2026/05/04 → CISA가 KEV 카탈로그 (Known Exploited Vulnerabilities)에 추가
2026/05/15 → 미국 연방 기관 수정 기한
Linux 커널에는 메모리의 서로 다른 영역(userspace ↔ kernelspace) 간에 데이터를 복사하는 내부 루틴이 있습니다. 이 결함은 영향을 받는 구성 요소가 복사해야 할 특정 데이터를 복사하지 않기 때문에 CopyFail이라는 이름이 붙었습니다. 이로 인해 커널 내부의 민감한 데이터 구조가 손상되어 권한 상승을 위한 악용 창구가 열립니다.
Linux 커널은 두 개의 서로 다른 공간에서 메모리를 관리합니다:
┌─────────────────────────────────────┐
│ USERSPACE │
│ 공격자 프로세스 (uid=1000) │
│ → 악의적인 syscall 호출 │
└────────────────┬────────────────────┘
│ syscall
▼
┌─────────────────────────────────────┐
│ KERNELSPACE │
│ 데이터 복사 루틴 │
│ → BUG: 메타데이터 복사 실패 │
│ → 제어 구조 손상 │
│ → 공격자가 포인터 조작 │
│ → root로 코드 실행 │
└─────────────────────────────────────┘
uid=0(root)으로 실행되어 시스템에 대한 전체 제어권을 얻습니다// 취약한 버전 (단순화, 교육용)
int kernel_copy_data(struct user_request *req) {
struct kernel_buffer kbuf;
// BUG: 데이터의 일부만 복사하고 중요한 필드는 무시합니다
// 보안 필드(security_context)가 복사되지 않습니다!
memcpy(&kbuf.data, req->data, req->size);
// → kbuf.security_context는 초기화되지 않은 상태로 유지됩니다 (메모리 쓰레기)
process_buffer(&kbuf); // 손상된 데이터 사용
return 0;
}
// 수정된 버전
int kernel_copy_data(struct user_request *req) {
struct kernel_buffer kbuf;
// FIX: 보안 필드를 포함한 전체 struct를 복사합니다
if (copy_from_user(&kbuf, req, sizeof(struct kernel_buffer)))
return -EFAULT;
process_buffer(&kbuf);
return 0;
}
⚠️ 2017년 이후 배포된 커널 ≤ 7.0을 실행하는 모든 Linux 배포판은 잠재적으로 취약합니다.
공유 서버(예: 호스팅 환경, VPS)의 권한 없는 사용자가 익스플로잇을 실행하여 root를 얻습니다.
인터넷 → [웹 취약점을 통한 RCE] → 제한된 셸 → [CopyFail] → root
Microsoft 분석에 따르면: 이 결함은 인터넷을 통해 전달되는 익스플로잇(예: 웹 애플리케이션의 RCE)과 체인으로 연결되어 서버가 완전히 손상될 수 있습니다.
Linux 사용자가 악성 링크나 첨부 파일을 열도록 속아 로컬에서 익스플로잇이 실행됩니다.
악의적인 행위자가 오픈 소스 개발자 계정을 손상시키고 널리 배포되는 코드에 익스플로잇을 주입합니다.
손상된 클라우드 서버는 동일한 인프라에 있는 모든 VM, 컨테이너, 애플리케이션 및 고객 데이터베이스를 노출할 수 있습니다.
⚠️ 통제되고 격리된 환경에서만 — 외부 네트워크 액세스가 없는 VM!
# 필요한 도구
sudo apt install -y git build-essential libssl-dev bc flex bison
# 현재 커널 버전 확인
uname -r
# 취약한 범위(≤ 7.0)에 있는지 확인
# 취약한 출력 예: 6.8.0-51-generic
# 1. 격리된 VM 생성 (권장: VirtualBox 또는 QEMU)
# Ubuntu 24.04 또는 Debian Bookworm ISO 사용
# 2. VM이 프로덕션 인터넷에 액세스할 수 없는지 확인
# (host-only 네트워크 또는 격리된 NAT 사용)
# 3. 공격자를 시뮬레이션할 권한 없는 사용자 생성
sudo adduser testuser
su - testuser
# 4. testuser에게 sudo가 없는지 확인
sudo whoami # 반환값: "testuser is not in the sudoers file"
# 확인 스크립트 (악용하지 않고 확인만)
#!/bin/bash
KERNEL_VERSION=$(uname -r | cut -d. -f1,2)
MAJOR=$(echo $KERNEL_VERSION | cut -d. -f1)
MINOR=$(echo $KERNEL_VERSION | cut -d. -f2)
echo "[*] 감지된 커널: $(uname -r)"
if [ "$MAJOR" -lt 7 ] || ([ "$MAJOR" -eq 7 ] && [ "$MINOR" -eq 0 ]); then
echo "[!] CVE-2026-31431 (CopyFail)에 잠재적으로 취약"
echo "[!] 배포판 공급업체가 패치를 적용했는지 확인하세요"
else
echo "[+] 커널 버전이 영향을 받는 범위를 벗어남"
fi
# 패치가 적용되었는지 확인 (패키지 변경 로그를 통해)
apt changelog linux-image-$(uname -r) 2>/dev/null | grep -i "CVE-2026-31431" && \
echo "[+] 변경 로그에서 CVE-2026-31431 패치 발견" || \
echo "[?] 변경 로그에서 패치가 감지되지 않음 — 수동으로 확인하세요"
🔒 이 섹션은 엄격히 교육용입니다. 아래 코드는 공격 벡터의 단순화된 교육용 표현입니다 — 실제 익스플로잇이 아닙니다(윤리적 이유로 여기에 공개되지 않음).
#!/usr/bin/env python3
"""
CVE-2026-31431 (CopyFail) — 교육용 표현
목적: 공격적/방어적 보안 교육
승인 없이 시스템에서 사용하지 마십시오
"""
import ctypes
import os
import sys
def check_environment():
"""랩 환경에 있는지 확인"""
kernel = os.uname().release
print(f"[*] 커널: {kernel}")
print(f"[*] 현재 UID: {os.getuid()}")
if os.getuid() == 0:
print("[-] 이미 root입니다. 익스플로잇이 필요하지 않습니다.")
sys.exit(0)
def demonstrate_concept():
"""
공격 벡터의 개념적 데모:
1. 취약한 syscall 식별
2. 불완전한 복사를 트리거하는 페이로드 구성
3. 메모리 손상 모니터링
4. 권한 상승을 위해 흐름 리디렉션
실제 익스플로잇에서:
- 공격자는 힙 스프레이 또는 ROP 체인과 같은 기술을 사용합니다
- 손상과 손상된 데이터 사용 사이의 창을 악용합니다
- 프로세스 자격 증명을 덮어씁니다 (uid → 0)
"""
print("[*] 개념: 결함이 있는 복사 루틴 트리거")
print("[*] 개념: kernel_buffer struct 손상 모니터링")
print("[*] 개념: 실행 흐름 리디렉션")
print("[*] 참조: https://xint.io/blog/copy-fail-linux-distributions")
def main():
check_environment()
demonstrate_concept()
print("\n[i] 전체 기술 분석은 다음을 참조하세요:")
print(" → https://xint.io/blog/copy-fail-linux-distributions")
print(" → https://www.microsoft.com/en-us/security/blog/2026/05/01/cve-2026-31431-copy-fail-vulnerability-enables-linux-root-privilege-escalation/")
if __name__ == "__main__":
main()
# 별도 터미널에서 커널 로그 모니터링
sudo dmesg -w | grep -E "(oops|panic|null pointer|exploit|cve)"
# 시스템 호출 모니터링
sudo strace -e trace=all -p <PID_DO_PROCESSO>
# 실시간 UID 변경 확인
watch -n 0.5 'cat /proc/self/status | grep -E "^(Uid|Gid)"'
# Ubuntu / Debian
sudo apt update && sudo apt upgrade -y linux-image-generic
sudo reboot
# 재부팅 후 버전 확인
uname -r
# Red Hat / CentOS / Amazon Linux
sudo dnf update -y kernel
sudo reboot
# SUSE
sudo zypper update -t package kernel-default
sudo reboot
# 설치된 커널의 변경 로그 확인
apt changelog linux-image-$(uname -r) | grep CVE-2026-31431
# Ubuntu CVE 추적기를 통해
# https://ubuntu.com/security/CVE-2026-31431
# Red Hat CVE 데이터베이스를 통해
# https://access.redhat.com/security/cve/CVE-2026-31431
# SUID 바이너리 실행 제한 (공격 표면 축소)
find / -perm -4000 -type f 2>/dev/null
# 의심스러운 syscall 감사 활성화
sudo auditctl -a always,exit -F arch=b64 -S all -k syscall_audit
# 권한 상승 시도 모니터링
sudo apt install -y auditd
sudo auditctl -w /etc/passwd -p wa -k passwd_changes
sudo auditctl -w /etc/sudoers -p wa -k sudoers_changes
# 커널 보호 활성화
# /etc/sysctl.conf — 다음 추가:
kernel.dmesg_restrict = 1
kernel.kptr_restrict = 2
kernel.perf_event_paranoid = 3
kernel.unprivileged_bpf_disabled = 1
net.core.bpf_jit_harden = 2
# 적용
sudo sysctl -p
# 가능한 악용 징후:
# 1. root로 실행되는 일반 사용자 프로세스
ps aux | awk '$1 != "root" && $2 == "0"'
# 2. 최근에 생성된 새 SUID 바이너리
find / -perm -4000 -newer /etc/passwd -type f 2>/dev/null
# 3. /etc/passwd의 의심스러운 항목
grep "uid=0" /etc/passwd
# 4. 손상 메시지가 있는 커널 로그
dmesg | grep -iE "(oops|BUG:|corruption|cve)"
# 5. 승인되지 않은 네트워크 연결
ss -tulnp | grep LISTEN
패치 관리는 중요합니다 — 업스트림 패치는 약 1주일 내에 제공되었지만 배포판은 전달하는 데 더 오래 걸립니다. 공급업체를 적극적으로 모니터링하세요.
심층 방어 — LPE만으로는 충분하지 않습니다. 공격자는 초기 액세스가 필요합니다. 시스템에 액세스할 수 있는 사람을 통제하세요.
취약점 체인 공격 — "저위험" 개별 CVE는 결합되면 치명적일 수 있습니다. CVSS 점수만이 아닌 맥락에서 위험을 평가하세요.
공급망은 실제 벡터입니다 — 널리 사용되는 오픈 소스 코드는 공격 벡터가 될 수 있습니다. 패키지 무결성 검증을 구현하세요.
Kubernetes와 컨테이너는 면역이 아닙니다 — 호스트 커널이 취약하면 그 위의 컨테이너도 영향을 받습니다.
항상 완전한 struct를 복사하세요 — 커널 제어 struct의 개별 필드를 복사할 때 모든 중요한 필드가 초기화되도록 보장하지 않고 복사하지 마십시오.
copy_from_user()를 올바르게 사용하세요 — 커널 복사 함수에는 특정한 의미론이 있습니다. 사용 전에 문서를 읽으세요.
보안 코드 리뷰 — 커널 변경은 기능뿐만 아니라 보안에 초점을 맞춘 검토가 필요합니다.
커널 업데이트는 우선순위입니다 — 단순한 "일상 유지보수"가 아닙니다. 커널 취약점은 종종 치명적입니다.
자산 인벤토리는 필수입니다 — 보유하고 있는 것을 모르면 수정할 수 없습니다. Linux 시스템 및 커널 버전의 최신 인벤토리를 유지하세요.
사고 대응 계획 — CISA KEV와 같은 공격적인 기한이 있는 치명적인 취약점을 위한 플레이북을 준비하세요.
오래된 내용을 발견했거나 테스트 시나리오를 추가하고 싶으신가요? 이슈 또는 PR을 열어주세요!
행동 강령을 준수해 주세요: 이 저장소는 교육과 방어를 위한 것입니다 — 악의적인 활동이 아닙니다.
MIT 라이선스 — 시스템을 배우고, 가르치고, 방어하는 데 사용하세요. 공격에는 절대 사용하지 마십시오.
"공격을 아는 것이 방어를 구축하는 첫걸음입니다."
⭐ 이 사례 연구가 유용했다면 저장소에 별표를 남겨주세요!
| 필드 | 세부 사항 |
|---|
| CVE ID | CVE-2026-31431 |
| 별칭 | CopyFail |
| 유형 | 로컬 권한 상승 (LPE) — Privilege Escalation |
| CVSS 점수 | 8.8 (High) / 체인 공격 시 잠재적으로 Critical |
| 구성 요소 | Linux 커널 — 데이터 복사 메커니즘 |
| 버전 | Linux 커널 ≤ 7.0 (2017년 이후 배포판) |
| 발견자 | Theori (보안 기업) |
| 공개일 | 2026년 3월 |
| 업스트림 패치 | 책임 있는 공개 후 약 1주일 내 제공 |
| CISA 상태 | 적극적으로 악용됨으로 등록 — KEV 카탈로그 |
| CISA 기한 | 연방 기관은 2026/05/15까지 수정해야 함 |
| 배포판 | 버전 | 상태 |
|---|
| Red Hat Enterprise Linux | 10.1 | ✅ 취약 |
| Ubuntu LTS | 24.04 | ✅ 취약 |
| Amazon Linux | 2023 | ✅ 취약 |
| SUSE Linux | 16 | ✅ 취약 |
| Debian | 최신 안정 버전 | ✅ 취약 |
| Fedora | 최신 버전 | ✅ 취약 |
| Kubernetes (노드) | 커널 ≤7.0을 사용하는 모든 노드 | ✅ 취약 |