Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
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-66421-OpenClaw-Dashboard-Stored-XSS-via-lastMessage-Session-Field — Aviso de Segurança: Cross-Site Scripting Armazenado Através de Mensagens de Agente Levando ao Roubo de Token de Sessão (openclaw-dashboard) | Kitploit
Ferramentas/GitHubGitHub/theopaid/cve-2026-66421-openclaw-dashboard-stored-xss-via-lastmessage-session-field
Análise de VulnerabilidadesExploraçãoExploração de Aplicações WebSegurança WebSegurança de APISegurança de IA
GitHubtheopaid/cve-2026-66421-openclaw-dashboard-stored-xss-via-lastmessage-session-field

CVE-2026-66421-OpenClaw-Dashboard-Stored-XSS-via-lastMessage-Session-Field

Aviso de Segurança: Cross-Site Scripting Armazenado Através de Mensagens de Agente Levando ao Roubo de Token de Sessão (openclaw-dashboard)

Ver Repositório
5há 1 mêsAinda 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

Aviso de Segurança: Cross-Site Scripting Armazenado via Mensagens de Agente Levando ao Roubo de Token de Sessão (openclaw-dashboard)

Título: XSS Armazenado no OpenClaw Dashboard via Campo de Sessão lastMessage ID do CVE: CVE-2026-66421

https://github.com/tugcantopaloglu/openclaw-dashboard

Resumo

A tabela de sessões na página inicial do dashboard mostra a última mensagem de cada sessão de agente. Esse texto é retirado da transcrição da conversa do agente e escrito na página com innerHTML e sem escape. OpenClaw é um gateway de agentes multicanal, então o texto da mensagem pode vir de qualquer pessoa que consiga falar com o agente, como um grupo de chat ou um webhook. Uma mensagem contendo um payload HTML é executada como script no navegador do administrador assim que ele abre o dashboard.

  • CWE-79: Neutralização Incorreta de Entrada Durante a Geração de Página Web (Cross-site Scripting)
  • CVSS 4.0: 8.8 (Alto). Vetor: CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:P/VC:H/VI:H/VA:N/SC:H/SI:H/SA:N

Versões afetadas

Presente desde a primeira versão pública. A renderização vulnerável existe na tag mais antiga (v1.1.0) e em todos os commits posteriores até e incluindo o atual (d6198d0). Não corrigida no momento em que este texto foi escrito.

main

Modelo de ameaça

O atacante é uma parte que pode enviar uma mensagem que cai na transcrição da sessão do agente. Ele não precisa de uma conta no dashboard. Em uma implantação típica do OpenClaw, isso inclui membros de canais de chat conectados e qualquer fonte que alcance o agente por meio de um webhook, portanto o atacante geralmente está fora do limite de confiança do operador.

O payload é armazenado na transcrição e renderizado sempre que o administrador visualiza a página de sessões. Essa página é a visualização padrão de destino e é atualizada por um temporizador, então a única interação necessária é o administrador carregar o dashboard que normalmente usa. AT:P reflete a única condição da qual o atacante depende: que a implantação roteie as mensagens dele para uma sessão que o dashboard exibe.

Causa raiz

Passo 1. O texto da mensagem é extraído da transcrição. O servidor lê a mensagem mais recente e retorna seu texto, cortado em 80 caracteres, sem sanitização:

root@kitploit:~
// server.js:474-481
if (typeof msg.content === 'string') {
  text = msg.content;
} else if (Array.isArray(msg.content)) {
  for (const b of msg.content) {
    if (b.type === 'text' && b.text) { text = b.text; break; }
  }
}
if (text) return text.replace(/\n/g, ' ').substring(0, 80);

Passo 2. Ele é exposto pela API de sessões. getSessionsJson coloca o texto no campo lastMessage de cada sessão:

root@kitploit:~
// server.js:538
lastMessage: getLastMessage(s.sessionId || key),

GET /api/sessions retorna esse array para o navegador.

Passo 3. Ele é escrito no DOM sem escape. A tabela de sessões constrói cada linha por concatenação de strings e a atribui com innerHTML:

root@kitploit:~
// index.html:3758
const lastMsg = s.lastMessage ? s.lastMessage.substring(0, 60) + (s.lastMessage.length > 60 ? '…' : '') : '';
root@kitploit:~
// index.html:3773
<div class="table-cell" style="..." onclick="toggleSessionExpand('${escapedKey}', event)">${lastMsg}</div>

lastMsg é colocado diretamente na string HTML. Não há nenhuma etapa de codificação em nenhum ponto desse caminho.

A mesma tabela interpola s.label (index.html:3770) e s.key (index.html:3767) na marcação da linha da mesma forma. Esses campos não têm limite de 60 caracteres, então dão a um atacante que possa influenciá-los mais espaço para um payload.

A Content-Security-Policy em server.js:298 permite manipuladores de eventos inline (script-src 'self' 'unsafe-inline'), então um manipulador onerror é executado.

Prova de conceito

  1. Como uma parte que pode enviar mensagens ao agente, envie uma mensagem cujo texto seja um payload curto que caiba no orçamento de 60 caracteres, por exemplo:

    root@kitploit:~

    Isso tem 56 caracteres e chega à transcrição da sessão do agente como qualquer mensagem normal.

  2. Confirme que o servidor devolve o payload sem escape:

    root@kitploit:~
    curl -H "Authorization: Bearer ADMIN_TOKEN" http://TARGET:7000/api/sessions
    

    O campo lastMessage da sessão afetada contém a string `` bruta.

  3. O administrador abre o dashboard. A página de sessões é a visualização padrão, então nenhuma navegação extra é necessária. A linha é renderizada, o navegador analisa a tag ``, o manipulador onerror é executado e o token de sessão do administrador é lido pelo payload.

Substituir o corpo do console.log por um fetch para um endpoint autenticado de mesma origem permite que o payload aja com os privilégios do usuário conectado.

Impacto

Execução de script na origem do dashboard como o usuário conectado, alcançável por alguém que só precisa enviar uma mensagem ao agente. O payload pode ler o token de sessão e chamar endpoints autenticados, inclusive aqueles que editam os arquivos de instrução do próprio agente e a configuração do OpenClaw. Como ele é disparado na página padrão, o administrador não precisa tomar nenhuma ação incomum.

Remediação

  • Codifique em HTML lastMessage, label e key antes de inseri-los na marcação da linha, ou construa as células com textContent em vez de uma string HTML.
  • Aplique a mesma codificação aos outros campos de sessão renderizados por meio de innerHTML.
  • Remova 'unsafe-inline' de script-src para que a marcação injetada não possa ser executada mesmo que uma etapa de codificação seja esquecida.
Baixar ferramenta