XSS nos logs de build do SourceHut permitia sequestrar contas
Um log de build manipulado podia executar script no navegador de um usuário do SourceHut. O ansi2html 1.9.4 corrige a falha, CVE-2026-92973, que afetava as versões 1.7.0 a 1.9.3.
3 min de leitura

Um pesquisador de segurança divulgou uma falha que permitia a um log de build manipulado sequestrar contas do SourceHut. O bug estava no ansi2html, uma biblioteca Python que transforma a saída colorida do terminal em HTML, e é rastreado como CVE-2026-92973. Qualquer projeto que exiba logs não confiáveis com o ansi2html nas versões 1.7.0 a 1.9.3 tem a mesma exposição.
O SourceHut é uma forja de software hospedada, um serviço para repositórios Git, listas de e-mail e integração contínua. Seu serviço de CI, o builds.sr.ht, executa jobs e mostra os logs deles no navegador. O pesquisador, que publica como Arusekk, descreveu o ataque em 23 de setembro de 2026.
Como um log de build virou um ataque
O ataque usou cross-site scripting, ou XSS. Isso significa fazer um site executar o JavaScript de um atacante no navegador de um visitante, com a sessão logada desse visitante.
Terminais entendem sequências de escape, códigos ocultos misturados à saída de texto. A maioria define cores. Um tipo, o OSC 8, transforma um trecho de texto em um hiperlink clicável. O ansi2html traduz esses códigos para HTML para que um log tenha a mesma aparência em uma página web.
Segundo o relato, o ansi2html não escapava corretamente o destino do link nas sequências OSC 8. Um job podia imprimir uma sequência cujo "link" escapava do atributo HTML e adicionava novos, incluindo um manipulador de eventos que executa código. Quem abrisse a página de log desse job o executava.
O que um atacante podia fazer
O script injetado podia ler o token CSRF da página, escreve o pesquisador. Um token CSRF é o segredo que um site usa para confirmar que uma requisição veio de fato da própria sessão do usuário. Com ele, o script podia enviar jobs de build em nome da vítima e alcançar suas chaves de deploy, as credenciais que os jobs usam para enviar código ou publicar versões.
| Software afetado | Versões vulneráveis |
|---|---|
| ansi2html | De 1.7.0 até 1.9.4, sem incluí-la |
| builds.sr.ht | De 0.40.0 até 0.105.1, sem incluí-la |
O relato não aponta nenhuma exploração documentada no mundo real.
A cronologia da divulgação
O SourceHut agiu rápido. A correção na biblioteca original levou um mês a mais, e a divulgação pública esperou até que ambas estivessem disponíveis.
| Data (2026) | Evento |
|---|---|
| 1º de agosto | Bug relatado |
| 4 de agosto | Mitigação implantada no builds.sr.ht |
| 2 de setembro | Lançado o ansi2html 1.9.4 com a correção |
| 17 de setembro | CVE-2026-92973 atribuído |
| 23 de setembro | Relato público publicado |
As notas de versão do ansi2html 1.9.4 no GitHub listam a correção como "osc8: ensure proper escaping", pull request 263. Arusekk escreveu o patch e o mantenedor hartwork o aprovou.
Por que auditar a dependência não bastava
O pesquisador levanta um ponto que vai além deste bug. A falha está em um código que muda de versão para versão, então uma revisão única não consegue pegá-la. "Note how even carefully auditing ansi2html would not save SourceHut, unless redone on every bump", diz o relato.
Uma dependência que era segura quando você a revisou pode ganhar um recurso novo depois. Uma atualização de versão comum então traz esse recurso, e qualquer bug nele, direto para o seu produto.
O SourceHut esteve no noticiário este ano por suas regras de contribuição, incluindo a proibição de código e tickets assistidos por LLM. Esta divulgação lembra que o próprio código do serviço tem uma cadeia de suprimentos como o de qualquer outro.
O que isso significa para desenvolvedores
Atualize o ansi2html para a versão 1.9.4 ou posterior onde quer que você o use. Vasculhe seus lockfiles e imagens de contêiner, não só suas dependências diretas, porque a biblioteca costuma chegar como dependência de uma ferramenta de teste ou de CI. Rodar pip show ansi2html dentro de cada ambiente mostra a versão que você realmente distribui.
Trate a saída de build como entrada hostil. Um log de CI contém o que quer que o código de um pull request tenha escolhido imprimir. Se o seu próprio painel exibe logs como HTML, verifique se cada valor de atributo é escapado. Adicione uma Content Security Policy que bloqueie manipuladores de eventos inline, para que um escape esquecido não vire execução de código.
Revise o que uma sessão roubada poderia alcançar. Aqui, uma única visualização de página expunha o poder de iniciar jobs e ler chaves de deploy. Restrinja as chaves de deploy a repositórios individuais e troque qualquer uma cujo uso você não consiga explicar.
Por fim, releia os changelogs quando uma biblioteca de renderização ou de parsing adicionar um recurso. Suporte a novas sequências de escape, nova marcação ou novo tratamento de links são exatamente as mudanças que merecem uma segunda olhada.
Fontes
- SourceHut account takeover via build logs - arusekk.pl
- ansi2html v1.9.4 - GitHub
Artigos relacionados

Node.js 22.23.3 LTS corrige um bug use-after-free no HTTP/2
O Node.js 22.23.3 LTS, lançado em 23 de setembro, corrige um bug use-after-free no HTTP/2, adiciona suporte a SharedArrayBuffer na Node-API e passa para o OpenSSL 3.5.8.

Radicle até 1.10.3 envia repositórios privados sem criptografia
Todas as versões do Radicle até a 1.10.3 enviam dados de repositórios sem criptografia e deixam um atacante imitar um par confiável. Ainda não há correção.

Gzip 1.15 corrige corrida que apagava o arquivo errado
O Gzip 1.15 reúne 119 commits de 75 semanas de trabalho. Corrige uma corrida que podia apagar o arquivo errado e um estouro de buffer ao descompactar .lzh.