
CVE-2026-31431(Copy Fail) 탐지 스크립트로, Linux 시스템에서 커널 버전, 패치 존재 여부, 커널 구성, AF_ALG 소켓 사용 가능 여부, setuid 바이너리 및 완화 조치를 확인하여 취약점 상태를 판단합니다.
탐지 전용입니다. 작동하는 PoC는 이미 copy.fail/#exploit에 존재합니다. 이 스크립트는 시스템 관리자와 보안 팀이 취약한 위치를 파악하거나 — 패치 적용 후에도 여전히 취약한지 확인하기 위한 것입니다.
2026년 4월 29일, Copy Fail(CVE-2026-31431)이라는 취약점이 Xint Code Research Team에 의해 공개적으로 공개되었습니다. 이는 대략 2017년부터 — 거의 10년 동안 — Linux 커널에 조용히 존재해 온 로직 버그로, 권한이 없는 모든 로컬 사용자가 root 권한을 얻을 수 있게 합니다.
"특정 조건과 약간의 운, 좋은 바람이 있을 때 root 권한을 얻는" 것이 아닙니다. 그냥... 안정적으로 root 권한을 얻습니다. 사실상 모든 주요 Linux 배포판에서 말이죠.
Ubuntu, Amazon Linux, RHEL, SUSE 및 지난 약 8년간의 메인스트림 커널을 실행하는 모든 것에 영향을 미칩니다. 동일한 스크립트, 재컴파일 불필요, 배포판별 조정 불필요.
네, 소문난 것만큼 심각합니다.
Linux 커널에는 AF_ALG 소켓을 통해 권한이 없는 사용자가 접근할 수 있는 암호화 하위 시스템이 있습니다. splice()라는 메커니즘이 있는데, 파일 데이터를 복사하지 않고 해당 하위 시스템에 직접 공급할 수 있습니다 — 즉, 파일의 커널 메모리 내 캐시 복사본("페이지 캐시")이 암호화 작업 내부에 들어가게 됩니다.
특정 알고리즘 — IPsec 확장 시퀀스 번호에 사용되는 authencesn — 은 출력 버퍼를 스크래치 공간으로 사용하고 의도된 위치보다 약간 지나서 4바이트를 쓰는 특성이 있습니다. 일반적으로는 무해합니다. 그러나 /usr/bin/su와 같은 setuid 바이너리의 페이지 캐시 페이지가 (2017년 의 "최적화" 덕분에) 해당 출력 버퍼에 연결되면, 그 4바이트가 커널의 바이너리 캐시 복사본에 직접 기록됩니다.
algif_aead.c작업은 오류와 함께 실패합니다. 커널은 해당 페이지를 dirty로 표시하지 않습니다. 디스크의 파일은 변경되지 않습니다. 디스크 체크섬을 확인하는 파일 무결성 도구는 아무 문제도 발견하지 못합니다.
하지만 실행되는 것은 페이지 캐시입니다. 그리고 su는 setuid root입니다.
전체 기술 문서는 xint.io에 있으며 읽을 가치가 충분히 있습니다.
원래 릴리스의 7개와 탐지 공백을 메우기 위해 추가된 6개의 새 검사:
| # | 검사 | 확인 내용 |
|---|---|---|
| 1 | 커널 버전 | 이 커널이 영향 범위(4.10–6.14)에 있습니까? |
| 2 | 패치 존재 여부 | 수정 커밋이 실제로 실행 중인 커널에 있습니까? |
| 3 | algif_aead 모듈 | 취약한 모듈이 로드되었거나 로드 가능합니까? |
| 4 | CONFIG_CRYPTO_AUTHENC (신규) | CONFIG_CRYPTO_AUTHENC이 내장(=y) 또는 모듈(=m)입니까? 이 단일 옵션은 authenc와 authencesn을 모두 빌드합니다. 내장이면 modprobe 블랙리스트 완화 조치가 효과가 없습니다. |
| 5 | CONFIG_CRYPTO_USER_API_AEAD (신규) | AF_ALG AEAD 사용자 공간 인터페이스가 컴파일되어 있습니까? 그렇지 않으면 전체 익스플로잇 경로가 컴파일 시점에 차단됩니다. |
| 6 | AF_ALG 소켓 | 권한이 없는 사용자가 지금 하나를 열 수 있습니까? |
| 7 | Python os.splice | 순수 Python 익스플로잇 경로를 사용할 수 있습니까? |
| 8 | Setuid 바이너리 | 시스템에 존재하는 읽기 가능한 setuid-root 대상의 확장 목록. |
| 9 | 완화 조치 | AppArmor, SELinux, seccomp — 무엇이 적용되어 있습니까? |
| 10 | 사용자 네임스페이스 (신규) | 권한이 없는 사용자 네임스페이스가 활성화되어 있습니까? (Copy Fail을 직접 차단하지는 않지만, 더 넓은 로컬 권한 상승 표면에 영향을 미칩니다.) |
| 11 | 투명 대용량 페이지 (신규) | THP 상태 — 페이지 캐시 정렬 및 익스플로잇 신뢰성에 영향을 줄 수 있습니다. |
| 12 | 환경 탐지 (신규) | Docker/컨테이너/VM 컨텍스트 — 컨테이너는 호스트 커널을 공유합니다; 패치가 필요한 것은 호스트입니다. |
| 13 | Root 사용자 경고 (신규) | root로 실행 중이면 경고합니다. 여러 검사가 권한 없는 제한과 관계없이 root에 대해 오탐을 주기 때문입니다. |
Bash 스크립트는 동일한 핵심 탐지 로직을 다루지만 Python 특정 항목 3개는 생략합니다:
| # | 검사 | 비고 |
|---|---|---|
| 1 | 커널 버전 | |
| 2 | 패치 존재 여부 | |
| 3 | algif_aead 모듈 | |
| 4 | AF_ALG 소켓 | 가능하면 Python을 헬퍼로 사용; 그렇지 않으면 커널 구성 추론으로 대체 |
| 5 | Setuid 바이너리 | 확장 목록, Python 버전과 동일 |
| 6 | 완화 조치 | AppArmor, SELinux, seccomp |
| 7 | CONFIG_CRYPTO_AUTHENC | |
| 8 | 사용자 네임스페이스 | |
| 9 | 투명 대용량 페이지 | |
| 10 | 환경 탐지 |
셸 스크립트에 없는 항목 (Python 대비):
| 누락된 검사 | 이유 |
|---|---|
| CONFIG_CRYPTO_USER_API_AEAD | 아직 구현되지 않음 — 계획됨 |
| Python os.splice 가용성 | 셸 스크립트에는 해당 없음 |
| Root 사용자 경고 | 아직 구현되지 않음 — 계획됨 |
어느 스크립트도 아무것도 수정하거나 익스플로잇하지 않습니다. 시스템에 대한 진실을 알려주어 조치를 취할 수 있게 합니다.
# 스크립트를 클론하거나 다운로드한 후:
python3 cve-2026-31431-detect.py
그게 전부입니다. 끝에 요약이 있는 색상 코드 보고서가 출력됩니다.
스크립트는 취약한 결과가 발견되면 0이 아닌 코드로 종료되어 파이프라인 사용에 적합합니다:
| 코드 | 의미 |
|---|---|
0 | 취약한 조건 없음 |
1 | 하나 이상의 취약한 조건 발견 |
# 예: 호스트가 취약하면 CI 단계 실패
python3 cve-2026-31431-detect.py
rc=$?
if [ $rc -eq 1 ]; then
echo "VULNERABLE — 배포 차단"
elif [ $rc -ne 0 ]; then
echo "ERROR — 스크립트 완료 실패 (exit $rc)"
fi
CVE-2026-31431 'Copy Fail' — 취약점 탐지
authencesn 페이지 캐시 손상 / 로컬 권한 상승
uid=1001, euid=1001로 실행 중
=== 커널 버전 ===
[취약] 커널 버전
이유 : 커널이 취약 범위(4.10 – 6.14)에 있음
세부 : 릴리스: 6.12.0-124.45.1.el10_1 — 패치 상태 확인 필요
=== CONFIG_CRYPTO_AUTHENC (커널 구성) ===
[취약] CONFIG_CRYPTO_AUTHENC
이유 : 모듈로 빌드됨(=m): AF_ALG bind() 시 자동 로드; modprobe 블랙리스트가 올바른 완화 조치
=== CONFIG_CRYPTO_USER_API_AEAD (커널 구성) ===
[취약] CONFIG_CRYPTO_USER_API_AEAD
이유 : AF_ALG AEAD 인터페이스가 로드 가능한 모듈 — 권한 없는 사용자가 AF_ALG 소켓을 통해 암호화 하위 시스템에 접근 가능
...
시스템이 CVE-2026-31431에 취약할 가능성이 높음
권장 조치:
1. 배포판의 CVE-2026-31431 커널 업데이트 적용
2. 패치 전까지 모듈 블랙리스트:
echo 'install algif_aead /bin/false' > /etc/modprobe.d/disable-algif-aead.conf
rmmod algif_aead 2>/dev/null
참고: CONFIG_CRYPTO_AUTHENC=m(모듈)일 때만 효과적입니다.
CONFIG_CRYPTO_AUTHENC=y(내장)인 경우 패치가 유일한 해결책입니다.
Python이 없거나 셸 네이티브 도구를 선호하는 환경을 위한 동반 Bash 스크립트(cve-2026-31431-detect.sh)가 제공됩니다. 13개 검사 중 10개를 수행합니다 — 차이점에 대한 자세한 내용은 위의 검사 비교 표를 참조하세요.
# 기본 실행
bash cve-2026-31431-detect.sh
# JSON 출력 — SIEM 수집, Ansible facts, 로그 집계에 적합
bash cve-2026-31431-detect.sh --json > scan-results.json
# 조용한 모드 — 요약만 출력 (CI 로그에 유용)
bash cve-2026-31431-detect.sh --quiet
# ANSI 색상 비활성화 (로그 파일용)
bash cve-2026-31431-detect.sh --no-colour
셸 스크립트는 동일한 종료 코드(0 = OK, 1 = 취약)를 사용하며 파이프라인 소비를 위한 동등한 JSON 출력을 생성합니다. 시스템에 Python 3이 있으면 셸 스크립트가 이를 사용하여 실시간 AF_ALG 소켓 테스트를 수행하고, 그렇지 않으면 커널 구성 추론으로 대체합니다.
진짜 해결책은 커널 패치입니다. 배포판의 보안 권고를 확인하세요.
| 배포판 | 확인 위치 |
|---|---|
| Ubuntu | ubuntu.com/security/CVE-2026-31431 |
| RHEL / Amazon Linux | dnf update kernel |
| SUSE | zypper update kernel-default |
| Debian | apt update && apt upgrade |
CONFIG_CRYPTO_AUTHENC 검사가 =m(내장이 아닌 모듈로 빌드)을 보고하면 블랙리스트에 등록할 수 있습니다:
echo 'install algif_aead /bin/false' > /etc/modprobe.d/disable-algif-aead.conf
rmmod algif_aead 2>/dev/null
중요: 이 완화 조치는
CONFIG_CRYPTO_AUTHENC=y(내장)인 경우 효과가 없습니다. 그 경우 커널 패치가 유일한 해결책입니다. 스크립트의 CONFIG_CRYPTO_AUTHENC 검사가 어떤 상황인지 알려줍니다.CONFIG_CRYPTO_AUTHENC이 올바른 커널 구성 키입니다 — 단일 옵션에서authenc와authencesn모듈을 모두 빌드합니다.
IPsec을 사용 중이라면 영향을 받을 수 있습니다 — 전체 배포 전에 확인하세요.
업스트림 수정은 이 커밋입니다 — algif_aead.c의 2017년 인플레이스 AEAD 최적화를 되돌려 소스와 대상 scatterlist를 분리하여 페이지 캐시 페이지가 더 이상 쓰기 가능한 대상에 들어갈 수 없게 합니다.
Docker 컨테이너, Kubernetes 파드 또는 기타 컨테이너 환경 내에서 실행 중이면 스크립트가 경고합니다: 컨테이너는 호스트 커널을 공유합니다. 취약점은 컨테이너 이미지가 아닌 커널에 있습니다. 호스트를 평가하고 패치해야 합니다.
# GitHub Actions
# 스크립트가 1로 종료되면 단계가 자연스럽게 실패하고 파이프라인을 차단합니다.
# 추가 구성 불필요 — 0이 아닌 종료 코드는 기본적으로 단계를 실패시킵니다.
- name: CVE-2026-31431 확인
run: |
python3 cve-2026-31431-detect.py
rc=$?
if [ $rc -eq 1 ]; then
echo "VULNERABLE — 파이프라인 차단"
exit 1
elif [ $rc -ne 0 ]; then
echo "ERROR — 탐지 스크립트 완료 실패 (exit $rc)"
exit $rc
fi
# Ansible
# playbook_dir을 사용하여 스크립트 경로가 올바르게 해석되도록 합니다.
# failed_when은 0이 아닌 모든 종료(취약점 또는 스크립트 오류)를 확인합니다.
- name: CVE-2026-31431 확인
script: "{{ playbook_dir }}/cve-2026-31431-detect.py"
register: cve_check
failed_when: cve_check.rc != 0
# Nagios / 모니터링 검사 (셸 스크립트 — 종료 코드 기본 지원)
bash cve-2026-31431-detect.sh --quiet
# exit 0 = OK, exit 1 = CRITICAL (취약)
# SIEM / 로그 집계용 JSON 출력 (셸 스크립트)
bash cve-2026-31431-detect.sh --json --quiet > /var/log/cve-2026-31431-$(hostname)-$(date +%Y%m%d).json
| 날짜 | 이벤트 |
|---|---|
| 2026-03-23 | Linux 커널 보안 팀에 보고 |
| 2026-03-24 | 접수 확인 |
| 2026-03-25 | 패치 제안 및 검토 |
| 2026-04-01 | 메인라인 커널에 수정 커밋 |
| 2026-04-22 | CVE-2026-31431 지정 |
| 2026-04-29 | 공개 공개 |
Theori의 Taeyang Lee의 원래 연구 통찰력과 전체 공개 문서를 작성한 Xint Code Research Team에게 감사를 표합니다.
오탐을 발견했나요? 놓친 배포판이 있나요? 확인해야 할 커널 구성이 있나요? PR 환영합니다. 목표는 무서운 빨간 텍스트가 아닌 정확한 신호입니다.
이 도구는 방어적 보안 목적으로 있는 그대로 제공됩니다. 평가 권한이 있는 시스템에만 사용하세요. 이상하게 굴지 마세요.