A reprodutibilidade é uma propriedade da cadeia de abastecimento: as mesmas entradas declaradas devem produzir o mesmo artefacto. Para um cliente VPN, essa afirmação liga o instalador que descarregou ao código-fonte e à cadeia de ferramentas que qualquer pessoa pode reconstruir. Não diz nada sobre o serviço ao qual o cliente se liga.

A pergunta útil é, por isso, estreita e tem resposta. O projeto publica um procedimento, e o seu artefacto específico corresponde-lhe?

Onde uma compilação deixa de ser determinística

Os compiladores incorporam marcas temporais, caminhos absolutos e nomes dos anfitriões de compilação, a menos que lhes seja dito o contrário. Os arquivos registam a ordem dos ficheiros e as horas de modificação, os editores de ligações variam a saída com a versão da cadeia de ferramentas, e a compressão paralela pode reordenar blocos. Qualquer uma destas coisas faz com que duas compilações do mesmo código-fonte difiram em bytes sem que aconteça nada sinistro. O determinismo é incorporado por engenharia numa compilação, nunca é herdado por defeito.

Um projeto que afirma reprodutibilidade tem de nomear a normalização que aplica: marcas temporais fixas, caminhos mapeados, entradas de arquivo ordenadas, versões fixadas do compilador e das dependências. Sem essa lista, uma discrepância não pode ser interpretada, porque o espaço de variação legítima não está definido.

As entradas declaradas também têm de estar completas. Um URL de repositório sem etiqueta não é uma revisão, um ficheiro de bloqueio sem hash não é um conjunto de dependências, e um script de compilação que transfere uma ferramenta em tempo de execução tem uma entrada que ninguém consegue fixar. Cada lacuna torna-se mais tarde numa diferença. Complete a lista antes de comparar seja o que for, porque uma lista incompleta não pode falhar de uma forma que signifique algo.

InputHow it driftsWhat pins it
SourceBranch moves after releaseCommit hash in the build metadata
ToolchainCompiler patch level differsContainer image digest
PackagingArchive order and mtimes varyNormalised archive settings

O que a comparação verifica realmente

Uma parte independente recompila no ambiente declarado e compara a saída com o artefacto publicado. A identidade bit a bit é a forma forte; um passo de normalização documentado, em que uma diferença registada é invertida e os resultados passam então a coincidir, é a forma mais fraca mas ainda útil.

A comparação diz respeito ao binário. Uma assinatura responde a outra pergunta: associa uma versão a uma chave e uma chave a uma identidade, e um projeto pode ter assinaturas válidas sobre artefactos que ninguém recompilou. As duas verificações somam-se em vez de se substituírem.

sha256sum wireguard-installer.msi
gpg --verify wireguard-installer.msi.sig wireguard-installer.msi

Execute ambas antes de instalar e compare o hash com o publicado para a mesma versão e plataforma. Um hash que coincide com a página do fornecedor prova que a transferência chegou intacta; um binário recompilado que coincide com o hash publicado pelo fornecedor prova algo mais forte sobre a forma como foi feito.

Porque é que uma discrepância não é prova de manipulação

A maioria das discrepâncias vem de uma entrada que ninguém controlou. Uma versão de correção diferente do compilador, um caminho de compilação que escapou para os símbolos de depuração, uma localização que alterou a ordem de ordenação ou um passo de empacotamento aplicado depois da comparação produzem todos um hash diferente do trabalho honesto.

Por isso, uma discrepância tem de ser lida à luz do procedimento documentado antes de se tornar uma história. Se o procedimento fixa tudo e a diferença continua por explicar, é uma descoberta real que vale a pena levar ao projeto. Se o procedimento silencia sobre o empacotamento, a diferença pode ser inteiramente esperada.

A simetria também conta aqui: uma correspondência não prova que o código-fonte está livre de defeitos, apenas que o binário lhe corresponde. Código bem auditado e código reproduzível são propriedades diferentes, e um projeto pode ter uma sem a outra.

O que a afirmação diz sobre o serviço por trás da aplicação

O cliente é um programa no seu dispositivo; o serviço são servidores, sistemas de contas e políticas de retenção noutro lugar. A reprodutibilidade restringe o primeiro e não diz nada sobre o segundo, por muito cuidado com que o instalador seja verificado.

A configuração do ponto final também pode mudar depois da instalação, através de definições remotas ou de um perfil controlado pelo fornecedor. Essas alterações chegam pela rede e não são abrangidas por nenhum hash calculado antes da ligação.

Leia a afirmação no seu alcance real e depois verifique separadamente a pergunta adjacente: o que o fornecedor registra e sob que jurisdição responde aos pedidos. Um binário verificado e um serviço não verificado podem coexistir, e é exatamente esse o caso que uma verificação da cadeia de abastecimento foi concebida para tornar visível, não para corrigir.

Artigos relacionados