Git Hash Chain Malleability
Este artigo demonstra que os hashes de commits do Git são maleáveis, permitindo que atacantes gerem commits distintos com conteúdo idêntico, assinaturas válidas e selos "Verified" ao explorar a inversão algébrica em ECDSA, a inserção de subpacotes OpenPGP não hashados e a reencodificação de comprimento DER não canônica, minando, assim, as suposições de segurança de fixação de dependências baseada em hash e de builds reproduzíveis.
Artigo original sob licença CC BY 4.0 (http://creativecommons.org/licenses/by/4.0/). Esta é uma explicação gerada por IA do artigo abaixo. Não foi escrita nem endossada pelos autores. Para precisão técnica, consulte o artigo original. Ler aviso legal completo
Imagine a internet como uma biblioteca massiva e global onde cada livro, cada receita e cada manual de instruções está armazenado em um cofre digital. Para manter esta biblioteca organizada, cada item recebe um cartão de identidade único feito de um código especial. No mundo do desenvolvimento de software, este sistema é chamado de Git. Pense em um "commit" como um instantâneo de um projeto em um momento específico no tempo — como tirar uma foto de um castelo de Lego que você acabou de construir. Para garantir que ninguém se aproxime e troque um tijolo por um de plástico, os desenvolvedores podem "assinar" suas fotos com um selo digital, como um sinete de cera em uma carta. Este selo prova: "Sim, eu construí isto, e ninguém o alterou".
A grande ideia por trás deste sistema é a confiança através da unicidade. Se você tiver o código de identificação único da foto, deve ser capaz de encontrar essa exata foto e saber que ela não foi alterada. É como dizer: "Se o cartão de identidade diz 'Castelo A', então 'Castelo A' é a única coisa no mundo que se encaixa nessa descrição". Esta confiança é tão forte que os computadores usam esses códigos de ID para verificar automaticamente se um software é seguro, para travar versões específicas de código para que não quebrem e para provar exatamente quem construiu o quê. Se o código de ID for único e imutável, todo o sistema funciona como uma máquina bem lubrificada. Mas o que acontece se alguém puder pegar uma foto perfeitamente boa e assinada, mudar o sinete de cera apenas um pouquinho e obter um novo cartão de ID que ainda prova que a foto é real? Essa é a pergunta que este artigo faz.
A Grande Troca de Identidade Digital
Neste artigo, um pesquisador chamado Jacob Ginesin descobriu um truque sorrateiro que quebra a regra "uma foto, um ID" no Git. Ele mostrou que um atacante, sem precisar roubar as chaves de assinatura secretas ou quebrar a matemática por trás dos selos digitais, pode criar um segundo cartão de identidade, totalmente diferente, para a exata mesma peça de software.
Aqui está o truque de mágica: o atacante pega um commit assinado (uma foto com um sinete de cera) e altera o sinete de uma forma que parece diferente para um computador, mas significa exatamente a mesma coisa para um humano. É como pegar um sinete de cera, pressioná-lo em um formato ligeiramente diferente, ou escrever a mesma mensagem em um pedaço de papel, mas usando uma fonte diferente. O conteúdo da foto não mudou nada — o castelo de Lego é idêntico. O selo ainda prova a identidade do autor. Mas porque o "visual" do selo mudou, o computador gera um cartão de ID completamente novo para ele.
A parte assustadora? Os sistemas de computador que verificam esses IDs (como o GitHub) dizem: "Ei, este selão é válido! Este é um commit verificado!" e dão a ele um selo verde brilhante de "Verificado". Agora, você tem dois cartões de ID diferentes para o exato mesmo castelo de Lego. Um diz "Castelo A" e o outro diz "Castelo B". Ambos são assinados pela mesma pessoa e ambos estão marcados como "Verificados".
As Três Maneiras de Enganar o Sistema
O artigo explica três maneiras diferentes de realizar este truque, dependendo de que tipo de selo digital está sendo usado:
- A Virada Matemática (para ECDSA): Imagine uma linha numérica onde você tem um número, digamos 5. Neste jogo matemático específico, o número 5 e o número "Total menos 5" são, na verdade, a mesma coisa. O atacante apenas inverte o número no selo. Parece diferente, mas a matemática diz que ainda é uma assinatura válida.
- A Nota Escondida (para RSA e EdDSA): Imagine uma carta selada. O selo cobre a mensagem principal, mas há um pequeno bolso no verso que não está selado. O atacante desliza uma pequena nota inofensiva para dentro desse bolso. A mensagem principal permanece intacta e o selo ainda é válido, mas a carta agora tem um peso e formato ligeiramente diferentes, o que altera o cartão de ID.
- A Fonte Elegante (para S/MIME): Imagine escrever um número como "32". Você pode escrever "32" ou "0x20". Ambos significam a mesma coisa, mas um é a forma "padrão" e o outro é uma forma "elegante". O atacante reescreve o número da forma elegante. O computador que verifica a carta (GitHub) é um pouco permissivo e aceita a fonte elegante, mas um computador mais rigoroso (seu laptop local) pode ficar confuso e dizer: "Espere, essa não é a maneira padrão!".
Por Que Isso Importa: O Problema do "Fantasma"
Você pode pensar: "E daí? Se o castelo é o mesmo, quem se importa se o cartão de ID é diferente?" Mas no mundo digital, o cartão de ID é o castelo.
- O Problema do Segurança: Imagine um segurança de uma boate que tem uma lista de IDs banidos. Se você é banido, não pode entrar. Mas se o atacante cria um "ID Fantasma" para a mesma pessoa que não está na lista de banidos, o segurança deixa você entrar. O atacante pode passar código malicioso pelos filtros de segurança apenas mudando o cartão de ID.
- O Problema do Espelho: Imagine dois espelhos frente a frente. Um mostra o castelo real; o outro mostra um "Castelo Fantasma" que é idêntico, mas tem um nome diferente. Se você estiver olhando para o espelho errado, pode pensar que está vendo o original, mas está vendo uma cópia que o atacante controla.
- A Corrente Quebrada: Como cada novo castelo de Lego em uma corrente é construído sobre o anterior, mudar o ID de um castelo altera o ID de todos os castelos construídos depois dele. Isso cria uma "bifurcação" na história. Você acaba com duas linhas do tempo paralelas: uma com o ID original e outra com o ID fantasma. Ambas parecem reais, ambas são assinadas, mas são diferentes.
O Veredicto
O artigo prova que o selo de "Verificado" em um hash de commit não é uma garantia única de conteúdo. É como ter um carimbo de "Verificado" em um passaporte que não garante que você é a única pessoa com aquele rosto; apenas garante que o carimbo é real.
O autor construiu uma ferramenta que pode fazer este truque automaticamente para qualquer commit assinado. Eles testaram no GitHub, e o site aceitou alegremente os commits "Fantasma", dando-lhes seus próprios selos de "Verificado". Isso significa que sistemas que dependem desses cartões de ID para bloquear maus atores, travar versões de software ou provar quem construiu o quê, estão vulneráveis. A solução não é parar de assinar; é garantir que os computadores que verificam os selos sejam rigorosos o suficiente para dizer: "Não, esse não é o exato mesmo selo que vimos antes", e para verificar o conteúdo real, não apenas o cartão de ID.
Em resumo: um commit assinado é uma promessa, mas o artigo mostra que a promessa pode ser escrita de uma forma que cria uma versão "fantasma" de si mesma, enganando os sistemas que deveriam nos manter seguros.
Afogado em artigos na sua área?
Receba digests diários dos artigos mais recentes que correspondam às suas palavras-chave de pesquisa — com resumos técnicos, no seu idioma.