C'è un modo per verificare un binario contro le fonti?

20

Sembra che non ci sia un modo pratico per verificare la piena integrità percorso di software precompilato e confezionato? Posso controllare il pacchetto scaricato da hash, ma non ho alcuna verifica se i binari compilati rappresentano davvero il codice sorgente pubblico?

Non c'è nemmeno una soluzione teorica per questo problema? Nel migliore dei casi un modo che potrebbe essere automatizzato?

Magari decompila e confronta l'output o gli hash di esso con qualcosa che il fornitore di software offre?

    
posta flori 05.07.2013 - 14:44
fonte

2 risposte

20

La Compilation è un'operazione prevalentemente a senso unico, e non è deterministica, almeno non in modo robusto.

potresti ricompilare il codice sorgente e vedere se produce lo stesso binario. Tuttavia, il binario esatto può variare a seconda di molti parametri, incluse le opzioni di compilazione e la versione esatta del compilatore utilizzato. Inoltre, alcuni compilatori incorporano alcuni "commenti" in file binari, commenti che di solito includono la versione del compilatore ma possono anche includere il "numero di build" (se tale numero è mantenuto) e, possibilmente, la data e l'ora di costruzione - in quel caso, tu non ottieni lo stesso binario, non l'ultimo byte. Se vuoi vedere se hai lo "stesso" binario, potresti quindi doverli prima rimuovere questi commenti (potrebbe essere utile il comando Unix strip ).

In senso stretto, la compilazione potrebbe essere casuale; poiché generare codice ottimale è un problema difficile, alcuni compilatori utilizzano algoritmi randomizzati che, euristicamente , sono in media buoni. Un simile compilatore potrebbe generare ogni volta un binario distinto. Poiché tale comportamento rende il debug molto più difficile, molti compilatori che si dedicano agli algoritmi euristici cercheranno comunque di essere riproducibili (cioè otterranno la loro casualità da un PRNG inizializzato con un valore specifico e configurabile).

C'è una soluzione molto più semplice: se hai il codice sorgente e puoi ricompilarlo, usa l'output di la tua ricompilazione.

Naturalmente, questo non risolve completamente il problema della fiducia; lo muove semplicemente. Durante la compilazione dalla fonte:

  • ti devi fidare che il codice sorgente non contenga backdoor;
  • devi fidarti del compilatore stesso per non giocare brutti scherzi con te.

Almeno, il codice sorgente è nominalmente leggibile dagli esseri umani (questo è il punto del codice sorgente), quindi è possibile eseguire alcune analisi del codice leggendolo (o facendolo leggere da uno specialista di cui ti fidi). Non esiste un modo noto per assicurarsi che una determinata parte di codice non contenga backdoor o vulnerabilità (altrimenti, questo significherebbe che abbiamo saputo come produrre codice privo di bug); tuttavia, è molto più difficile nascondere una backdoor nel codice sorgente che in un binario compilato.

Per quanto riguarda il compilatore, consulta questo articolo molto classico .

    
risposta data 05.07.2013 - 15:05
fonte
2

Il concetto di build riproducibili sembra offrire una soluzione a questo problema. Almeno uno teorico.

Significa che ogni esecuzione di un processo di compilazione (o compilazione) dovrebbe restituire l'output identico, dato che la sorgente di input era la stessa.

Con esso, ogni binario appena pubblicato potrebbe essere verificato da me o da altri se rappresenta realmente il codice sorgente che dichiara di rappresentare.

Tuttavia ci sono solo alcuni progetti (a febbraio 2017) che hanno implementato questo concetto nei loro processi di compilazione già (principalmente sistemi operativi). Quindi nella maggior parte dei casi questa soluzione è ancora teorica.

    
risposta data 26.02.2017 - 00:07
fonte

Leggi altre domande sui tag