2009-04-23 12 views
11

sto cercando di afferrare una migliore comprensione di Thompson Trojan Compiler (discusso nel suo 1984 ACM Turing Award discorso "Reflections On Trusting Trust"), e finora questo è come lo capisco:di Thompson Trojan Compiler

"L'originale il programma di login per Unix accetterebbe qualsiasi login e password a cui la root lo ha istruito, accetterebbe solo una determinata password, nota solo all'uomo che ha scritto il sistema, in modo che possa accedere al sistema come root. "

È questo il concetto giusto? Non sono sicuro al 100% se capisco l'intero concetto.

Se qualcuno potesse renderlo più chiaro, sarebbe d'aiuto.

(Vedi anche Bruce Schneier Countering "Trusting Trust")

+0

Probabilmente si dovrebbe collegare alla pagina ACM per On Trust Trust, no? – dmckee

risposta

15

Il programma login originale accetta corrispondenti coppie di nome e la password da un file.

La modifica consiste nell'aggiungere una password super potente, compilata nel programma di accesso, che consente l'accesso come utente root. Al fine di garantire che questo codice non sia visibile durante la lettura del programma di accesso, c'è una modifica al compilatore per riconoscere questa sezione del programma di login, è la sua forma originale e compilarla nella superpotente password binaria. Quindi, per nascondere l'esistenza di questo codice nel compilatore, è necessario che ci sia un'altra modifica al compilatore che riconosca la sezione del compilatore a cui è stata aggiunta la prima modifica e che emette il modulo modificato.

Una volta che il codice del compilatore è stato modificato, è possibile compilare il compilatore e installarlo nella posizione standard, quindi ripristinare il codice sorgente sia per il programma di accesso che per il compilatore nella loro forma non modificata. Il compilatore compilato installato prenderà quindi il programma di accesso invariato e emetterà il modulo non sicuro. Allo stesso modo, il compilatore installato compilerà il codice sorgente del compilatore non modificato nella variante subdola. Chiunque ispeziona il codice sorgente per entrambi sarà d'accordo sul fatto che non c'è nulla di insolito in essi.

Ovviamente, funziona solo fino a quando il codice sorgente per entrambi i programmi si evolve abbastanza lontano che il compilatore modificato non lo riconosce più. Poiché il codice sorgente del compilatore modificato non è più presente, non può essere mantenuto e (supponendo che il compilatore e il login continuino a evolversi) alla fine smetterà di produrre l'output non sicuro.

2

Sì, è il concetto giusto. C'è dell'altro; il compilatore modificato deve anche compilare il sorgente del compilatore non modificato con una copia modificata di se stesso. Questo include piccole variazioni di quella sorgente, che fondamentalmente significa che il compilatore modificato deve essere in grado di risolvere ad es. il problema dell'arresto.

+1

Questo è ... divertente, in modo disturbato. Sostiene qualcosa di impossibile, ma è accettato come la risposta corretta. Ciò sembrerebbe far scomparire lo stesso Thompson, in una nuvola di fumo logico. – unwind

+0

Mi hai preso fino a quando non hai detto "problema di interruzione". – Alex