491 / 736REPRO

Reproducible Firmware Build

Compilação reproduzível de firmware

Ao atualizar uma carteira física (Hardware Wallet), instala um ficheiro já preparado. Mas como saber se ele veio realmente do código publicado pelo fabricante? Um Reproducible Firmware Build permite que outra pessoa compile o mesmo software de forma independente e compare os resultados. Ajuda assim a verificar o percurso entre o código público e a atualização distribuída.

Firmware é o software que controla um dispositivo, como uma Hardware Wallet. A sua compilação é reproduzível quando o mesmo código-fonte, o ambiente definido e as instruções geram ficheiros previamente especificados e exatamente iguais. Não basta o programa funcionar da mesma forma: comparam-se os próprios dados. Numa publicação assinada, também é necessário definir como se trata a assinatura.

O fabricante pode publicar código que um programador consegue ler. Contudo, o que normalmente se instala na carteira é um ficheiro terminado em formato de máquina, chamado binário. A compilação liga estas duas formas. Uma pessoa independente pode repeti-la e comparar o resultado com a publicação. Procura bytes idênticos, ou seja, as mesmas unidades de dados, frequentemente através de um hash criptográfico: uma impressão calculada a partir do conteúdo. A verificação abrange resultados definidos, como o ficheiro de firmware, e não automaticamente todos os ficheiros de trabalho e registos. [1] [4]

Imagine dois programadores a verificar uma atualização. O nome do projeto não chega: precisam do mesmo commit, isto é, uma revisão exata do código. Também precisam das versões das bibliotecas usadas e do compilador, a ferramenta que converte o código para formato de máquina. As suas opções, as definições relevantes do ambiente e o modelo da carteira fazem igualmente parte do procedimento. Estes dados devem ser definidos antecipadamente ou registados durante a compilação. Caso contrário, ambos podem trabalhar corretamente e obter resultados diferentes. [1] [2]

Uma diferença não significa necessariamente que alguém alterou o funcionamento do programa. O compilador pode incluir o caminho da pasta de trabalho na informação usada para investigar erros. Se cada programador guardar o projeto num local diferente, os ficheiros podem diferir. Um caminho prescrito ou uma forma suportada de uniformizar os caminhos pode resolver o problema. Essa regra tem de ser uma parte conhecida do procedimento. Apagar diferenças inexplicadas depois de uma verificação falhada, apenas para obter uma correspondência, retira sentido à verificação. [3]

Uma assinatura digital permite verificar se um ficheiro corresponde a uma assinatura criada com a chave relevante. Associar essa chave ao fabricante é outra parte da confiança envolvida. A compilação reproduzível responde a uma pergunta diferente: corresponde o ficheiro ao código-fonte definido? As duas verificações complementam-se. Porém, a atualização oficial pode conter dados de assinatura ausentes da compilação local. Comparar os ficheiros completos sem conhecer o formato pode, por isso, revelar uma diferença mesmo quando o programa foi compilado corretamente. [5]

A documentação Trezor descreve a seleção da versão e do modelo, a compilação do firmware e a comparação com o ficheiro oficial. Como o resultado local não está assinado da mesma forma que a publicação do fabricante, o procedimento começa por colocar a zero campos de assinatura rigorosamente definidos. Os formatos antigos também diferem nos cabeçalhos, as partes iniciais dos ficheiros com informações sobre eles. A estrutura depende do modelo e da versão: não se pode aplicar a outro dispositivo uma instrução sem primeiro verificar a sua adequação. A assinatura original verifica-se separadamente; comparar cópias ajustadas não substitui esse controlo. [5]

Primeiro é necessário confirmar que foram comparados a mesma revisão, o mesmo modelo e a mesma variante de firmware. Seguem-se as ferramentas, bibliotecas e transformações prescritas para o ficheiro. Os originais e o registo das diferenças devem ser preservados. A causa pode ser um erro do ambiente ou das instruções, mas também uma alteração do programa distribuído. A divergência, por si só, não identifica responsáveis nem causas. Até ser explicada e a verificação repetida, não se deve declarar a compilação verificada. [1] [4]

Se o código publicado já tiver um erro, cada nova compilação pode reproduzi-lo fielmente. Um compilador comum não fiável também pode inserir a mesma alteração maliciosa em todos os resultados; voltar a usá-lo não equivale a verificá-lo de forma independente. Componentes binários fechados limitam o que pode ser reconstruído a partir do código disponível. E um ficheiro coincidente no computador não prova que uma carteira concreta é autêntica ou executa aquele firmware. Verificar a origem do ficheiro é uma parte importante da segurança, não uma prova completa. [6] [1]

Um relatório que diz «verificado» torna-se útil quando identifica quem fez a verificação, que revisão compilou, para que modelo e segundo que procedimento. Deve indicar os ficheiros comparados, a função de hash, os resultados e o tratamento exato dos dados de assinatura. Outras pessoas podem então examinar ou repetir o trabalho. Mais compilações independentes reduzem a dependência de um único distribuidor. Continua a ser necessário analisar o código, o processo de atualização e o próprio dispositivo. [2] [4]

Exemplo · REPRO

Dois resultados iguais e um hash diferente

Dois programadores compilam firmware da mesma revisão para o mesmo modelo e no mesmo ambiente. Os hashes SHA-256 dos seus ficheiros coincidem, mas a versão oficial assinada tem outro. Se a documentação definir rigorosamente os campos de assinatura, aplicam a transformação prescrita a cópias e voltam a comparar. A correspondência abrange então esse conteúdo definido. A assinatura original continua a precisar de verificação própria; outras diferenças inexplicadas não podem ser simplesmente removidas.

Para ter uma visão mais completa, leia este verbete junto com Hardware Wallet, Private Key, Cold Storage, Secure Element. Também há referências a este verbete em COLDCARD RNG Incident (2026).

01Tenho de compilar pessoalmente o firmware?

Não precisa de ser programador para compreender o resultado. Confirme, contudo, se o relatório independente identifica a versão, o modelo e os ficheiros comparados. Um hash igual não prova a ausência de erros: o mesmo código malicioso ou compilador pode produzir ficheiros iguais. Analisar o código e decidir se se confia no dispositivo continuam a ser questões distintas.

02Um hash diferente numa atualização assinada significa um ataque?

Não automaticamente. O ficheiro pode conter dados de assinatura ou cabeçalhos diferentes que o procedimento já prevê. É necessário verificar a versão, o modelo e as instruções exatas. Uma diferença inexplicada não é, porém, uma verificação bem-sucedida e não pode ser contornada apagando dados arbitrariamente.

DOC · 001Reproducible Builds — DefinitionDocumentação DOC · 002Reproducible Builds — Recording the environmentDocumentação DOC · 003Reproducible Builds — Build pathsDocumentação DOC · 004Reproducible Builds — Build infrastructure threatsDocumentação DOC · 005Trezor — Reproducible build verificationDocumentação DOC · 006Wheeler — Countering Trusting TrustFonte primária
Revisto em: Fontes em primeiro lugar · Não é recomendação de investimento