Não há como verificar se um pacote binário faz o que a fonte diz que deve fazer (é um problema insolúvel tanto na teoria quanto na prática). No entanto, se você souber como o pacote binário foi produzido, poderá ter certeza de que ele foi o resultado da compilação do código-fonte. Isso requer confiança:
- as ferramentas de compilação (não apenas compiladores como tal, mas também todas as outras ferramentas envolvidas no processo de compilação, como
make
,tar
, etc.): você precisa confiam que fizeram seu trabalho corretamente ; - a (s) máquina (s) na (s) qual (is) a compilação ocorreu (você precisa confiar que eles executaram as ferramentas de compilação como pretendido);
- a cadeia de distribuição da máquina na qual a compilação ocorreu para a máquina em que você usa o pacote.
Grandes distribuições constroem pacotes binários em infraestruturas rigidamente controladas (apenas alguns administradores têm acesso a essas máquinas), usando compiladores que vêm da própria distribuição (portanto, contanto que nenhum compilador tenha bugs ou backdoors e nenhuma compilação de compilador de uma máquina comprometida é usado, nenhum problema irá aparecer). Quando o pacote é construído, a mesma máquina (ou uma máquina rodando na mesma infraestrutura rigidamente controlada) a assina criptograficamente. A assinatura criptográfica garante que os pacotes que são instalados nas máquinas do usuário final sejam exatamente os pacotes que foram produzidos na infraestrutura de construção. Todas as principais ferramentas de gerenciamento de pacotes (apt, yum, dnf, etc.) verificam assinaturas de pacotes.
Assim, a própria distribuição não verifica (1) (não pode), e garante (2) ao invés de verificar, mas a distribuição verifica (3).
A Reproducible cria ajuda com (2): eles fornecem uma verificação independente de que a compilação aconteceu como pretendido e, portanto, protegem contra um comprometimento da infraestrutura de construção.
Esquemas para compilação independente foram propostos para (1), mas raramente são práticos: a maioria das linguagens não tem implementações independentes.