Skip to content
KitploitKITPLOIT
FerramentasBlog
Log in
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-14361 — O helper writeToFile do Consul Template abria diretamente um destino fornecido pelo operador e seguia componentes de caminho com link, permitindo que a saída renderizada escapasse do diretório pretendido e sobrescrevesse um arquivo pré-existente. | Kitploit
Ferramentas/GitHubGitHub/0xmrma/cve-2026-14361
Análise de VulnerabilidadesAnálise de CódigoExploraçãoAprendizado e Educação
GitHub0xmrma/cve-2026-14361

CVE-2026-14361

O helper writeToFile do Consul Template abria diretamente um destino fornecido pelo operador e seguia componentes de caminho com link, permitindo que a saída renderizada escapasse do diretório pretendido e sobrescrevesse um arquivo pré-existente.

Ver Repositório
5há 2 mesesAinda 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 →
Compartilhar

CVE-2026-14361

O helper writeToFile do Consul Template abria diretamente um destino fornecido pelo operador e seguia componentes de caminho vinculados, permitindo que a saída renderizada escapasse do diretório pretendido e sobrescrevesse um arquivo preexistente.

Introdução

Encontrei este problema ao revisar o HashiCorp Consul Template, com uma pergunta direta de segurança de filesystem em mente:

Se writeToFile receber um caminho que parece estar dentro do diretório pretendido, ele verifica onde o filesystem realmente gravará os dados?

Neste caso, a resposta foi não.

O helper de template writeToFile abria o caminho final fornecido pelo usuário diretamente por meio de os.Create() ou os.OpenFile().

Essas operações seguiam links simbólicos, junções de diretório e redirecionamentos equivalentes de filesystem já presentes no caminho de destino.

Isso significava que a string de caminho podia permanecer sob a raiz pretendida pelo operador enquanto a gravação real ocorria em outro lugar.

Na minha prova de conceito controlada, um diretório pai vinculado redirecionou a saída renderizada para fora da árvore pretendida e fez com que um arquivo de destino preexistente fosse sobrescrito.

Esse problema tornou-se CVE-2026-14361.

Boletim da HashiCorp: HCSEC-2026-20
Boletim da IBM: Boletim de segurança CVE-2026-14361
CVE: CVE-2026-14361
Corrigido em: 0.42.1

photo0


Cadeia de Ataque

o destino fornecido pelo operador parece estar dentro da raiz pretendida -> o atacante pré-posiciona o componente pai ou final vinculado -> writeToFile abre o caminho diretamente -> o filesystem resolve a gravação fora do diretório pretendido -> o segredo renderizado é redirecionado -> o destino preexistente pode ser sobrescrito


O Que o writeToFile Faz

O Consul Template renderiza dados de fontes como Consul e Vault.

O helper writeToFile permite que um template grave conteúdo selecionado em um arquivo local separado, aplicando um proprietário, grupo e modo de permissão solicitados.

A documentação da HashiCorp demonstra especificamente o helper com material de PKI:

private key -> writeToFile /my/path/to/cert.key
certificate authority -> writeToFile /my/path/to/cert.pem
certificate -> append to /my/path/to/cert.pem

Isso faz dele mais do que um helper de saída comum.

O conteúdo que cruza esse limite pode incluir:

  • chaves privadas
  • certificados
  • segredos obtidos do Vault
  • valores de configuração
  • credenciais de serviço

A pergunta importante não era se o writeToFile poderia criar um nome de arquivo solicitado.

A pergunta real era:

O processo grava no local de filesystem pretendido pelo operador, ou meramente em qualquer objeto para o qual o caminho resolva no momento da abertura?

Em versões vulneráveis, ele confiava na segunda opção.


Por Que Esta Superfície Merecia Atenção

Helpers de gravação são superfícies de segurança de alto valor porque fazem a transição de dados de aplicação para mutação do filesystem.

As falhas interessantes geralmente não são a travessia clássica de ../.

São falhas de resolução:

  • a string parece segura
  • a árvore de diretórios parece controlada pelo operador
  • um componente vinculado altera o destino real
  • a chamada de abertura segue esse redirecionamento automaticamente

Isso é especialmente importante quando o processo executa com mais privilégios de filesystem do que o atacante.

Um atacante local com baixos privilégios pode não conseguir sobrescrever diretamente um arquivo sensível.

Mas se ele puder influenciar um componente de caminho sob um diretório de gravação pretendido, um processo do Consul Template com mais privilégios pode realizar a gravação por ele.

Essa foi a fronteira na qual me concentrei.


A Fronteira na Qual Me Concentrei

Não abordei isso como uma revisão genérica de travessia de caminho.

O caminho fornecido não precisava de segmentos ...

Ele podia permanecer lexicalmente dentro da raiz pretendida durante todo o tempo.

A pergunta mais forte era:

Os componentes de destino vinculados são rejeitados antes que o conteúdo sensível seja gravado?

Essa pergunta importa para ambos os casos:

  • um nome de arquivo final vinculado
  • um componente de diretório vinculado que redireciona todo o caminho restante

O segundo caso é especialmente útil porque logs e configuração ainda mostram um caminho de aparência inofensiva sob o diretório esperado.

O filesystem o resolve em outro lugar.


Causa Raiz

A causa raiz era a criação direta de arquivos baseada em caminho, sem validação ciente de links.

Na revisão testada, writeToFile() selecionava um de dois caminhos de abertura.

O modo de anexação usava:

f, err = os.OpenFile(
    path,
    os.O_APPEND|os.O_WRONLY|os.O_CREATE,
    perm,
)

O modo de gravação normal usava:

dirPath := filepath.Dir(path)

if _, err := os.Stat(dirPath); err != nil {
    err := os.MkdirAll(dirPath, os.ModePerm)
    if err != nil {
        return "", err
    }
}

f, err = os.Create(path)

Nenhum dos dois caminhos rejeitava componentes de destino vinculados antes que o arquivo fosse aberto.

Isso importa porque:

  • os.Create(path) segue redirecionamentos de filesystem existentes e trunca o arquivo resolvido
  • os.OpenFile(path, ...) segue componentes de caminho vinculados durante o modo de anexação
  • um diretório vinculado altera onde o nome de arquivo final é resolvido
  • um componente final vinculado pode redirecionar a abertura para um arquivo existente diferente

A mesma suposição baseada em caminho continuava após a gravação.

Proprietário e permissões eram aplicados usando o caminho novamente:

err = os.Chown(path, uid, gid)
err = os.Chmod(path, perm)

Isso significava que as operações de metadados também estavam vinculadas a um nome de caminho mutável, em vez do descritor de arquivo já aberto.

Por que isso é explorável

Porque o atacante pode preparar o redirecionamento antes que o writeToFile execute.

Nenhuma condição de corrida (race) probabilística é necessária para o ataque básico.

A sequência é direta:

  • o operador configura um destino sob uma raiz esperada
  • o atacante obtém acesso local suficiente para criar ou substituir um componente vinculado abaixo desse local de gravação
  • a string de caminho ainda parece permanecer sob a raiz pretendida
  • writeToFile o abre diretamente
  • o sistema operacional segue o link ou a junção
  • a saída renderizada chega ao destino resolvido
  • se esse destino já existir, o modo de criação normal o trunca e sobrescreve

Essa é a vulnerabilidade por completo.


O Que Torna Isso um Problema de Segurança, e Não Apenas Comportamento Normal de Symlink

É verdade que sistemas operacionais normalmente seguem symlinks ao abrir arquivos por caminho.

Isso não torna esse comportamento de aplicação seguro.

A pergunta de segurança não é:

"O Go se comportou como documentado?"

A pergunta real é:

Um helper que grava dados sensíveis renderizados verificou se o destino resolvido correspondia ao local pretendido pelo operador?

Em versões vulneráveis, não verificou.

Essa distinção importa porque o Consul Template pode executar:

  • como um serviço de longa duração
  • com acesso a segredos derivados do Vault
  • sob uma conta com privilégios elevados
  • com acesso de gravação que o atacante local não possui diretamente

Seguir redirecionamentos de filesystem posicionados pelo atacante nesse contexto cria um problema real de privilégio e de fronteira de confiança.


Prova de Conceito

Construí um reprodutor independente em torno do comportamento exato do writeToFile no commit testado.

Baixar ferramenta