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-5061 — O Consul Template validava para onde o symlink apontava durante a avaliação do template, mas sua busca de dependência posterior lia o caminho original. Redirecionar o link entre essas operações transformou uma referência de arquivo dentro do sandbox em uma divulgação de arquivo fora do sandbox. | Kitploit
Ferramentas/GitHubGitHub/0xmrma/cve-2026-5061
Análise de VulnerabilidadesAnálise de CódigoExploraçãoExfiltração de DadosAprendizado e Educação
GitHub0xmrma/cve-2026-5061

CVE-2026-5061

Ver Repositório
13há 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 →

Sobre

O Consul Template validava para onde o symlink apontava durante a avaliação do template, mas sua busca de dependência posterior lia o caminho original. Redirecionar o link entre essas operações transformou uma referência de arquivo dentro do sandbox em uma divulgação de arquivo fora do sandbox.

Compartilhar

CVE-2026-5061

O Consul Template validava para onde um symlink apontava durante a avaliação do template, mas a busca de dependência posterior lia o caminho original. Redirecionar o link entre essas operações transformava uma referência de arquivo dentro do sandbox em uma divulgação de arquivo fora do sandbox.

Introdução

Encontrei este problema enquanto revisava o HashiCorp Consul Template, com uma questão de segurança muito específica em mente:

Se o sandbox_path valida um symlink durante a avaliação do template, a leitura de arquivo posterior permanece vinculada ao mesmo alvo validado?

Neste caso, a resposta foi não.

O helper de template file resolvia o caminho e aplicava o sandbox configurado durante a avaliação do template. Mas, após essa verificação, ele criava uma dependência de arquivo usando o caminho bruto original.

Essa dependência era buscada posteriormente.

Se um atacante redirecionasse o symlink na lacuna entre a validação e a busca da dependência, o Consul Template poderia ler um arquivo fora do sandbox. Se o link fosse restaurado antes da próxima renderização, a validação do sandbox passava novamente e o conteúdo externo em cache ainda era renderizado.

Esse problema tornou-se o CVE-2026-5061.

Boletim da HashiCorp: HCSEC-2026-12
Boletim da IBM: boletim de segurança CVE-2026-5061


CVE:
CVE-2026-5061

Corrigido em:
0.42.0

photo0


Cadeia de Ataque

attacker-controlled in-sandbox symlink -> sandbox validation resolves to safe target -> dependency stores original raw path -> attacker retargets link outside sandbox -> dependency fetch reads external file -> attacker restores safe link -> next validation passes -> cached external content is rendered


O Que o Consul Template Faz

Consul Template é uma ferramenta de renderização de templates para dados do Consul e do Vault.

Ele pode ser executado continuamente, monitorar dependências em busca de alterações e renderizar dados em arquivos ou variáveis de ambiente para que os aplicativos consumam.

O helper de template file lê um arquivo local e insere seu conteúdo na saída renderizada.

Como as leituras de arquivos locais podem expor segredos legíveis pelo processo, o Consul Template fornece o sandbox_path como um limite para esse helper.

A propriedade de segurança documentada é direta:

  • caminhos passados para file devem estar dentro do sandbox configurado
  • caminhos relativos não devem escapar do sandbox
  • alvos vinculados não devem transformar um caminho permitido em uma leitura de arquivo externo

Isso torna o sandbox_path um limite de segurança real.

A questão importante não era se o caminho parecia estar sob o sandbox.

A verdadeira questão era:

O arquivo que é lido permanece sendo o mesmo arquivo que passou pela validação do sandbox?

Nas versões vulneráveis, não permanecia.


Por Que Essa Superfície Merecia Atenção

Sandboxes de sistema de arquivos frequentemente falham na lacuna entre a validação do caminho e o acesso ao arquivo.

O padrão comum é:

  • validar um caminho
  • devolver o controle ao sistema de arquivos
  • usar o caminho novamente mais tarde
  • assumir que ele ainda identifica o mesmo objeto

Essa suposição é insegura quando um atacante pode modificar um symlink ou um redirecionamento equivalente do sistema de arquivos entre as duas operações.

O Consul Template tornou essa superfície especialmente interessante porque a avaliação do template e a busca de dependências eram estágios separados.

Essa separação criou a questão de segurança certa:

A busca da dependência está vinculada ao alvo validado, ou ela resolve novamente o caminho controlado pelo atacante?

Era esse o limite no qual eu me concentrei.


Causa Raiz

A causa raiz era uma incompatibilidade de tempo-de-verificação para tempo-de-uso entre:

  • a validação do sandbox em template/funcs.go
  • a leitura posterior da dependência em dependency/file.go

Na revisão testada, o fileFunc() fazia o seguinte:

root@kitploit:~
normalized := strings.TrimSpace(s)
err := pathInSandbox(sandboxPath, normalized)
if err != nil {
    return "", err
}

d, err := dep.NewFileQuery(s)

O helper de validação resolvia corretamente os symlinks antes de verificar a contenção:

root@kitploit:~
sandboxResolved, err := filepath.EvalSymlinks(filepath.Clean(sandbox))
targetResolved, err := filepath.EvalSymlinks(filepath.Clean(path))

rel, err := filepath.Rel(sandboxResolved, targetResolved)
if rel == ".." || strings.HasPrefix(rel, ".."+string(filepath.Separator)) {
    return fmt.Errorf("'%s' is outside of sandbox", path)
}

Portanto, a própria verificação do sandbox entendia o alvo resolvido.

Mas esse alvo resolvido era descartado.

O NewFileQuery() armazenava a string original em vez disso:

root@kitploit:~
return &FileQuery{
    stopCh: make(chan struct{}, 1),
    path:   s,
}, nil

Então, a busca posterior da dependência lia esse caminho novamente:

root@kitploit:~
data, err := os.ReadFile(d.path)

Essa é a vulnerabilidade completa.

O código verificava uma resolução do sistema de arquivos e, depois, usava outra.

Por que isso é explorável

Porque um symlink é mutável.

O atacante não precisa fazer um alvo fora do sandbox passar pelo pathInSandbox() diretamente.

O atacante só precisa mudar para onde o caminho bruto já aprovado resolve, após a validação, mas antes que o Fetch() realize a leitura.

A sequência é:

  • o link resolve para um arquivo seguro durante o pathInSandbox()
  • a validação é bem-sucedida
  • o FileQuery registra o caminho bruto do link
  • o link é substituído ou redirecionado para um arquivo externo
  • o os.ReadFile(d.path) resolve o link novamente
  • o arquivo externo é lido
  • o valor buscado é armazenado em cache no cérebro do template
  • o link é restaurado antes da próxima avaliação do template
  • a validação é bem-sucedida novamente
  • o conteúdo externo em cache é retornado e renderizado

Esse último passo é importante.

Restaurar o link seguro não removia o segredo já buscado do cache de dependências.


O Que Torna Isso um Problema de Segurança, e Não Apenas uma Corrida no Sistema de Arquivos

A distinção importante é a bypass de um controle de segurança explícito.

Isso não era meramente:

"o arquivo mudou enquanto o Consul Template o monitorava"

Monitorar arquivos em busca de alterações é um comportamento esperado.

O problema real era:

um caminho que passou pela restrição de sandbox documentada poderia, posteriormente, ser usado para ler um arquivo fora desse sandbox

Isso é uma falha direta do limite de confiança.

O aplicativo já havia tomado uma decisão de segurança:

  • este alvo está dentro do sandbox
  • portanto, é seguro registrá-lo e buscá-lo

Mas a busca posterior não estava vinculada ao alvo que justificava essa decisão.

Foi isso que transformou a mutabilidade comum do sistema de arquivos em uma vulnerabilidade.


Prova de Conceito

Construí um reprodutor independente em torno da sequência exata de avaliação e busca de dependência.

A configuração controlada usava:

  • um diretório de sandbox configurado
  • um arquivo seguro dentro desse sandbox
  • um arquivo secreto fora do sandbox
  • um caminho de symlink monitorado dentro do sandbox
  • trocas determinísticas de link em torno da busca de dependência

O fluxo de reprodução era:

  1. Apontar o symlink monitorado para o arquivo seguro dentro do sandbox.
  2. Avaliar o helper file para que a validação do sandbox seja bem-sucedida e o caminho bruto seja registrado como uma dependência.
  3. Redirecionar o symlink monitorado para o segredo externo antes da busca da dependência.
  4. Executar a busca da dependência e permitir que o os.ReadFile(d.path) leia através do link redirecionado.
  5. Armazenar o valor buscado no cache do template.
  6. Restaurar o symlink para o arquivo seguro dentro do sandbox.
  7. Avaliar o template novamente.
  8. Confirmar que a validação do sandbox ainda é bem-sucedida.
  9. Confirmar que a saída renderizada contém o segredo externo buscado anteriormente.

O comportamento observado era:

  • a validação inicial do sandbox passou
  • a dependência manteve o caminho original do link
  • a busca leu o arquivo fora do sandbox depois que o link mudou
  • o alvo seguro foi restaurado antes da próxima renderização
  • a próxima verificação do sandbox passou
  • a saída renderizada correspondeu exatamente ao segredo externo por SHA-256

Essa comparação de hash era importante.

Ela provou que o valor final renderizado não era conteúdo seguro obsoleto, um artefato de nome de arquivo ou um efeito colateral do caminho de erro.

Era o conteúdo byte a byte exato do arquivo fora do sandbox.


Por Que a PoC Foi Escolhida Dessa Forma

A prova mais forte para um problema TOCTOU deve controlar a linha do tempo.

Simplesmente mostrar que um symlink pode apontar para fora do sandbox seria mais fraco, porque o pathInSandbox() já rejeitava um alvo externo quando o observava.

A alegação de segurança dependia de provar todos esses estados em ordem:

  • seguro no momento da validação
  • inseguro no momento da busca
  • seguro novamente no momento da renderização
  • conteúdo externo ainda consumido do cache

Foi por isso que o reprodutor separou explicitamente a validação do template, a busca da dependência, a restauração do link e a próxima renderização.

A PoC não dependia de timing aleatório ou de tentativas repetidas.

Ela conduziu o ciclo de vida vulnerável de forma determinística.

Isso tornou a causa raiz e o impacto muito mais fáceis de defender.


Requisitos de Exploração e Escopo

Este problema exige influência local sobre o sistema de arquivos.

Um atacante precisa de acesso suficiente para criar, substituir ou redirecionar o symlink relevante ou um caminho vinculado equivalente durante a janela vulnerável.

O processo do Consul Template também deve:

  • ter permissão para ler o alvo externo
  • avaliar um template usando o caminho influenciado pelo atacante
  • expor o resultado renderizado em algum lugar onde o atacante possa recuperá-lo ou influenciar seu uso

Esses requisitos são importantes.

Isso não era uma leitura arbitrária de arquivo remota não autenticada em qualquer implantação padrão.

Mas, dentro do modelo de confiança local afetado, o impacto era significativo:

  • bypass da restrição documentada do sandbox_path
  • divulgação de arquivos locais fora do sandbox
  • possível exposição de segredos legíveis pelo processo do Consul Template

O risco aumenta quando o processo é executado com acesso a credenciais sensíveis, configuração de serviços, tokens ou chaves privadas.


Severidade e Classificação

A HashiCorp classificou o problema como:

  • CWE-59: Resolução Incorreta de Link Antes do Acesso ao Arquivo
  • CVSS 3.1:
root@kitploit:~
CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:N/A:N

A pontuação base publicada é:

root@kitploit:~
4.7 / Medium

Essa pontuação reflete as restrições reais:

  • vetor de ataque local
  • baixos privilégios exigidos para influenciar o caminho
  • alta complexidade de ataque porque o link deve mudar durante a janela relevante do ciclo de vida
  • nenhuma interação da vítima exigida
  • alto impacto de confidencialidade se um arquivo sensível legível pelo processo for buscado

Essa é uma classificação razoável.

O problema é restrito em pré-requisitos do atacante, mas a bypass do sandbox e a divulgação de arquivo resultante são ambas concretas.


Versões Afetadas

O boletim da HashiCorp lista:

root@kitploit:~
Affected: consul-template up to 0.41.4
Fixed:    consul-template 0.42.0

A correção foi lançada na versão 0.42.0 em 15 de abril de 2026.


Análise da Correção

A correção foi pequena e abordou diretamente o vínculo quebrado.

Em vez de validar o alvo resolvido e depois construir a dependência a partir da entrada bruta, o código corrigido retorna o caminho resolvido e entrega esse caminho ao NewFileQuery():

root@kitploit:~
resolvedPath, err := resolveSandboxedPath(
    sandboxPath,
    strings.TrimSpace(s),
)
if err != nil {
    return "", err
}

d, err := dep.NewFileQuery(resolvedPath)

A propriedade de segurança mudou de:

  • validar o alvo resolvido
  • descartar o alvo resolvido
  • buscar através do caminho bruto posteriormente

para:

  • validar o alvo resolvido
  • reter o alvo resolvido
  • buscar através desse caminho validado

Isso encerra o caminho de redirecionamento de symlink relatado, porque alterar o link original não muda mais o caminho armazenado pela dependência.

O patch também adicionou um teste de regressão focado cobrindo a sequência exata:

  • symlink seguro durante a validação
  • symlink externo durante a busca
  • symlink seguro restaurado antes da próxima chamada
  • o segredo externo em cache não deve ser retornado

Esse é o tipo de remediação que você deseja para esse bug:

  • corrigir o vínculo quebrado de validação/uso
  • preservar o comportamento do sandbox
  • adicionar um teste de regressão para o ciclo de vida completo da corrida

Divulgação

Informei este problema de forma privada à HashiCorp Security em 20 de março de 2026.

O relatório incluía:

  • análise da causa raiz em nível de código-fonte
  • a sequência TOCTOU de validação para busca
  • um reprodutor determinístico independente
  • saída em tempo de execução
  • evidência SHA-256 mostrando que os dados renderizados correspondiam ao segredo externo
  • detalhes da revisão afetada

A HashiCorp corrigiu o problema na versão 0.42.0 e publicou o HCSEC-2026-12 em 12 de maio de 2026.

A IBM publicou um boletim de segurança correspondente para o mesmo CVE.

Ambos os boletins oficiais creditaram o relatório a:

Mohamed Abdelaal (0xmrma)


O Que Este Bug Realmente Ensina

A lição principal é simples:

validar um caminho não é suficiente se a operação de arquivo posterior puder resolver esse caminho para um objeto diferente

Essa regra se aplica muito além do Consul Template.

Isso importa em qualquer lugar onde o código faça:

  • verificações de sandbox
  • verificações de destino de upload
  • extração de arquivos
  • leituras de segredos locais
  • manipulação de arquivos temporários
  • operações de arquivo com separação de privilégios

A propriedade de segurança mais profunda não é:

"a string do caminho pareceu segura uma vez"

É:

o objeto usado pela operação sensível deve ser o objeto que passou pela validação

Neste caso, o Consul Template validou uma resolução e buscou outra.

Essa lacuna foi suficiente.


Pontos-Chave

  • o sandbox_path era um limite de segurança explícito para arquivos locais
  • o pathInSandbox() resolvia e validava o alvo do symlink corretamente
  • o alvo resolvido era descartado após a validação
  • o FileQuery mantinha o caminho original influenciado pelo atacante
  • a busca da dependência resolvia esse caminho novamente mais tarde através do os.ReadFile
  • restaurar o link seguro não removia o conteúdo externo já armazenado em cache
  • a PoC provou a divulgação byte a byte exata fora do sandbox com SHA-256
  • a versão 0.42.0 corrigiu o bug vinculando a dependência ao caminho resolvido e validado

Considerações Finais

Esta vulnerabilidade não era sobre contornar uma verificação de prefixo de string.

Era sobre tempo e identidade.

O Consul Template verificava para onde o link apontava durante a avaliação do template.
A busca da dependência fazia a mesma pergunta ao sistema de arquivos novamente, mais tarde.
Um atacante podia mudar a resposta entre esses dois momentos.

Foi por isso que este problema se tornou o CVE-2026-5061.

Corrigido no consul-template 0.42.0.

Baixar ferramenta