
Signal-Server v20261007.0.0 - عالي - عن بُعد - صلاحيات متبقية - وصول غير مُصادق إلى Dropwizard admin :8081
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · signal-server-dropwizard-admin
التقرير: https://abraxaslabs.tech/research/signal-server-dropwizard-admin
الفئة: صلاحية متبقية الوصول: عن بُعد
Signal-Server v20261007.0.0 (a15d5cd) - Signal Messenger, LLC
يُصدر DefaultServerFactory في Dropwizard 5.0.2 موصّل إدارة HTTP على المنفذ 8081 مع ترك bindHost غير مضبوط (جميع الواجهات) ودون مصادقة إدارية. لا يتجاوز Signal-Server ذلك أبدًا. لا يحتوي service/config/sample.yml على كتلة server:. ملف YAML يسرد فقط applicationConnectors الخاصة بـ TLS لا يزال يرث المنفذ 8081 بنص صريح على 0.0.0.0. يبدأ server مع العاملين الثلاثة ServerCommand تشغيله. ExternalRequestFilter موجود على سياق التطبيق فقط.
HTTP غير مُصادَق إلى :8081 هو مستوى الإدارة التشغيلي. ليس RCE. ليس استيلاءً على الحساب. ليس قراءةً للرسائل المختومة.
| المعرّف | لا يوجد CVE بعد |
| الفئة | صلاحية متبقية (إدارة Dropwizard غير مُصادَقة) |
| الوصول | عن بُعد (:8081 على جميع الواجهات، دون مصادقة) |
| CWE | CWE-306، CWE-1188 |
| CVSS | عالٍ: 7.3 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:L |
| المنتج | Signal-Server |
| المتأثر | v20261007.0.0 (a15d5cd) Dropwizard 5.0.2. العيّنة داخل الشجرة / adminConnectors المحذوفة. |
| المصادقة | لا شيء على موصّل الإدارة |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط |
أي شخص يستطيع فتح TCP إلى منفذ الإدارة (الافتراضي 0.0.0.0:8081، دون إعداد إضافي، ودون ترويسة Authorization) يحصل على كل servlet إدارة Dropwizard 5 القياسي بالإضافة إلى مهمة Signal الإضافية. هذه هي مجموعة الصلاحيات الكاملة. لا شيء في هذه القائمة يمثل RCE أو ATO أو قراءةً لنصوص الرسائل المختومة.
| الطريقة | المسار | الصلاحية |
|---|---|---|
| GET | /ping | تأكيد أن مستمع الإدارة يعمل. النص هو pong. |
| GET | /metrics | قراءة سجل Codahale الكامل بصيغة JSON: ذاكرة JVM المُخصَّصة وغير المُخصَّصة، عدد مرات GC، عدد الخيوط، عدّادات موصّل Jetty، مقاييس 4xx/5xx، المؤقتات. استخدم هذا لبصم العملية وتقدير الحمل ومراقبة تأثير المهام اللاحقة. |
| GET | /threads | تفريغ كامل لخيوط JVM: كل اسم خيط ومعرّفه وحالته وإطارات المكدس. في المختبر أظهر هذا dw-admin-* بالإضافة إلى إطارات nio في java.base. على عقدة Signal حية قد يتضمن التفريغ نفسه أسماء الفئات وأسماء المسجّلات وأي سلسلة تصادف وجودها على المكدس (مسارات الملفات، أسماء المضيفين، toString للوسائط قيد التنفيذ). إنه ليس تفريغًا للذاكرة وليس تفريغًا لقائمة انتظار الرسائل. |
| GET | /healthcheck | تشغيل فحوصات الصحة المسجّلة. لا تسجّل هذه الشجرة أي إضافات أبدًا، لذا يكون النص هو فحص الجمود الافتراضي (deadlocks.healthy). تخبرك استجابة 200 مقابل 500 بما إذا كانت JVM تعتقد أنها في حالة جمود. |
| GET | /tasks | سرد مهام الإدارة. على هذا الإصدار المثبّت: gc، log-level، set-request-logging-enabled. |
| الطريقة | المسار | الصلاحية |
|---|---|---|
| POST | /tasks/log-level?logger=<name>&level=<LEVEL> | تعيين أي مسجّل Logback إلى TRACE أو DEBUG أو INFO أو WARN أو ERROR أو OFF. يمكن لـ TRACE أن يجعل مسجّلات التطبيق تطبع المزيد (بما في ذلك القيم التي سجّلها المطوّر). تعيين OFF على مسجّل أمني أو مسجّل وصول يجعله معتمًا. المهاجم لا يتلقى تدفق السجلات عبر هذا HTTP. بل يغيّر ما تكتبه العملية إلى القرص أو stdout. أداة التحقق المخبرية: اسم المسجّل SIGNAL-SERVER-DROPWIZARD-ADMIN-WITNESS إلى TRACE. |
| POST | /tasks/gc | استدعاء System.gc(). الاستجابة هي Running GC... / Done!. هذا إيماءة إيقاف-العالم (stop-the-world)، وليس موتًا للعملية. |
| POST | /tasks/set-request-logging-enabled?enabled=true | مهمة إشارة فقط مسجّلة في WhisperServerService.run. تُفعّل مرشّح سجل الوصول للطلبات (RequestLogManager). بعد ذلك، يمكن لـ HTTP إلى موصّل التطبيق كتابة الطريقة وURI والترويسات (بما في ذلك Authorization Basic) إلى سجل الوصول على القرص. عميل الإدارة لا يستعيد تلك الأسطر. على message-persister-service / APN / عمّال المهام الخاملة، لا يمتلك منفذ التطبيق أي موارد Signal Jersey، لذا تهم هذه المهمة على server. تعيين enabled=false يوقفها مرة أخرى. |
ProcessBuilder، ولا Runtime.exec.GET /heapdump يعيد 404.sample.yml أو في عناوين الربط.وصل حاوية شقيقة على نفس شبكة Docker إلى http://vuln:8081/ping (200 pong) ولم تستطع الوصول إلى http://patched:8081/ping عندما كان bindHost هو 127.0.0.1. هذا هو النصف البعيد (Remote).
ثبّتُّ signalapp/Signal-Server v20261007.0.0. ثمانية عشر بحثًا في المصدر. عادت عمليات البحث في الدردشة والمفاتيح والرسائل والنسخ الاحتياطية والتبرعات والاتصال وMFA وحافلة gRPC وHTTP الصادر فارغة عند Critical/High. أما بحث العمّال/الإدارة فلم يعد فارغًا. لا يزال HttpConnectorFactory.admin() في Dropwizard 5.0.2 يستخدم المنفذ 8081 ومضيف ربط فارغًا (null). لا يقوم Signal أبدًا بتعيين adminConnectors. المسؤول الافتراضي في Caddy هو localhost. هذا ليس كذلك.
منعطف خاطئ: محاولة إقلاع Signal-Server الكامل. يمر sample.yml عبر check ولا يزال يحتاج إلى FoundationDB وDynamo وRedis وحزمة أسرار إلى run. المخلف هو موصّل الإطار الذي يبدأه ServerCommand قبل أي من ذلك. المختبر هو Dropwizard 5.0.2 مع نفس YAML الفارغ server: واسم المهمة الإضافي الخاص بـ Signal.
cd lab
./run.sh
Loopback 127.0.0.1:19010. مشروع Compose signal-server-dropwizard-admin. الشاهد SIGNAL-SERVER-DROPWIZARD-ADMIN-WITNESS. ملف YAML الخاص بالـ gadget لا يحتوي على كتلة server:. ملف YAML السلبي يضبط bindHost: 127.0.0.1. السطر الأخير:
SUCCESS signal-server-dropwizard-admin how=unauth-admin-8081 ping=200 metrics=200 threads=200 healthcheck=200 tasks=200 log-level=TRACE gc=200 set-log=enabled bind=* remote-vuln=200 remote-patched=fail SIGNAL-SERVER-DROPWIZARD-ADMIN-WITNESS
اربط المشرف بـ 127.0.0.1، أو اضبط adminConnectors: []، أو ضع المصادقة / mTLS على سياق المشرف. لا تُسلِّم ملف YAML يسرد موصلات التطبيق فقط وتفترض أن المنفذ 8081 ظل معطلاً.
Abraxas Labs - abraxaslabs.tech - github.com/abraxas - @abraxas_null - [email protected]