- Introdução a uma técnica de ataque que usa caracteres de retorno de carro dentro de um repositório Git
- Essa vulnerabilidade cria a possibilidade de execução remota de código (RCE)
- Comandos maliciosos podem ser executados durante um processo específico de
git clone
- Impacto confirmado em ambientes Linux e Windows
- Destaca os riscos de um gerenciamento inseguro de repositórios Git
Caracteres de retorno de carro e vulnerabilidade no Git
- É possível criar, dentro de um repositório Git, nomes de arquivo que contenham caracteres de retorno de carro (
\r)
- Ao clonar com
git clone um repositório que contenha esses nomes de arquivo, o processo de interpretação de comandos pode levar à execução não intencional de comandos
Cenário de execução remota de código (RCE)
- O atacante adiciona e faz commit em um arquivo com um caractere de retorno de carro inserido no nome
- Quando o usuário faz
git clone desse repositório, uma interpretação incorreta pelo sistema de arquivos e pelos comandos do Git pode causar o risco de execução de código não desejada
- Em especial, é possível induzir a execução automática de scripts de hook (por exemplo, código na pasta
.git/hooks)
Ambientes afetados e resposta
- Pode ocorrer no Git em vários sistemas operacionais, incluindo Linux e Windows
- Representa uma grave ameaça de segurança para desenvolvedores e empresas que gerenciam repositórios Git ou clonam repositórios externos com frequência
Recomendações de segurança
- Ao clonar repositórios Git externos não confiáveis, é necessário usar a versão mais recente e verificar o estado de segurança
- É necessário detectar nomes de arquivo com caracteres incomuns no repositório, especialmente retorno de carro, e revisá-los antes do clone
1 comentários
Comentários do Hacker News
Como resultado de tudo isso, ao fazer um clone com submódulos, ocorre o fenômeno de ler como
path = ..., mas gravar em outro caminho que não termina com^MLevanta a dúvida de como exatamente a "execução remota de código" mencionada no artigo acontece aqui, e quão grave isso é do ponto de vista de segurança
Embora ainda não tenham publicado um PoC, mencionam que é praticamente uma adaptação direta do exploit do CVE-2024-32002, e que o teste do commit que corrigiu isso também dá uma grande pista
Citação da explicação do CVE-2024-32002: ao manipular maliciosamente um repositório com submódulos e explorar um bug do Git, é possível gravar arquivos no diretório
.git/em vez da worktree do submódulo. Com isso, dá para escrever um hook que é executado imediatamente durante o clone, sem dar ao usuário sequer a chance de inspecionar o código que será de fato executadoEm resumo, é possível colocar um
git hookmalicioso no repositório; normalmentegit hooknão é instalado durantegit clone, mas este ataque torna isso possível, abrindo a possibilidade de execução do hook durante o processo de cloneMais informações sobre o novo CVE podem ser vistas aqui
post-checkoutMencionam a verdade simples, porém incômoda, de que escrita arbitrária de arquivos costuma levar a RCE na maioria dos casos
Mencionam o risco de usar arquivos de configuração escritos em uma DSL ad-hoc
Muitas vezes não existe especificação formal da sintaxe, e o verdadeiro critério de parsing fica espalhado entre implementações caseiras de serialização/desserialização
Quando as duas partes se desencontram, por exemplo, se o parser ganhou uma sintaxe nova mas o writer não foi atualizado, essas diferenças de parsing podem virar uma bomba
A lição é: é preciso ter uma única source of truth, e gerar automaticamente com base nela as partes que dependem disso
Apontam que este bug é separado da questão de source of truth
Afirmam que a DSL usada aqui (formato de arquivo ini), embora seja ad-hoc, é muito comum, familiar e bem organizada, então em geral já serve como especificação prática suficiente
Reproduziram o problema diretamente e o publicaram neste repositório
Foram imediatamente atualizar para a versão mais recente do Git, mas isso ainda não chegou ao Arch
Até sair um novo patch, pretendem evitar
pull; como pode haver problema em repositórios famosos compullautomático, temem que a atualização leve bastante tempoLevantam a dúvida se esta vulnerabilidade foi divulgada antes do patch
Ao verem a menção de que foi feita apenas uma "modificação simples" sobre um exploit existente, questionam por que o Git não usa Landlock (um recurso de sandbox de segurança exclusivo do Linux)
Sugerem que a operação
git cloneprecisaria de uma estrutura com acesso somente leitura ao diretório de config, leitura/escrita ao diretório de destino do clone e proibição de invocação de subprocessosIronizam esse momento clássico em que todo exploit sempre acaba abrindo a calculadora
Apontam o problema de que, se subprocessos forem proibidos, todos os
git hooks, comopost-checkout, deixam de funcionarseccomp, mas muitos recursos ficariam limitadosE observam também que, sem subprocessos, não seria possível usar Git via SSH
Perguntam se o próprio Homebrew é um problema, isto é, se faz clone recursivo
Encontram uma possibilidade neste código
Comentam que o próprio objetivo do Homebrew é executar código do repositório, então seria até estranho se não houvesse clone recursivo
Relembram com nostalgia uma famosa citação de Jon Postel sobre CR+LF
parsing/quoting)quoterque não faz escape de CR continua se repetindo e, mesmo após a correção, nem todo whitespace está sendo verificadogit blame, o código em questão foi escrito há 19 anos, coincidindo com o período da retrospectiva de 10 anos de BernsteinComo o Homebrew ainda não tinha a atualização para o Git 2.50.1, parece que será preciso esperar mais um pouco
brew install git --HEADCompartilham que tanto o Homebrew quanto o Debian Bookworm ainda estavam distribuindo versões vulneráveis
Refletem sobre se uma system call que lista diretórios deveria negar a existência de um arquivo caso o nome contenha caracteres de controle ASCII (bytes), tratá-lo como corrupção de disco, ou fazer outra coisa
Apontam a possibilidade de situações inesperadas, já que esses bytes podem ter outro significado na locale atual, e não se pode presumir, como no Windows, que todos os nomes de arquivo sejam UTF-16
Observam brevemente que esse problema existe porque, em sistemas do tipo Unix, nomes de arquivo (e outras strings) são apenas arrays de bytes simples