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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
도구/GitHubGitHub/spensercai/copy_fail
Defensive ToolsPrivilege EscalationExploit FrameworksVulnerability AnalysisExploitationSecurity VirtualizationBinary Exploitation
GitHubspensercai/copy_fail

copy_fail

# Rust 익스플로잇 PoC: Linux 커널 LPE CVE-2026-31431 (AF_ALG 페이지 캐시 쓰기) 및 eBPF 런타임 방어 — 재부팅 없이 LSM 또는 kprobe를 통한 AF_ALG 소켓 생성 차단

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

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
웹사이트

Copy Fail — CVE-2026-31431

CVE-2026-31431(Copy Fail)은 Linux 커널의 algif_aead 모듈(AF_ALG 서브시스템)에 존재하는 로컬 권한 상승 취약점입니다. 2017년 8월에 도입된 로직 결함으로 인해, 권한이 없는 로컬 사용자가 AF_ALG + splice()를 통해 읽기 가능한 임의 파일의 페이지 캐시에 4바이트의 제어된 데이터를 쓸 수 있으며, 이후 변조된 setuid 바이너리를 실행하여 root 권한을 획득할 수 있습니다. 이 익스플로잇은 결정적(deterministic)입니다 — 경쟁 조건(race condition)도, 커널 오프셋도, 시스템 크래시도 없습니다. 4.14부터 7.0-rc까지의 커널을 탑재한 모든 주요 Linux 배포판에 영향을 미칩니다.

CVSS: 7.8 | 수정 버전: 커널 7.0, 6.19.12, 6.18.22 | 메인라인 수정: 커밋 a664bf3d603d

출처: copy.fail, The Hacker News, CloudLinux 권고

프로젝트 구조

root@kitploit:~
crates/
├── exp/                            # 익스플로잇 PoC(Rust 재구현)
├── copy_fail_guard/                # 사용자 공간 eBPF 로더 — LSM 모드
├── copy_fail_guard-ebpf/           # eBPF LSM 프로그램(워크스페이스 외)
├── copy_fail_guard_kprobe/         # 사용자 공간 eBPF 로더 — kprobe 모드
└── copy_fail_guard_kprobe-ebpf/    # eBPF kprobe 프로그램(워크스페이스 외)
scripts/
└── build_guard.sh                  # 원클릭 빌드 → dist/로 출력

취약점 개요

근본 원인은 세 가지 독립적인 커널 기능이 안전하지 않게 상호 작용하는 체인입니다:

  1. AF_ALG 소켓 — 권한이 없는 사용자 공간에 커널 암호화 API를 노출
  2. splice() — 파일 데이터를 복사본이 아닌 페이지 캐시 참조로 암호화 scatterlist에 제로카피 전송
  3. authencesn AEAD 템플릿 — 호출자의 출력 버퍼를 스크래치 공간으로 사용하여 dst[assoclen + cryptlen]에 4바이트를 기록

2017년, algif_aead.c(72548b093ee3)의 제자리(in-place) 최적화로 인해 req->src == req->dst가 되어 페이지 캐시 페이지가 쓰기 가능한 대상 scatterlist에 연결되었습니다. authencesn이 스크래치 바이트를 기록할 때 출력 버퍼를 지나 연결된 페이지 캐시 페이지까지 넘어가게 됩니다. 공격자가 제어할 수 있는 것:

  • 파일: 현재 사용자가 읽을 수 있는 임의의 파일
  • 오프셋: splice 오프셋, splice 길이 및 assoclen에 의해 결정
  • 4바이트: sendmsg()에서 설정된 AAD 바이트 4–7(seqno_lo)에서 유래

변조된 페이지는 더티(dirty)로 표시되지 않습니다 — 디스크의 파일은 변경되지 않지만, execve()는 페이지 캐시에서 읽습니다. setuid 바이너리를 변조하면 → root 권한 획득.

crates/exp — 익스플로잇 PoC

공개된 732바이트 Python PoC의 Rust 재구현입니다. /usr/bin/su를 대상으로 하며, 페이지 캐시 페이지를 AF_ALG AEAD 소켓으로 splice하고 압축된 셸 페이로드로 덮어씁니다.

빌드

Rust 1.85+ 필요(edition 2024).

root@kitploit:~
cargo build --release -p copy_fail

바이너리는 Linux 전용입니다. 다른 플랫폼에서는 Unsupported 오류와 함께 종료됩니다.

실행

경고: 이 도구는 실제 커널 결함을 악용합니다. 소유하고 통제할 수 있는 시스템에서만 실행하세요. 가급적 일회용 VM을 권장합니다.

  1. 취약한 커널(커널 < 7.0 / < 6.19.12 / < 6.18.22인 주류 배포판)을 실행하는 VM을 부팅합니다.

  2. 빌드된 바이너리를 VM에 복사하고 비-root 사용자로 실행합니다:

    root@kitploit:~
    ./target/release/copy_fail
    
  3. 취약한 경우: root 셸(#)이 나타납니다. whoami를 실행하여 root를 확인하세요.

  4. 취약하지 않은 경우(패치된 커널): AF_ALG 작업이 실패하거나 su 바이너리가 정상적으로 동작합니다. 오류 메시지나 일반적인 su 비밀번호 프롬프트가 표시됩니다.

방어 도구 — copy_fail_guard

커널 업그레이드나 재부팅 없이 CVE-2026-31431을 차단하는 런타임 커널 방어 도구입니다. eBPF를 사용하여 AF_ALG 소켓 생성을 가로채 익스플로잇의 첫 단계를 차단합니다.

두 가지 모드가 제공됩니다. 원클릭 로더가 사용 가능한 최상의 모드를 자동 선택합니다:

작동 방식

root@kitploit:~
┌──────────────────────────────────────────────────┐
│  run_guard.sh                                    │
│  • BPF LSM 지원 감지                            │
│  • LSM 사용 가능  → copy_fail_guard (EPERM)      │
│  • LSM 사용 불가 → copy_fail_guard_kprobe (KILL) │
└──────────────┬───────────────────────────────────┘
               │
┌──────────────▼───────────────────────────────────┐
│  eBPF 프로그램                                   │
│  if socket family == 38 (AF_ALG)                 │
│     → 차단 (EPERM 또는 SIGKILL)                  │
│  else                                            │
│     → 허용                                       │
└──────────────────────────────────────────────────┘

시스템 영향

AF_ALG 차단은 일반적인 시스템에 거의 영향을 미치지 않습니다:

  • 영향 없음: dm-crypt/LUKS, kTLS, IPsec/XFRM, OpenSSL/GnuTLS/NSS(기본 빌드), SSH, 커널 키링 암호화 — 이러한 기능은 AF_ALG를 통하지 않고 커널 내부 암호화 API를 직접 사용합니다
  • 잠재적 영향: AF_ALG를 사용하도록 명시적으로 구성된 애플리케이션(예: afalg 엔진이 활성화된 OpenSSL, 일부 임베디드 암호화 오프로드 경로)
  • 성능: socket(AF_ALG, ...)을 호출하지 않는 모든 것에 대해 오버헤드가 전혀 없습니다

빌드

원클릭 빌드(권장):

root@kitploit:~
./scripts/build_guard.sh

누락된 툴체인(nightly, bpf-linker)을 자동으로 설치하고 모든 eBPF 프로그램과 사용자 공간 로더를 컴파일하여 dist/에 출력합니다:

root@kitploit:~
dist/
├── copy_fail_guard.bpf.o          # eBPF LSM 프로그램
├── copy_fail_guard_kprobe.bpf.o   # eBPF kprobe 프로그램
├── copy_fail_guard                 # 사용자 공간 로더(LSM)
├── copy_fail_guard_kprobe          # 사용자 공간 로더(kprobe)
└── run_guard.sh                    # 자동 선택: sudo ./run_guard.sh

dist/ 디렉토리를 대상 머신에 복사하고 sudo ./run_guard.sh를 실행하여 보호를 활성화하세요.

수동 빌드(단계별):

1단계: eBPF 프로그램 컴파일(Linux에서 수행해야 함):

root@kitploit:~
# LSM 변형
cd crates/copy_fail_guard-ebpf
cargo +nightly build --target bpfel-unknown-none -Z build-std=core --release

# kprobe 변형
cd crates/copy_fail_guard_kprobe-ebpf
cargo +nightly build --target bpfel-unknown-none -Z build-std=core --release

2단계: 사용자 공간 로더 빌드:

root@kitploit:~
cargo build --release -p copy_fail_guard -p copy_fail_guard_kprobe

실행

권장 — 최상의 모드를 자동 선택:

root@kitploit:~
sudo ./dist/run_guard.sh

수동 — 특정 모드 실행:

root@kitploit:~
# LSM 모드(lsm=bpf 필요)
sudo GUARD_BPF_OBJ=path/to/copy_fail_guard.bpf.o RUST_LOG=info ./copy_fail_guard

# kprobe 모드(모든 환경에서 동작)
sudo GUARD_BPF_OBJ=path/to/copy_fail_guard_kprobe.bpf.o RUST_LOG=info ./copy_fail_guard_kprobe

Ctrl-C를 눌러 eBPF 프로그램을 분리하고 정상 동작을 복원하세요.

방어 검증

한 터미널에서 가드를 실행한 상태에서:

root@kitploit:~
# 다른 터미널에서 익스플로잇 시도:
./target/release/copy_fail
# LSM 모드:   "error: Operation not permitted"
# kprobe 모드: "已杀死" / "Killed"

# 또는 Python으로 직접 테스트:
python3 -c "import socket; socket.socket(38, 5, 0)"
# LSM 모드:   PermissionError: [Errno 1] Operation not permitted
# kprobe 모드: Killed

현재 제한 사항

  • 화이트리스트 지원 없음 — 현재 버전은 모든 사용자 공간 AF_ALG 소켓 생성을 무조건 차단합니다. PID, cgroup 또는 명령 이름으로 특정 프로세스를 예외 처리하는 메커니즘이 없습니다. 이는 향후 버전(eBPF HashMap 맵을 통한)에서 계획되어 있습니다. 대부분의 시스템에서 AF_ALG를 사용하는 경우가 거의 없으므로 문제가 되지 않습니다.
  • eBPF 크레이트는 bpf-linker와 함께 Linux에서 별도로 컴파일해야 합니다(bpfel-unknown-none을 대상으로 하므로 일반 워크스페이스 멤버가 될 수 없습니다).
  • 보호는 로더 프로세스가 실행되는 동안에만 활성화됩니다. 지속적인 보호를 위해서는 systemd 서비스로 실행하세요.

BPF LSM 활성화(선택 사항, LSM 모드용)

대부분의 배포판은 BPF LSM을 기본적으로 활성화하지 않습니다. 더 깔끔한 LSM 모드(EPERM 대신 SIGKILL)를 원한다면:

root@kitploit:~
# 현재 LSM 확인:
cat /sys/kernel/security/lsm

# "bpf"가 없으면 추가:
sudo sed -i 's/^GRUB_CMDLINE_LINUX="\(.*\)"/GRUB_CMDLINE_LINUX="\1 lsm=lockdown,capability,yama,apparmor,bpf"/' /etc/default/grub
sudo update-grub && sudo reboot

kprobe 모드는 이 단계 없이도 동작합니다.

커널 수정 확인

커널을 ≥ 7.0 / ≥ 6.19.12 / ≥ 6.18.22로 패치한 후:

root@kitploit:~
# 커널 버전 확인
uname -r

# 익스플로잇 재실행 — 더 이상 root 셸이 생성되지 않아야 함
./target/release/copy_fail

또는 취약한 모듈이 무력화되었는지 확인:

root@kitploit:~
modinfo algif_aead | grep filename

# 내장(built-in)된 경우 initcall 블랙리스트 등록(재부팅 필요)
sudo grubby --update-kernel=ALL --args="initcall_blacklist=algif_aead_init"
sudo reboot
도구 다운로드
LSM 모드kprobe 모드
차단 방식-EPERM 반환(소켓 생성 거부)SIGKILL(프로세스 종료)
커널 요구 사항≥ 5.7 + lsm=bpf 부팅 파라미터≥ 5.3, 특별한 파라미터 불필요
활성화를 위한 재부팅필요할 수 있음(lsm=bpf 미설정 시)불필요
후킹 지점socket_create LSM 훅__sys_socket kprobe