
# CVE-2026-31431 로컬 권한 상승 익스플로잇 Linux 커널 AF_ALG + splice 페이지 캐시 덮어쓰기 취약점에 대한 로컬 권한 상승 익스플로잇입니다. PoC, BPFtrace 탐지 스크립트, 그리고 승인된 보안 연구를 위한 QEMU 테스트 환경을 포함합니다.
AF_ALG + splice 페이지 캐시 덮어쓰기를 통한 Linux 커널 로컬 권한 상승
승인된 보안 연구, 침투 테스트 및 교육 목적으로만 사용하십시오. 소유하지 않았거나 명시적인 서면 허가를 받지 않은 시스템에는 사용하지 마십시오.
CVE-2026-31431은 Linux 커널의 로컬 권한 상승(LPE) 취약점입니다. 권한이 없는 로컬 사용자가 AF_ALG 소켓 인터페이스와 splice()를 결합하여 setuid 바이너리에 속한 페이지 캐시 페이지에 직접 인증된 쓰기를 수행함으로써 루트 액세스 권한을 얻을 수 있습니다.
이 익스플로잇은 디스크의 inode를 수정하지 않고 페이지 캐시의 su 바이너리를 덮어써서 파일 메타데이터나 블록 수준 체크섬에만 의존하는 무결성 메커니즘을 우회합니다.
.
├── exploit.py # PoC — 페이지 캐시 덮어쓰기 및 권한 상승
├── detect.bt # 실시간 탐지를 위한 BPFtrace 스크립트
├── run-vm.sh # QEMU 테스트 환경 자동화 (선택 사항)
├── PAYLOAD.md # 페이로드 인코딩 분석 (hex → zlib → ELF → shellcode)
└── LICENSE
취약한 시스템에서 exploit.py를 권한이 없는 로컬 사용자로 실행하십시오 — sudo는 필요 없습니다:
python3 exploit.py
이 스크립트는 다음 단계를 수행합니다:
AF_ALG(algif_aead)에 대한 커널 지원을 확인하고 su 바이너리를 찾습니다.su 바이너리를 원시 파일 디스크립터로 열고 AF_ALG + sendfile을 통해 페이지 캐시 페이지를 덮어씁니다.지원 아키텍처:
detect.bt로 익스플로잇 시도를 실시간으로 모니터링하십시오. 루트 권한이 필요합니다:
sudo bpftrace detect.bt
# 또는
doas bpftrace detect.bt
이 스크립트는 @suspect[pid]의 비트마스크를 사용하여 PID당 세 가지 지표를 추적합니다:
동일한 PID에서 세 비트가 모두 설정되면(@suspect[pid] == 0x7) 경고가 발생합니다.
exploit.pyAF_ALG/algif_aead 모듈이 로드된 Linux 커널detect.btbpftrace ≥ 0.12# Ubuntu/Debian
sudo apt install bpftrace
# RHEL/CentOS/Fedora
sudo dnf install bpftrace
# Amazon Linux
sudo yum install bpftrace
# SUSE
sudo zypper install bpftrace
# Alpine
sudo apk add bpftrace
메인라인 커밋 a664bf3d603d을 포함하는 배포판 커널 패키지로 업데이트하십시오. 이 커밋은 2017년 algif_aead 인플레이스 최적화를 되돌려 페이지 캐시 페이지가 더 이상 쓰기 가능한 대상 scatterlist에 포함될 수 없도록 합니다. 대부분의 주요 배포판에서 현재 이 수정 사항을 제공하고 있습니다.
algif_aead 비활성화 (패치를 기다리는 동안)blacklist는 명시적인 modprobe algif_aead로 우회할 수 있습니다. install .../bin/false 지시문은 설치 명령을 완전히 재정의하여 모든 로드 시도를 실패하게 만듭니다:
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif.conf
sudo rmmod algif_aead 2>/dev/null || true
"아니요" 행의 서브시스템은 커널 내부 암호화 API를 직접 사용합니다 — AF_ALG를 거치지 않습니다. 성능은 일반 사용자 공간 암호화 라이브러리로 대체되며, 이는 다른 거의 모든 것이 이미 사용하는 방식입니다.
비활성화하기 전에 시스템에서 AF_ALG를 적극적으로 사용하는 항목이 있는지 확인하려면:
lsof | grep AF_ALG
ss -xa | grep alg
패치 상태와 관계없이 신뢰할 수 없는 워크로드에 대해 socket(AF_ALG, ...) 생성을 거부하십시오. seccomp 거부 목록에 AF_ALG(패밀리 38)를 추가하거나, 권한 없는 프로세스의 socket 호출을 제한하는 AppArmor/SELinux 정책을 사용하십시오.
detect.bt로 모니터링즉시 패치하거나 잠글 수 없는 모든 호스트에 포함된 탐지 스크립트를 배포하십시오. 전체 3단계 익스플로잇 프리미티브를 실행하는 모든 프로세스에 대해 경고합니다.
run-vm.sh는 통제된 환경에서 테스트하기 위한 Ubuntu 24.04 QEMU VM 생성을 자동화합니다. exploit.py와 detect.bt는 취약한 호스트에서 직접 실행됩니다 — QEMU는 필요하지 않습니다.
| 종속성 | 참고 사항 |
|---|---|
qemu-system-x86_64 + KVM | 아래 설치 명령 참조 |
wget 또는 curl | 클라우드 이미지 다운로드 |
cloud-image-utils | 시드 이미지 생성 (비 Debian 호스트에서는 Docker로 대체 가능) |
# Ubuntu/Debian
sudo apt install qemu-system-x86 cloud-image-utils wget
# Fedora/RHEL
sudo dnf install qemu-system-x86 wget
# Arch
sudo pacman -Sy qemu
# Alpine
sudo apk add qemu-system-x86 qemu-ui-gtk wget
sh run-vm.sh
1. VM 시작/생성
2. SSH로 연결
3. VM에 파일 업로드 (exploit.py, detect.bt)
4. VM 내부에서 익스플로잇 실행
5. VM 내부에서 detect.bt 실행
6. VM 상태 확인
7. VM 중지
8. VM 파일 정리
0. 종료
| 필드 | 값 |
|---|---|
| 사용자 | ubuntu |
| 비밀번호 | cve123 |
| SSH 포트 | 2222 |
crypto/af_alg.c — 커널 소스mm/splice.c — 커널 소스이 프로젝트는 GNU General Public License v3.0 이상에 따라 라이선스가 부여됩니다. 전체 텍스트는 LICENSE를 참조하십시오.
면책 조항: 이 저장소는 승인된 보안 연구, 침투 테스트 및 교육 목적으로만 제공됩니다. 저자는 이 소프트웨어의 오용이나 손상에 대해 어떠한 책임도 지지 않습니다.
| 필드 | 값 |
|---|
| CVE ID | CVE-2026-31431 |
| 유형 | 로컬 권한 상승 (LPE) |
| CVSS v3.1 점수 | 7.8 High — AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H (출처: kernel.org) |
| 커널 서브시스템 | crypto/af_alg.c, mm/splice.c |
| 공격 벡터 | 로컬 — 권한이 없는 사용자 계정 필요 |
| 근본 원인 | algif_aead가 splice()가 전송을 완료하기 전에 매핑된 페이지 캐시 페이지에 대해 copy-on-write 의미를 강제하지 않고 AEAD 소켓을 통해 sendfile()을 허용함 |
| 배포판 | 커널 버전 | 아키텍처 |
|---|
| Ubuntu 24.04 LTS | 6.17.0-1007-aws | x86_64 |
| Amazon Linux 2023 | 6.18.8-9.213.amzn2023 | x86_64 |
| RHEL 10.1 | 6.12.0-124.45.1.el10_1 | x86_64 |
| SUSE 16 | 6.12.0-160000.9-default | x86_64 |
| Raspberry Pi OS (Pi 5) | 6.12.75+rpt-rpi-2712 | aarch64 |
| 아키텍처 | 변형 |
|---|
| x86_64 | — |
| aarch64 | — |
| riscv64 | — |
| ppc64le | — |
| arm | armv5l, armv6l, armv7l |
| x86 32-bit | i386, i486, i586, i686 |
| MIPS 64-bit | mips64, mips64el |
| LoongArch | loong64, loongarch64 |
| s390x | — |
| 비트 | 시스템 콜 | 지표 |
|---|
0x1 | socket(AF_ALG, SOCK_SEQPACKET) | AF_ALG 소켓 생성 |
0x2 | setsockopt(SOL_ALG, ...) | 암호화 작업 구성 |
0x4 | sendmsg(MSG_MORE) + splice() | 페이지 캐시 덮어쓰기 시도 |
| 영향? | 서브시스템/사용 사례 |
|---|
| 아니요 | dm-crypt/LUKS, kTLS, IPsec/XFRM, 커널 내부 TLS |
| 아니요 | OpenSSL, GnuTLS, NSS 기본 빌드 |
| 아니요 | SSH, 커널 키링 암호화 |
| 아마도 | afalg 엔진이 명시적으로 활성화된 OpenSSL |
| 아마도 | 임베디드 암호화 오프로드 경로 또는 aead/skcipher/hash 소켓을 직접 바인딩하는 앱 |