Radar Tech: RCE crítico no Forgejo (CVE-2026-89094) — quando a expansão de template cruza a fronteira de confiança
Forgejo < 16.0.4 tem um RCE de CVSS 9.9: um repositório de template pode plantar uma pasta .git que a inicialização do repositório adota. Um usuário autenticado, execução no host. O que a arquitetura da sua forja precisa mudar.
Radar Tech: RCE crítico no Forgejo (CVE-2026-89094) — quando a expansão de template cruza a fronteira de confiança
Na semana de 11 de setembro de 2026 apareceu uma das correções mais desconfortáveis do ano para quem mantém plataforma de código auto-hospedada: o Forgejo publicou a versão 16.0.4 fechando um RCE crítico — CVE-2026-89094, CVSS 9.9 — no caminho de geração de repositório a partir de um template.
O detalhe é o tipo de coisa que só dói quando você desenha a fronteira de confiança no papel.
O que aconteceu, exatamente
Quando você cria um repositório a partir de um template, a forja faz uma sequência banal: clona o repositório de template, remove a pasta .git, expande variáveis nos arquivos listados em .forgejo/template (para substituir nome do repo, dono etc.) e então inicializa um repositório git novo.
O problema é a ordem e a confiança implícita no meio. A expansão de variáveis podia ser usada para criar uma nova pasta .git — e a inicialização seguinte, sem saber, adotava esse .git controlado pelo atacante. A partir daí, um repositório de template malicioso permitia leitura de dados arbitrários do host e execução de processos arbitrários — leia-se: RCE no servidor da forja.
A correção é simples: remover qualquer .git existente depois da expansão e antes da inicialização. Mas a correção é a parte fácil.
Por que o CVSS é 9.9 e não "só mais um RCE"
- Pré-condição baixíssima: basta um usuário autenticado com permissão de criar repositório. Em muitas instalações, isso é todo mundo.
- Ganho máximo: leitura de arquivo + execução de processo, no host que guarda o código.
- Blast radius traiçoeiro: a forja raramente vive sozinha. Ela está ao lado de CI runners com segredos, tokens de API, webhooks e object storage. Comprometer a forja é comprometer a cadeia inteira.
O erro de arquitetura que a CVE expõe
Este não é um bug de "faltou escapar um caractere". É um bug de fronteira: conteúdo controlado pelo usuário (o template) foi processado por um componente que tinha poder demais (inicialização de repo com efeitos no filesystem), sem isolamento e sem validação de que a expansão não havia criado estruturas sensíveis.
Três perguntas que valem para a sua instância, hoje:
- Quem pode criar repositório? Se a resposta é "qualquer usuário autenticado", todo mundo é um atacante em potencial.
- O que a forja alcança? Se ela compartilha rede ou nó com o banco ou com runners com credenciais amplas, o RCE vira acesso a tudo.
- O que você detectaria? Se não há log/alerta para criação de
.gitdurante expansão de template, execução de processo filho inesperado, ou egress anômalo, o ataque passaria silencioso.
O que fazer nesta semana
- Agora: atualize para ≥ 16.0.4 e, até lá, desabilite a criação de repositório a partir de template ou restrinja a criação de repositórios a admins.
- Depois do patch: audite repositórios de template existentes e o conteúdo de
.forgejo/templateem busca de atividade suspeita. - Estrutural, no trimestre: trate forja e CI como zona de alto risco — egress deny-by-default, runners read-only, segredos efêmeros via OIDC, e segregação de rede entre forja, banco e storage.
A decisão que fica
A CVE é do Forgejo, mas o padrão se repete em toda plataforma que aceita conteúdo de usuário e o processa com privilégio: expansão de template, hooks, runners, importadores de migração. Cada um desses é uma fronteira de confiança esperando um SUPOSIÇÃO: bem anotado.
O que separa um time que responde em horas de um que leva semanas não é talento — é ter a estrutura de decisão pronta antes da manchete.
Fontes
- Forgejo 16.0.4 — release notes publicadas (
release-notes-published/16.0.4.md, Codeberg) - NVD — CVE-2026-89094 (CVSS 3.1: 9.9 CRITICAL), CVE-2026-89151 (relacionada)
Quer o pacote completo de contenção — prompt + guardrails + few-shots + harness de verificação + variações por stack — para rodar essa análise na sua instância? Ele está no catálogo da ArchPrompts, na categoria segurança.