
Signal-Server v20261007.0.0 - उच्च - रिमोट - विशेषाधिकार शेष - unauth Dropwizard admin :8081
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · signal-server-dropwizard-admin
राइट-अप: https://abraxaslabs.tech/research/signal-server-dropwizard-admin
वर्ग: विशेषाधिकार अवशेष पहुँच: रिमोट
सिग्नल-सर्वर v20261007.0.0 (a15d5cd) - सिग्नल मैसेंजर, LLC
Dropwizard 5.0.2 का DefaultServerFactory पोर्ट 8081 पर एक HTTP एडमिन कनेक्टर के साथ आता है, जिसमें bindHost सेट नहीं है (सभी इंटरफ़ेस) और कोई एडमिन प्रमाणीकरण नहीं है। Signal-Server इसे कभी ओवरराइड नहीं करता। service/config/sample.yml में कोई server: ब्लॉक नहीं है। एक YAML जो केवल TLS applicationConnectors सूचीबद्ध करता है, वह अभी भी 0.0.0.0 पर प्लेनटेक्स्ट 8081 विरासत में प्राप्त करता है। server और तीन ServerCommand वर्कर इसे शुरू करते हैं। ExternalRequestFilter केवल एप्लिकेशन कॉन्टेक्स्ट पर है।
:8081 पर अनधिप्रमाणित HTTP परिचालनिक एडमिन प्लेन है। RCE नहीं। खाता अधिग्रहण नहीं। सीलबंद-संदेश पठन नहीं।
| ID | अभी तक कोई 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 |
जो भी एडमिन पोर्ट (डिफ़ॉल्ट 0.0.0.0:8081, कोई अतिरिक्त कॉन्फ़िग नहीं, कोई Authorization हेडर नहीं) पर TCP खोल सकता है, उसे हर स्टॉक Dropwizard 5 एडमिन सर्वलेट के साथ-साथ Signal का अतिरिक्त टास्क मिलता है। यह पूरा विशेषाधिकार सेट है। इस सूची में कुछ भी RCE, ATO, या सीलबंद संदेश निकायों का पठन नहीं है।
| विधि | पथ | विशेषाधिकार |
|---|---|---|
| GET | /ping | पुष्टि करें कि एडमिन लिसनर चालू है। बॉडी pong है। |
| GET | /metrics | पूरी Codahale रजिस्ट्री को JSON के रूप में पढ़ें: JVM हीप और नॉन-हीप, GC गणनाएँ, थ्रेड गणनाएँ, Jetty कनेक्टर मीटर, 4xx/5xx गेज, टाइमर। इसका उपयोग प्रक्रिया की फ़िंगरप्रिंटिंग करने, लोड का अनुमान लगाने, और बाद के टास्क के प्रभाव को देखने के लिए करें। |
| GET | /threads | पूरा JVM थ्रेड डंप: हर थ्रेड का नाम, आईडी, स्थिति, और स्टैक फ़्रेम। लैब में इसने dw-admin-* के साथ-साथ java.base nio फ़्रेम दिखाए। एक लाइव 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 logger को 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 / idle-job वर्कर्स पर एप्लिकेशन पोर्ट में कोई Signal Jersey संसाधन नहीं है, इसलिए यह कार्य server पर मायने रखता है। enabled=false इसे फिर से बंद कर देता है। |
ProcessBuilder नहीं, कोई Runtime.exec नहीं।GET /heapdump 404 है।sample.yml या बाइंड पतों में कोई परिवर्तन नहीं।उसी Docker नेटवर्क पर एक सहोदर कंटेनर ने http://vuln:8081/ping (200 pong) तक पहुँच प्राप्त की और जब bindHost 127.0.0.1 था तो http://patched:8081/ping तक नहीं पहुँच सका। यही रिमोट आधा है।
मैंने signalapp/Signal-Server v20261007.0.0 को पिन किया। अठारह स्रोत खोजें। चैट, कुंजियाँ, संदेश, बैकअप, दान, कॉलिंग, MFA, gRPC ऑम्निबस, और आउटबाउंड HTTP Critical/High पर खाली लौटे। वर्कर्स/एडमिन खोज नहीं लौटी। Dropwizard 5.0.2 HttpConnectorFactory.admin() अभी भी पोर्ट 8081 और एक null बाइंड होस्ट का उपयोग करता है। Signal कभी adminConnectors सेट नहीं करता। Caddy का डिफ़ॉल्ट एडमिन localhost है। यह नहीं है।
गलत मोड़: पूर्ण Signal-Server को बूट करने का प्रयास। sample.yml check पास करता है और फिर भी run के लिए FoundationDB, Dynamo, Redis, और एक सीक्रेट्स बंडल की आवश्यकता होती है। अवशेष वह फ्रेमवर्क कनेक्टर है जिसे ServerCommand उन सब से पहले शुरू करता है। लैब Dropwizard 5.0.2 है जिसमें वही खाली server: YAML और Signal का अतिरिक्त कार्य नाम है।
cd lab
./run.sh
Loopback 127.0.0.1:19010. Compose प्रोजेक्ट signal-server-dropwizard-admin. Witness SIGNAL-SERVER-DROPWIZARD-ADMIN-WITNESS. Gadget YAML में कोई server: ब्लॉक नहीं है। Negative 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]