
Signal-Server v20261007.0.0 - Alta - Remoto - Privilégio remanescente - admin Dropwizard não autenticado :8081
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · signal-server-dropwizard-admin
Classe: Privilégio remanescente Alcance: Remoto
Signal-Server v20261007.0.0 (a15d5cd) - Signal Messenger, LLC
O DefaultServerFactory do Dropwizard 5.0.2 disponibiliza um conector HTTP de administração na porta 8081 com bindHost não definido (todas as interfaces) e sem autenticação de administração. O Signal-Server nunca substitui isso. O service/config/sample.yml não tem bloco server:. Um YAML que apenas lista applicationConnectors TLS ainda herda o 8081 em texto simples em 0.0.0.0. O server mais os três workers ServerCommand iniciam-no. O ExternalRequestFilter está apenas no contexto da aplicação.
HTTP não autenticado para :8081 é o plano de administração operacional. Não é RCE. Não é tomada de conta. Não é leitura de mensagens seladas.
| ID | ainda sem CVE |
| Classe | Privilégio remanescente (administração Dropwizard não autenticada) |
| Alcance | Remoto (todas as interfaces :8081, sem autenticação) |
| CWE | CWE-306, CWE-1188 |
| CVSS | Alto: 7.3 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:L |
| Produto | Signal-Server |
| Afetado | v20261007.0.0 (a15d5cd) Dropwizard 5.0.2. Amostra no repositório / adminConnectors omitido. |
| Autenticação | nenhuma no conector de administração |
| Licença | GNU Affero GPL v3.0 |
| Laboratório | apenas 127.0.0.1 |
Qualquer pessoa que consiga abrir TCP para a porta de administração (padrão 0.0.0.0:8081, sem configuração extra, sem cabeçalho Authorization) obtém todos os servlets de administração padrão do Dropwizard 5, mais a tarefa extra do Signal. Esse é o conjunto completo de privilégios. Nada nesta lista é RCE, ATO ou leitura de corpos de mensagens seladas.
| Método | Caminho | Privilégio |
|---|---|---|
| GET | /ping | Confirma que o listener de administração está ativo. O corpo é pong. |
| GET | /metrics | Lê o registo Codahale completo como JSON: heap e non-heap da JVM, contagens de GC, contagens de threads, medidores do conector Jetty, medidores 4xx/5xx, temporizadores. Use isto para identificar o processo, estimar a carga e observar o efeito de tarefas posteriores. |
| GET | /threads | Despejo completo de threads da JVM: nome de cada thread, id, estado e frames de pilha. No laboratório isto mostrou dw-admin-* mais frames nio de java.base. Num nó Signal em produção, o mesmo despejo pode incluir nomes de classes, nomes de loggers e qualquer string que esteja numa pilha (caminhos de ficheiros, hostnames, toString de argumentos em curso). Não é um heap dump e não é um despejo da fila de mensagens. |
| GET | /healthcheck | Executa as verificações de saúde registadas. Esta árvore nunca regista extras, por isso o corpo é a verificação de deadlock padrão (deadlocks.healthy). Um 200 vs 500 diz-lhe se a JVM pensa que está em deadlock. |
| GET | /tasks | Lista as tarefas de administração. Neste pin: gc, log-level, set-request-logging-enabled. |
| Método | Caminho | Privilégio |
|---|---|---|
| POST | /tasks/log-level?logger=<name>&level=<LEVEL> | Define qualquer logger Logback para TRACE, DEBUG, INFO, WARN, ERROR ou OFF. TRACE pode fazer os loggers da aplicação imprimir mais (incluindo valores que um programador registou). OFF num logger de segurança ou de acesso apaga-o. O atacante não recebe o fluxo de logs por este HTTP. Ele altera o que o processo escreve para disco ou stdout. Oráculo do laboratório: nome do logger SIGNAL-SERVER-DROPWIZARD-ADMIN-WITNESS para TRACE. |
| POST | /tasks/gc | Chama System.gc(). A resposta é Running GC... / Done!. É um empurrão stop-the-world, não a morte do processo. |
| POST | /tasks/set-request-logging-enabled?enabled=true | Tarefa exclusiva do Signal registada em WhisperServerService.run. Ativa o filtro de log de acesso a pedidos (RequestLogManager). Depois disso, o HTTP para o conector da aplicação pode escrever método, URI e cabeçalhos (incluindo Authorization Basic) no log de acesso em disco. O cliente de administração não recebe essas linhas de volta. Nos workers message-persister-service / APN / idle-job, a porta da aplicação não tem recursos Signal Jersey, por isso esta tarefa é relevante no server. enabled=false volta a desativá-la. |
ProcessBuilder, sem Runtime.exec.GET /heapdump é 404.sample.yml ou aos endereços de bind.Um contentor irmão na mesma rede Docker alcançou http://vuln:8081/ping (200 pong) e não conseguiu alcançar http://patched:8081/ping quando bindHost era 127.0.0.1. Essa é a metade Remota.
Fixe o signalapp/Signal-Server v20261007.0.0. Dezoito buscas no código-fonte. Chat, chaves, mensagens, backups, donativos, chamadas, MFA, omnibus gRPC e HTTP de saída voltaram vazios em Crítico/Alto. A busca de workers/administração não. O HttpConnectorFactory.admin() do Dropwizard 5.0.2 ainda usa a porta 8081 e um bind host nulo. O Signal nunca define adminConnectors. A administração padrão do Caddy é localhost. Esta não é.
Caminho errado: tentar arrancar o Signal-Server completo. O sample.yml passa o check e ainda precisa de FoundationDB, Dynamo, Redis e um pacote de segredos para run. O remanescente é o conector da framework que o ServerCommand inicia antes de tudo isso. O laboratório é Dropwizard 5.0.2 com o mesmo YAML server: vazio e o nome da tarefa extra do Signal.
cd lab
./run.sh
Loopback 127.0.0.1:19010. Projeto Compose signal-server-dropwizard-admin. Witness SIGNAL-SERVER-DROPWIZARD-ADMIN-WITNESS. O YAML do gadget não tem bloco server:. O YAML negativo define bindHost: 127.0.0.1. Última linha:
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
Faça bind da administração a 127.0.0.1, defina adminConnectors: [] ou coloque autenticação / mTLS no contexto de administração. Não distribua um YAML que apenas lista conectores de aplicação e assuma que o 8081 ficou desligado.