Un programma interpretato in esecuzione può dimostrare crittograficamente che è la stessa di una versione di codice sorgente pubblicata?

4

Un programma interpretato in esecuzione, ad esempio in linguaggi come python, javascript, ruby, java o php, dimostra crittograficamente che è lo stesso di una versione di codice sorgente pubblicata in un modo che non può essere alterato?

Detto in un altro modo, c'è un modo per garantire che i comandi / codice eseguiti da tale programma siano tutti e solo i comandi e il codice specificato in un repository divulgato pubblicamente?

La motivazione di questa domanda è la seguente: in un'epoca di hacker altamente sofisticati così come le pressioni delle agenzie governative per "backdoor" che consentono loro di curiosare su transazioni e scambi privati, possiamo garantire che una domanda non sia stata né stato violato o non è stata aggiunta una backdoor?

Ad esempio, considera un server che esegue un codice Python come PyBitMessage (Bitmessage / PyBitmessage su github) per la messaggistica sicura.

Oppure considera un'applicazione nodejs basata su open source come lesspass (lesspass / lesspass su github) che viene utilizzato per gestire le password e disponibile per l'uso qui ( link ).

O un programma alternativo per una crittografia di scopo simile (SpiderOak / Encryptr su github) con la sua versione scaricabile ( link ).

Esiste un modo per garantire che le versioni disponibili sui loro siti da scaricare / utilizzare / installare stiano eseguendo esattamente lo stesso codice presentato nel codice open source?

Anche se abbiamo fiducia al 100% nell'integrità delle squadre dietro applicazioni come queste, come possiamo essere certi che non sono state costrette da nessuno a modificare la versione in esecuzione / scaricabile del loro programma per creare una backdoor ad esempio ?

Grazie per il tuo aiuto in merito a questo importante problema.

Nota: poiché questa domanda riguarda programmi interpretati, la conversazione su build deterministiche o riproducibili non sembra essere applicata e sembra valsa una nuova domanda.

    
posta bmiller59 26.11.2016 - 05:03
fonte

1 risposta

2

Anche se non è possibile farlo in fase di esecuzione, è possibile verificare le applicazioni al momento del caricamento (OpenSSL conforme FIPS lo fa).

Said another way, is there a way to ensure that the commands/code executed by such a program are all and only the commands and code specified in a publicly disclosed repository?

Possibile ma non nel modo in cui immagini. Uno dei requisiti di un software affidabile è che deve essere verificabile. Può essere verificato manualmente o utilizzando l'analisi statica. Se un codice non è verificabile, non puoi davvero assicurarti che il codice che stai utilizzando sia effettivamente il codice che vedi in un repository.

Quando una libreria viene caricata nella memoria, è possibile eseguire la sua firma con una firma nota della libreria e assicurarsi che la libreria che viene caricata sia effettivamente quella che si ottiene da un repository.

Come verifichiamo?
Bene, c'è stato un momento in cui la verifica è stata eseguita manualmente dalla revisione del codice e generando tutti i possibili casi di test, ma man mano che i sistemi crescono, questo diventa sempre più difficile. Sono disponibili diversi strumenti di analisi statica che garantiscono che un codice sorgente non abbia alcun flusso di programma possibile che causerà un errore o uno scenario imprevisto. (Coverity ha un servizio di analisi statica gratuito per progetti Open Source).
Una volta assicurato che il codice non possa essere utilizzato in modo improprio in fase di esecuzione, il nostro compito sarà quello di garantire che non venga manomesso nella nostra macchina.

Come ci assicuriamo che non venga manomesso?
Esiste un concetto di avvio sicuro . Quello che fa è che ogni volta che un modulo viene caricato, verifica la firma del modulo rispetto a un valore valido noto e se va bene, allora lascia che l'avvio continui altrimenti l'avvio non riesce. Un concetto simile è usato qui. Quando viene caricato un programma, confrontiamo l'hash del modulo caricato con un valore valido noto e assicuriamo che sia effettivamente il programma che abbiamo ricevuto.

In questo modo, assicurando che il programma non possa essere utilizzato in modo improprio in fase di esecuzione e assicurandosi che venga caricato un programma noto, otteniamo la certezza che il programma è effettivamente quello che vogliamo.

    
risposta data 26.11.2016 - 05:58
fonte

Leggi altre domande sui tag