← voltar
CVE-2025-8110highsob ataqueCWE-22

File overwrite in file update API in Gogs

100Vexday Risk Score

Corrija agora. Ela está sob exploração confirmada pelo CISA e tem exploit funcional público.

ssvc Actcvss 8.7epss 83%
da publicação à arma1 dias
Publicada no NVD10 de dez.
1ª PoC+1d
CISA KEV+33d
probabilidade de exploração
83%top 1% das CVEs
exploração observada
simCISA + VulnCheck
35 exploit(s) público(s)
Ação exigida pela CISAprazo federal: 2026-02-02

Apply mitigations per vendor instructions, follow applicable BOD 22-01 guidance for cloud services, or discontinue use of the product if mitigations are unavailable.

Resumo

A API PutContents do Gogs (PUT /api/v1/repos/:owner/:repo/contents/:path), usada para criar/editar arquivos de um repositório via REST, não verificava se algum componente do caminho de destino era um link simbólico antes de escrever conteúdo nele. Um usuário autenticado com permissão de escrita num repositório pode commitar um symlink apontando para fora do working copy (por exemplo .git/config) e depois usar a API para 'editar' esse arquivo, fazendo o Gogs seguir o link e sobrescrever o destino real — o que permite escalar para execução de comandos via configuração Git. Está no catálogo KEV da CISA com exploração confirmada; a pesquisa da Wiz citada no próprio repositório do projeto menciona mais de 700 instâncias comprometidas até dezembro de 2025.

Detalhamento técnico

A falha é uma variante de CWE-59 (Improper Link Resolution Before File Access — 'Link Following'). A função UpdateRepoFile, em internal/database/repo_editor.go, resolve os caminhos relativos informados pela API (OldTreeName/NewTreeName) dentro do working copy local do repositório (localPath) e grava o conteúdo diretamente com os.WriteFile. Antes da correção, a única verificação de symlink existente se aplicava apenas ao caso de criação de arquivo novo (IsNewFile) sobre o caminho final — não cobria diretórios intermediários do caminho nem o caso de atualização de arquivo existente.

Isso permite que um atacante com permissão de push num repositório faça, via git push comum (fora da API), o commit de um link simbólico dentro do repositório apontando para um caminho sensível acessível ao processo do Gogs — o exemplo documentado pelos próprios desenvolvedores é um symlink para .git/config. Em seguida, uma chamada à API PutContents referenciando esse caminho faz o servidor seguir o link e escrever ali o conteúdo controlado pelo atacante.

O impacto de maior gravidade é a sobrescrita de .git/config com diretivas como core.sshCommand (ou hooks), que passam a ser executadas pelo processo Git do servidor na próxima operação sobre aquele repositório (fetch, clone, push), resultando em execução de comando arbitrário com os privilégios do serviço Gogs.

O commit de correção (553707f3) introduz a função hasSymlinkInPath(), que percorre cada segmento do caminho relativo e usa osutil.IsSymlink para detectar link simbólico em qualquer nível da hierarquia, tanto para o caminho antigo quanto o novo, rejeitando a operação antes de qualquer escrita — cobertura mais ampla que a checagem anterior, restrita ao arquivo final em caso de criação.

Como é explorada

Pré-requisito real: conta autenticada no Gogs com permissão de escrita (push) em algum repositório — em instâncias com registro de usuário aberto, isso equivale a qualquer visitante que crie conta e um repositório próprio. Não é uma falha pré-autenticação nem exige configuração exótica além do comportamento padrão de hospedagem de repositórios Git.

A exploração ocorre em duas etapas: primeiro o atacante usa git push normal (não a API) para commitar um objeto symlink (modo 120000) dentro do repositório apontando para um caminho sensível, tipicamente .git/config do próprio repositório; em seguida chama a API PutContents referenciando esse caminho como se fosse um arquivo normal, enviando conteúdo em base64. O servidor resolve o link e grava o conteúdo no destino real. Não há necessidade de exploração de memória ou payload binário — é abuso de lógica de validação de caminho para converter uma primitiva de 'escrita de arquivo dentro do repo' em escrita arbitrária, escalada depois para execução de comando via configuração/hooks Git processados pelo servidor.

A presença no catálogo KEV da CISA confirma exploração ativa observada. A pesquisa da Wiz referenciada no pull request de correção do próprio projeto relata centenas de instâncias Gogs expostas publicamente já comprometidas, compatível com campanha de varredura e exploração automatizada contra instâncias com registro aberto de usuários.

Como se proteger

Atualizar para uma versão do Gogs que já incorpore o commit 553707f3fd5f68f47f531cfcff56aa3ec294c6f6 (branch main), que adiciona a verificação hasSymlinkInPath antes de qualquer escrita via PutContents. As fontes consultadas não trazem o número de release exato em que esse commit foi publicado — confirme no changelog/notas de release do projeto antes de considerar corrigido.

Há um pull request adicional (#8078), ainda em revisão com pedido de mudanças do mantenedor em janeiro de 2026, propondo hardening mais amplo (resolução de symlinks com filepath.EvalSymlinks e validação centralizada num pacote pathutil) para cobrir casos como symlinks encadeados ou relativos que escapem do diretório do repositório. Isso sugere que o fix inicial pode não eliminar todos os vetores de bypass — acompanhe o merge desse PR antes de assumir cobertura completa.

Controles compensatórios caso a atualização não seja imediata: restringir ou desabilitar o autorregistro de usuários e a criação livre de repositórios (a falha depende de o atacante controlar conteúdo/commits de um repositório); revisar permissões de escrita em instâncias públicas; monitorar chamadas PUT para /api/v1/repos/*/contents/* de contas não totalmente confiáveis. Bloquear apenas o acesso à API REST não resolve, pois a criação do symlink malicioso ocorre via git push comum, e não pela própria API.

Pesquisado e redigido com IA a partir do advisory do fornecedor e de análises públicas, com as fontes acima. Confira sempre a versão corrigida no advisory oficial antes de agir.
Improper Symbolic link handling in the PutContents API in Gogs allows Local Execution of Code.
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N/E:A/AU:Y/R:U/V:C
Produtos afetados
Gogs · Gogs
PoCs públicas encontradas35
githubgithub.com/zAbuQasem/gogs-CVE-2025-811027githubgithub.com/rxerium/CVE-2025-811022githubgithub.com/kayl22/cve-2025-8110-GOGS-RCE4githubgithub.com/3jee/CVE-2025-81102githubgithub.com/Ghxstsec/CVE-2025-81102githubgithub.com/George0Papasotiriou/CVE-2025-8110-Gogs-Remote-Code-Execution1githubgithub.com/0dgt/CVE-2025-81101githubgithub.com/mananispiwpiw/CVE-2025-8110-PoC0githubgithub.com/popyue/CVE-2025-81100githubgithub.com/X4BROZER/CVE-2025-81100githubgithub.com/tovd-go/CVE-2025-81100githubgithub.com/111ddea/goga-cve-2025-81100githubgithub.com/hassan-hamadi/CVE-2025-8110-Silentium-HTB0githubgithub.com/AdityaInnovates/CVE-2025-8110-Gogs-RCE-Exploit0githubgithub.com/get-xor/coreweave-demo-2026-050vulncheckvulncheck.com/xdb/942ecab2b7f3não verificadovulncheckvulncheck.com/xdb/09d4e433b3f5não verificadovulncheckvulncheck.com/xdb/171bf6de0983não verificadovulncheckvulncheck.com/xdb/44dce5b3aeaenão verificadovulncheckvulncheck.com/xdb/4cdb8568f534não verificadovulncheckvulncheck.com/xdb/296e89f144f1não verificadovulncheckvulncheck.com/xdb/d68ff06fafb4não verificadovulncheckvulncheck.com/xdb/ead9b44096c4não verificadovulncheckvulncheck.com/xdb/b5ef86fdc299não verificadovulncheckvulncheck.com/xdb/71e20d83ec6enão verificadovulncheckvulncheck.com/xdb/eb4ab0711710não verificadovulncheckvulncheck.com/xdb/d77d0ae38d33não verificadovulncheckvulncheck.com/xdb/b54a4a7d5b85não verificadovulncheckvulncheck.com/xdb/3bd09f5454e2não verificadovulncheckvulncheck.com/xdb/4c10f660ef24não verificadovulncheckvulncheck.com/xdb/f4c9b7664327não verificadovulncheckvulncheck.com/xdb/1f47c9cb7409não verificadovulncheckvulncheck.com/xdb/de4a1007db99não verificadovulncheckvulncheck.com/xdb/05917d8228dbnão verificadovulncheckvulncheck.com/xdb/ac0be103d4c4não verificado
⚠ Recursos públicos, para você avaliar a exposição de sistemas que controla ou está autorizado a testar. Teste apenas com autorização.