
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
Dropwizard 5.0.2 の DefaultServerFactory は、bindHost が未設定(全インターフェース)かつ管理者認証なしで、ポート 8081 に HTTP 管理コネクタを同梱しています。Signal-Server はそれを上書きしません。service/config/sample.yml には server: ブロックがありません。TLS の applicationConnectors のみを列挙した YAML でも、0.0.0.0 上の平文 8081 を継承します。server と 3 つの ServerCommand ワーカーがそれを起動します。ExternalRequestFilter はアプリケーションコンテキストにのみ適用されます。
:8081 への未認証 HTTP が運用上の管理プレーンです。 RCE ではありません。アカウント乗っ取りではありません。封印メッセージの読み取りではありません。
| ID | CVE 未割当 |
| 分類 | 権限の残存(未認証の Dropwizard 管理) |
| 到達範囲 | リモート(全インターフェース :8081、認証なし) |
| CWE | CWE-306, CWE-1188 |
| CVSS | High: 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 スレッドダンプ全体: すべてのスレッド名、ID、状態、スタックフレーム。ラボでは 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ロガーを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に登録されたSignal専用タスク。リクエストアクセスログフィルタ(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には到達できなかった。これがRemoteの半分である。
signalapp/Signal-Server v20261007.0.0を固定した。18回のソース探索。チャット、キー、メッセージ、バックアップ、寄付、通話、MFA、gRPC omnibus、アウトバウンド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
ループバック 127.0.0.1:19010。Compose プロジェクト signal-server-dropwizard-admin。ウィットネス SIGNAL-SERVER-DROPWIZARD-ADMIN-WITNESS。ガジェット YAML には 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
admin を 127.0.0.1 にバインドするか、adminConnectors: [] を設定するか、admin コンテキストに認証 / mTLS を導入してください。アプリケーションコネクタのみを列挙した YAML を出荷し、8081 が無効のままであると想定しないでください。
Abraxas Labs - abraxaslabs.tech - github.com/abraxas - @abraxas_null - [email protected]