Skip to content
KitploitKITPLOIT
FerramentasExploitsBlog
Log in
Enviar
FerramentasExploitsBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2026-34048 — Rotas de bootstrap do terminal apenas para administradores verificadas apenas pelo estado de login, que permitem que um membro normal da equipe acione o backend de terminal em tempo real do Coolify e execute comandos nos servidores da equipe. | Kitploit
Ferramentas/GitHubGitHub/0xmrma/cve-2026-34048
Autenticação e AutorizaçãoEscalada de PrivilégiosAnálise de VulnerabilidadesExploraçãoExploração de Aplicações WebTestes de PenetraçãoSegurança na NuvemComando e ControleRed Teaming
GitHub0xmrma/cve-2026-34048

CVE-2026-34048

8há 2 mesesAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

Rotas de bootstrap do terminal apenas para administradores verificadas apenas pelo estado de login, que permitem que um membro normal da equipe acione o backend de terminal em tempo real do Coolify e execute comandos nos servidores da equipe.

Ver Repositório

CVE-2026-34048

Rotas de inicialização do terminal restrito a administradores verificavam apenas o estado de login, o que permitia que um membro normal da equipe controlasse o backend do terminal em tempo real do Coolify e executasse comandos nos servidores da equipe.

Introdução

Encontrei esse problema ao revisar o Coolify, um PaaS auto-hospedado de código aberto, com uma pergunta de segurança muito direta em mente:

O acesso ao terminal é realmente imposto na fronteira de confiança do backend, ou apenas na interface do usuário?

Neste caso, a resposta foi ruim.

O Coolify pretendia restringir o acesso ao terminal a administradores e proprietários da equipe, mas as rotas de inicialização do terminal em tempo real apenas verificavam se o usuário estava logado. Isso permitia que um membro de equipe com privilégios baixos satisfizesse as verificações de confiança do websocket do terminal e alcançasse a execução de comandos nos servidores da equipe.

Validei isso de ponta a ponta em um laboratório local construído a partir da revisão vulnerável e, posteriormente, reportei-o de forma privada. O problema foi atribuído ao CVE-2026-34048 com:

CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H

Coolify: Coolify no GitHub
CVE: CVE-2026-34048

Isso afetou o Coolify, um PaaS auto-hospedado de código aberto. Em seu site oficial, o Coolify afirma ter 3.641+ clientes na nuvem e se apresenta como uma plataforma para implantar sites, bancos de dados, aplicativos web e mais de 280 serviços com um clique. Seu changelog oficial v4.0 também afirma que milhares de empresas e pessoas usam o Coolify em produção há 1-2 anos.

foto0


Cadeia de Ataque

sessão de membro da equipe com privilégios baixos -> /terminal/auth e /terminal/auth/ips verificam apenas estado de login -> websocket em tempo real confia nessas respostas -> membro enumera servidor da equipe e UUID da chave SSH visível -> /terminal/ws aceita a sessão -> PTY baseado em SSH é criado -> acesso ao shell no servidor da equipe


O que o Coolify Faz

O Coolify é um PaaS auto-hospedado e plataforma de implantação.

Ele gerencia:

  • servidores
  • aplicativos
  • implantações
  • chaves privadas
  • permissões de equipe
  • acesso ao terminal para infraestrutura gerenciada

Essa última capacidade é a importante aqui.

Uma vez que uma plataforma pode abrir terminais para hosts gerenciados, seu modelo de autorização deixa de ser apenas lógica de aplicação. Torna-se uma fronteira de confiança de infraestrutura.

A questão importante não era se a página /terminal parecia restrita a administradores.

A verdadeira questão era:

O caminho do terminal no backend realmente impõe essa mesma fronteira de autorização quando a sessão websocket é criada?

Neste caso, não impunha.


Por que Este Bug Valia a Pena Ser Investigado

Funcionalidades de terminal são algumas das superfícies de maior valor em software de infraestrutura.

Por quê?

Porque qualquer incompatibilidade entre:

  • autorização da interface do usuário
  • autorização do backend
  • lógica de inicialização do websocket
  • execução de comandos no host

pode transformar um usuário normal de aplicação em um operador com acesso a shell.

É exatamente por isso que essa superfície valia a pena ser testada.

Eu não estava procurando por travamentos aleatórios ou bugs de permissão cosméticos.

Estava procurando por uma classe mais forte de falha:

Um recurso restrito a administradores depende de uma verificação de confiança do backend mais fraca do que a interface sugere?

Essa era a pergunta certa.


A Fronteira na Qual Foquei

Não abordei o Coolify fazendo fuzzing em endpoints aleatórios e esperando algo interessante.

O caminho mais forte era identificar primeiro a fronteira de maior risco.

Para o Coolify, essa fronteira era o fluxo do terminal:

  • a interface diz que o acesso ao terminal é restrito
  • o serviço de terminal é baseado em websocket
  • serviços websocket geralmente têm lógica de confiança de inicialização separada
  • os comandos do terminal, no final, cruzam do estado da aplicação para execução no host

Isso fez das rotas de inicialização o lugar certo para olhar.

E foi onde o problema estava.


Causa Raiz

A causa raiz foi uma incompatibilidade de autorização entre a interface do terminal e as rotas de inicialização do websocket do terminal.

Na revisão vulnerável:

  • GET /terminal era protegido por can.access.terminal
  • POST /terminal/auth verificava apenas auth()->check()
  • POST /terminal/auth/ips verificava apenas auth()->check()

Isso significa que a interface era limitada pela autorização do terminal, mas a fronteira de confiança do backend era limitada pela simples presença de uma sessão autenticada.

O serviço em tempo real então confiava completamente nessas duas rotas.

Em docker/coolify-realtime/terminal-server.js:

  • verifyClient() fazia POST para /terminal/auth
  • a configuração da sessão websocket fazia POST para /terminal/auth/ips
  • o manipulador websocket aceitava a entrada de comando do terminal fornecida pelo atacante após verificar apenas se o host alvo aparecia na lista de hosts retornada

Essa é toda a cadeia do bug.

Por que isso é explorável

Porque um membro normal da equipe podia construir as entradas necessárias a partir da superfície normal da aplicação:

  • /servers expunha UUIDs de servidores visíveis
  • /server/{uuid} expunha ip, user e port em campos de formulário renderizados
  • /security/private-key expunha UUIDs de chaves privadas visíveis da equipe
  • o caminho do terminal referenciava chaves através de caminhos determinísticos da forma:
/var/www/html/storage/app/ssh/keys/ssh_key@<uuid>

Portanto, o caminho de exploração era direto:

  • faça login como um membro não administrador da equipe
  • chame /terminal/auth
  • chame /terminal/auth/ips
  • enumere um servidor visível
  • enumere um UUID de chave visível
  • conecte-se a /terminal/ws
  • envie a mesma forma de comando SSH que o backend espera
  • receba a saída do shell de um host da equipe

Isso não é uma incompatibilidade teórica. É uma falha prática de autorização do backend.


O que Torna Isso um Problema de Segurança, Não Apenas uma Incompatibilidade de Interface

A distinção importante é a confiança do backend e a execução de comandos.

Muitos bugs parecem:

  • "o botão está oculto"
  • "a página está bloqueada"
  • "a interface diz que você não deveria estar aqui"

Isso por si só não é suficiente.

A verdadeira questão é:

O usuário com privilégios mais baixos ainda pode satisfazer as verificações de confiança do backend que importam?

Aqui, a resposta foi sim.

Isso não foi:

  • um menu quebrado
  • uma verificação de frontend ausente
  • um problema de roteamento cosmético

Foi:

  • autorização de inicialização do websocket muito fraca
  • autorização do host do terminal derivada dessa fronteira de confiança fraca
  • acesso real ao shell na infraestrutura gerenciada

É por isso que isso era um problema de segurança real.


PoC

Validei isso em um laboratório local controlado construído a partir de:

06f60c9a98bead0c932c6adf7fd43a45d9149048

O laboratório usava:

  • URL base: http://127.0.0.1:18000
  • conta de membro com privilégios baixos: [email protected]
  • servidor alvo: localhost -> coolify-testing-host:22 as root
  • UUID da chave visível: ssh
  • endpoint websocket: ws://127.0.0.1:6002/terminal/ws

Passo 1: confirmar a fronteira da interface

A conta de membro não deveria ter acesso ao terminal através da interface normal voltada para administradores.

Isso estabeleceu a fronteira de segurança esperada.

Passo 2: chamar as rotas de inicialização diretamente

Usando a sessão do membro, enviei:

  • POST /terminal/auth
  • POST /terminal/auth/ips

Ambas tiveram sucesso.

/terminal/auth/ips retornou hosts autorizados pelo terminal, incluindo:

Baixar ferramenta