
Linux 커널 로컬 권한 상승(CVE-2026-31431)을 위한 익스플로잇 및 탐지 도구로, 페이지 캐시를 손상시켜 루트 권한을 획득하며 완화 지침을 포함합니다.
리눅스 커널의 9년 된 치명적 취약점, 몇 초 만에 root 권한 획득 가능
| 속성 | 세부 정보 |
|---|---|
| CVE | CVE-2026-31431 |
| 별칭 | Copy Fail |
| 유형 | 로컬 권한 상승 (LPE) |
| CVSS | 7.8 (High) |
| 발견자 | Theori (Xint Code) |
| 공개일 | 2026년 4월 29일 |
| 구성 요소 | 리눅스 커널 algif_aead 서브시스템 |
2017년에 도입된 "제자리(in-place) 연산" 최적화(커밋 72548b093ee3)의 결함. 로컬 사용자가 커널 페이지 캐시에 4바이트 제어된 쓰기를 직접 수행할 수 있게 함.
AF_ALG 인터페이스를 사용하여 커널 암호화 알고리즘에 접근/usr/bin/su) 또는 민감한 파일(/etc/passwd)의 메모리 내 버전을 손상시킴메모리 오버플로우가 아닌 설계상의 논리 버그이기 때문. 탐지하려면 암호화 서브시스템에 대한 심층 분석이 필요했음.
# Ubuntu/Debian
sudo apt update
sudo apt upgrade
sudo reboot
# RHEL/AlmaLinux/Rocky
sudo dnf update kernel
sudo reboot
# 커널 버전 확인
uname -r
⚠️ 재부팅은 필수입니다. 새 커널을 활성화하려면 필요합니다.
# 취약 모듈 로드 비활성화
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/copyfail_mitigation.conf
# 이미 사용 중이면 모듈 언로드
sudo rmmod algif_aead
# 모듈이 보통 커널에 내장되어 있음
# 부팅 파라미터를 추가하여 비활성화
sudo grubby --update-kernel=ALL --args="initcall_blacklist=algif_aead_init"
# 변경 사항 적용을 위해 재부팅
sudo reboot
# 페이지 캐시 핫 플러시
sudo sysctl -w vm.drop_caches=3
⚠️ 참고: 이는 패치를 대체하지 않습니다. 보조 조치일 뿐입니다.
| 날짜 | 이벤트 |
|---|---|
| 4월 29일 | Theori의 공개 공개 |
| 5월 1일 | 최초의 활성 익스플로잇 시도 탐지 |
| 5월 2일 | CISA, 미국 연방 기관에 5월 15일까지 패치 명령 |
# 커널 버전 확인
uname -r
# 다음 경우 취약:
# - v4.14 ~ v7.0-rc (2017년 ~ 2026년 4월 사이 출시)
# - 커밋 72548b093ee3 포함
# algif_aead 모듈 로드 여부 확인
lsmod | grep algif_aead
# 목록에 나타나면 시스템이 취약함
개발자들이 9년간 놓친 이 결함을 AI가 식별했습니다. 이는 전환점을 의미합니다:
# 1. 탐지
python3 prueba.py
# exit 0 = 취약하지 않음, 2 = 취약함, 1 = 테스트 오류
# 2. 익스플로잇 (대화형 — su가 사용자 암호를 요청함)
python3 exploit.py --shell
python3 prueba.py
기능:
AF_ALG와 authencesn(hmac(sha256),cbc(aes)) 알고리즘이 권한 없는 프로세스에서 접근 가능한지 확인.
임시 디렉토리에 4KiB 센티널 파일을 생성하고 페이지 캐시를 채움.
sendmsg+cmsg를 통해 8바이트 AAD를 인라인으로 전송하고 seqno_lo를 PWND 마커로 설정한 다음, os.splice()를 사용하여 센티널 페이지 캐시 페이지에서 AF_ALG 연산 소켓으로 32바이트를 복사.
recv()를 호출하여 복호화를 시작. 인증 검사는 EBADMSG로 실패하지만 임시 쓰기는 계속 실행됨.
파일(디스크가 아닌 페이지 캐시)을 다시 읽고 마커를 찾음.
출력 클래스:
전제 조건 충족 안 됨: AF_ALG 또는 authencesn을 사용할 수 없음. 종료 코드 0.CVE-2026-31431에 취약: PWND 마커가 수정된 페이지에 삽입됨.종료 코드 2.
페이지 캐시가 제자리 AEAD 삽입 경로를 통해 수정됨: 페이지에 쓰기가 발생했지만
마커가 예상 위치에 삽입되지 않음.
취약한 것으로 간주. 종료 코드 2.페이지 캐시 손상 없음: 패치됨. 종료 코드 0.탐지기는 /usr/bin/su, /etc/passwd 또는 생성한 임시 디렉토리 외부의 다른 파일을 절대 수정하지 않으며, 해당 파일은 종료 시 삭제됩니다.
python3 exploit_cve_2026_31431.py # 패치만 적용, 다음 단계 출력
python3 exploit_cve_2026_31431.py --shell # 패치 적용 후 `su <사용자>` 실행
기능:
/etc/passwd에서 실행 중인 사용자의 UID 라인을 찾고 4자리 UID 필드의바이트 오프셋을 확인.
해당 오프셋에 write4를 실행하여 UID를 0000으로 교체.
pwd.getpwnam(사용자)를 호출하여 libc가 이제 UID 0을 보고하는지 확인.
--shell 사용 시 execvp("su", ["su", 사용자])를 실행. 자신의 암호를 입력.
PAM은 /etc/shadow(수정되지 않음)를 기준으로 검증한 후
setuid(getpwnam(user).pw_uid)가 0으로 설정됨.
다중 쓰기가 필요하므로 write4를 적절히 확장해야 함.
NSS 캐시 데몬(nscd, sssd, systemd-userdbd)이 /etc/passwd 읽기를
가리고 있지 않아야 함. 패치 적용 후에도 getpwnam이 실제 UID를 반환하면
캐시를 재시작하거나 무시하거나 다른 사용자를 선택.
/etc/passwd 페이지는 패치 적용과 su 실행 사이에 캐시에 남아 있어야 함.
실제로는 일반적인 메모리 압력이 있는 모든 시스템에서 안정적으로 동작.
디스크의 /etc/passwd 파일은 변경되지 않은 상태로 유지됨.
드라이 런(--shell 없는 exploit_cve_2026_31431.py)은 종료 시 POSIX_FADV_DONTNEED를 통해
손상된 페이지를 자동으로 제거하므로 UID → 이름 조회가
즉시 정상으로 돌아옴.
--shell 사용 후에는 페이지가 제거될 때까지 손상된 상태로 유지됨.
손상된 동안 UID 1000 → 이름을 확인하는 모든 작업(예: ls,
파일 관리자, scp/sftp 소유권 확인)이 실패하거나 숫자 식별자를 표시함. 제거하려면:
# 권한 없이: /etc/passwd의 페이지 캐시 제거 요청:
python3 -c "import os; fd=os.open('/etc/passwd', os.O_RDONLY); \
os.posix_fadvise(fd, 0, 0, os.POSIX_FADV_DONTNEED); os.close(fd)"
# root 콘솔에서:
echo 3 > /proc/sys/vm/drop_caches
재부팅해도 제거됩니다.
write4 작동 방식sendmsg([8바이트 AAD], cmsg=[ALG_SET_OP=DECRYPT, ALG_SET_IV, ALG_SET_AEAD_ASSOCLEN=8],
flags=MSG_MORE)
splice(target_fd, pipe_w, 32, offset_src=file_offset)
splice(pipe_r, op_fd, 32)
recv(op_fd) # EBADMSG; 임시 쓰기는 이미 수행됨
AAD의 4~7번째 위치의 4바이트(seqno_lo)는 authencesn에 의해
대상 scatterlist에 기록되며, 이 코드 경로에서
대상은 target_fd에서 추출한 페이지 캐시 페이지입니다. 페이지 내 착지 오프셋은
splice()에 전달한 offset_src에 해당합니다.
패치된 커널이 배포판에 도착할 때까지:
sudo tee /etc/modprobe.d/disable-algif-aead.conf <<<'install algif_aead /bin/false'
sudo rmmod algif_aead 2>/dev/null
패치 적용 후 test_cve_2026_31431.py는 "전제 조건 충족 안 됨" 메시지를 표시하고
종료 코드 0으로 종료해야 합니다.
원래 수정은 제자리 AEAD 연산을 제자리가 아닌 연산으로 되돌려 페이지 캐시 페이지가 수정 가능한 scatterlist에 포함되지 않도록 합니다.
algif_aead를 비활성화하는 임시 완화 조치 적용algif_aead 모듈 로드 시도 탐색최종 업데이트: 2026년 5월 3일
상태: 🔴 CRITICAL - 즉각적인 조치 필요
| 5월 3일 | Ubuntu, RHEL, AlmaLinux, Debian에서 패치 제공 |
| 배포판 | 상태 | 참조 |
|---|
| Ubuntu | ✅ 패치됨 | USN-8226-1 (20.04, 22.04, 24.04) |
| RHEL/AlmaLinux/Rocky | ✅ 제공됨 | 5월 1일부터 |
| Debian | ✅ 보안 저장소에 있음 | 업데이트 가능 |
| Android | ⏳ 곧 제공 예정 | 2026년 6월 보안 게시판 |