Pular para o conteúdo

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.

Por Tech AI Wire Team

3 min de leitura

XLinkedIn
The GitHub release page for ansi2html v1.9.4, listing the CVE-2026-92973 fix "osc8: ensure proper escaping" under Fixes.
Foto: GitHub, pycontribs/ansi2html

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 afetadoVersões vulneráveis
ansi2htmlDe 1.7.0 até 1.9.4, sem incluí-la
builds.sr.htDe 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 agostoBug relatado
4 de agostoMitigação implantada no builds.sr.ht
2 de setembroLançado o ansi2html 1.9.4 com a correção
17 de setembroCVE-2026-92973 atribuído
23 de setembroRelato 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

  1. SourceHut account takeover via build logs - arusekk.pl
  2. ansi2html v1.9.4 - GitHub

Artigos relacionados