
Stirling-PDF v3.2.0 - حرج - عن بُعد - بقايا RUNSCRIPT في H2 - CREATE OR REPLACE ALIAS import-database
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · stirling-h2-import-leftover
Stirling-PDF 3.2.0 - Stirling Tools
الفئة: بقايا H2 RUNSCRIPT من GHSA-mrr8. الوصول: ROLE_ADMIN عن بُعد.
POST /api/v1/database/import-database محمي بـ @PreAuthorize("hasRole('ADMIN')"). يُفترض أن يمنع validateSqlContent استخدام CREATE ALIAS. قائمة الحظر هي CREATE\s+(FORCE\s+)?ALIAS. تسمح دالة parseCreate في H2 بوجود OR REPLACE قبل ALIAS، لذا فإن CREATE OR REPLACE ALIAS … FOR "java.lang.…" يطابق قائمة السماح \bCREATE\b ويفوت قائمة الحظر. يقوم المدقّق بتعقيم نسخة. بينما تقوم verifyBackup وRUNSCRIPT FROM ? في بيئة الإنتاج بتشغيل الملف الأصلي.
GHSA-mrr8-934j-4g8m / CVE-2026-85714 أغلق سلاسل FILE_READ / CREATE ALIAS / CSVWRITE الأصلية. هذه البقايا هي ثغرة OR REPLACE في نفس المدقّق.
استيراد بصلاحية ROLE_ADMIN ينشئ alias في Java يُفترض أن تمنعه قائمة الحظر. وتنزيل نسخة احتياطية لاحق يحتوي على SQL الخاص بالمهاجم. يُستنتج تنفيذ الأوامر عن بُعد (RCE) عبر FILE_READ / FileUtils على المضيف من الاستشارة الأصلية، ولم يُثبت مختبريًا في هذه الحزمة.
| المعرّف | لا يوجد CVE بعد |
| CWE | CWE-94 / CWE-184 |
| CVSS | 9.1 CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H |
| المنتج | Stirling-PDF |
| المتأثر | v3.2.0 (a7e593728dd9aa81e75318a949789d3c2e9ee754)، الصورة stirlingtools/stirling-pdf:3.2.0-fat |
| المصادقة | ROLE_ADMIN، H2 المدمج الافتراضي. أول مسؤول افتراضي admin / stirling حتى يتم تغييره |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1:18152 فقط |
بقايا من سلسلة بقايا Stirling-PDF v3.2.0. الشقيق: stirling-storage-folder-idor (جذر تخزين ضمني لمجلد المعالجة). هذه الحزمة هي بقايا استيراد H2.
ROLE_ADMIN عند تسجيل الدخول على إصدار proprietary/fat مع H2 المدمج الافتراضي. أول مسؤول افتراضي هو admin / stirling عندما يكون initialLogin فارغًا. لا يحتاجون إلى وصول غير مُصادَق. صورة Lite ومصادر بيانات PostgreSQL لا تتضمن هذا المتحكم.
جدول الصلاحيات (شامل). نفس المعيار المتبع في Signal-Server Dropwizard admin: الطريقة + المسار، وما يمنحه ذلك الاستدعاء، والاستطلاع مقابل السلامة مقابل التوافر، والمُثبت مختبريًا مقابل المُستنتج، والسطح المجاور الذي يبقى مغلقًا.
| المحور | الطريقة + المسار | الصلاحيات الممنوحة | المصدر |
|---|---|---|---|
| السلامة | ROLE_ADMIN POST /api/v1/database/import-database مع CREATE OR REPLACE ALIAS lab_nano FOR "java.lang.System.nanoTime" بالإضافة إلى INSERT INTO lab_w VALUES('STIRLING-H2-IMPORT-WITNESS') | 200 importIntoDatabaseSuccessed. تم إنشاء Java alias. تم تنفيذ SQL المهاجم تحت RUNSCRIPT | مُثبت مختبريًا |
| الاستطلاع | ROLE_ADMIN GET /api/v1/database/createDatabaseBackup ثم GET /api/v1/database/download/backup_202610172328.sql | نسخة احتياطية بحجم 50432 بايت تحتوي على STIRLING-H2-IMPORT-WITNESS | مُثبت مختبريًا |
| الاستطلاع / ملف المضيف | نفس الاستيراد مع تغليف FILE_READ('/etc/os-release') داخل EXECUTE IMMEDIATE | 500 Backup verification failed. بايتات المضيف غير موجودة في النسخة الاحتياطية | فشل إضافي مختبري |
| السلامة / RCE | alias org.h2.store.fs.FileUtils بالإضافة إلى CSVWRITE لملف .pth في user-site الخاص بـ Python، ثم تحويل office | تنفيذ أوامر بحساب الخدمة | مستنتج من GHSA-mrr8. لم يُختبر هنا |
| التوافر | لا شيء مُدّعى | يمكن للاستيراد استبدال جداول التطبيق | مستنتج. ليس أداة التحقق المختبرية |
يبقى مغلقًا على هذا الإصدار المثبّت
| المحور | الطريقة + المسار | سبب الإغلاق |
|---|---|---|
| السلامة | POST /api/v1/database/import-database بدون مصادقة | 401 Authentication required. أمان الطريقة ADMIN يبقى مفعّلًا عندما يكون HTTP بـ permitAll |
| السلامة | استيراد ROLE_ADMIN لـ CREATE ALIAS المجرّد | 500 SQL script contains disallowed operations and was rejected |
| السلامة | صورة lite / DISABLE_ADDITIONAL_FEATURES | DatabaseController غائب |
| السلامة | مصدر بيانات PostgreSQL مخصص | @Conditional(H2SQLCondition.class) |
لا أدّعي الحصول على reverse shell، ولا أدّعي أن FILE_READ على المضيف مُثبت مختبريًا. ما تبقّى هو إغفال قائمة الحظر الذي يسمح بمرور CREATE OR REPLACE ALIAS … FOR "java.lang.…" عبر RUNSCRIPT.
لا يزال v3.2.0 يشحن مدقّق GHSA-mrr8. بقيت على ذلك الوسم وقرأت DENIED_PATTERNS. سطر الـ alias هو CREATE\s+(FORCE\s+)?ALIAS. يقبل محلّل H2 صيغة CREATE OR REPLACE ALIAS. تغطي الاختبارات السلاسل الواضحة CREATE ALIAS / FILE_READ(. لكنها لا تغطي OR REPLACE.
يسجّل المختبر الدخول كمسؤول افتراضي، ويكمل change-password-on-login، ثم يستورد CREATE ALIAS محظورًا (500)، ثم يستورد CREATE OR REPLACE ALIAS بالإضافة إلى شاهد INSERT (200). يحتوي تنزيل نسخة احتياطية على الشاهد.
مسارات خاطئة: اعتبار الاستيراد بدون مصادقة ضمن النطاق (401)؛ اعتبار EXECUTE IMMEDIATE + FILE_READ هو ما تبقّى (verifyBackup 500)؛ اعتبار CREATE ALIAS الأصلي غير المُموّه لا يزال فعّالًا (إنه محظور).
python3 stirling-h2-import-leftover-Abraxas-Labs.py
أو
cd lab
./run.sh
استهدف فقط http://127.0.0.1:18152. الصورة stirlingtools/stirling-pdf:3.2.0-fat. يتطلب Docker. تسجيل الدخول مفعّل. يقوم المشغّل chdir إلى lab/ وينفّذ run.sh.
IOC unauth-import http=401
IOC negative-import http=500 ... disallowed operations ...
IOC leftover-import bypass=create-or-replace-alias http=200 ... importIntoDatabaseSuccessed
IOC download file=backup_202610172328.sql http=200 bytes=50432 witness=1
SUCCESS stirling-h2-import-leftover negative-denied=yes bypass=create-or-replace-alias backup-has-witness=yes file=backup_202610172328.sql unauth-import=401 STIRLING-H2-IMPORT-WITNESS
وسّع قائمة الحظر (denylist) بحيث لا يمكن أن يقع OR REPLACE بين CREATE وALIAS. شغّل validateSqlContent على نفس البايتات التي سينفّذها RUNSCRIPT. امنع EXECUTE IMMEDIATE ما لم يتم فحص SQL الداخلي أيضًا.
Pattern.compile("(?i)\\bCREATE\\s+(OR\\s+REPLACE\\s+)?(FORCE\\s+)?ALIAS\\b")
أعد تشغيل عميل الاسترجاع مقابل نسخة مُرقّعة: يجب أن يُرجع الاستيراد المتبقي 400/500 بالطريقة نفسها التي يفعلها CREATE ALIAS المجرد بالفعل.
حتى ذلك الحين، لا تعتبر أن "حظرت CREATE ALIAS" يعني "حظرت أسماء H2 Java المستعارة."