2009-04-23 62 views
11

我試圖抓住更好的理解湯普森的木馬程序編譯器(在他的1984年ACM圖靈獎的演講「Reflections On Trusting Trust」討論),到目前爲止,這是我的理解是:湯普森的木馬編譯

「原來Unix的登錄程序會接受根指示的任何登錄名和密碼,它只接受一個特定的密碼,只有編寫系統的人才知道,這可以讓他以root身份登錄系統。

這是正確的概念嗎?如果我理解了整個概念,我不是100%肯定的。

如果有人能說得更清楚,這將有所幫助。

(參見布魯斯Countering "Trusting Trust"

+0

您應該鏈接到On Trusting Trust的ACM頁面,否? – dmckee 2009-04-23 16:24:11

回答

15

原來的登錄程序接受來自一個文件匹配對名和密碼。

修改是添加一個超級強大的密碼,編譯到登錄程序中,允許root訪問。爲了確保在閱讀登錄程序時這些代碼不可見,編譯器會修改登錄程序的這一部分,即它的原始形式,並將其編譯爲超強大的密碼二進制文件。然後,爲了在編譯器中隱藏此代碼的存在,需要對編譯器進行另一個更改,以識別第一個更改添加到的編譯器部分並輸出修改後的表單。

一旦更改後的編譯器代碼存在,您可以編譯編譯器並將其安裝在標準位置,然後將登錄程序和編譯器的源代碼恢復爲未修改的形式。然後,安裝的編譯編譯器將採用不變的登錄程序並輸出不安全的表單。同樣,安裝的編譯器會將未經修改的編譯器源代碼編譯爲不正確的變體。任何人檢查任何一個的源代碼都會同意他們中沒有任何不尋常的東西。

當然,它只有在任一程序的源代碼發展得足夠遠以至於修改後的編譯器不再識別它時纔可用。由於修改後的編譯器的源代碼不再存在,因此無法維護,並且(假設編譯器和登錄名繼續發展),它最終會停止生成不安全的輸出。

2

是的,這是一個正確的概念。還有更多的東西。修改後的編譯器還必須將未修改的編譯器源編譯爲其自身的類似修改的副本。這包括該源代碼的微小變體,這基本上意味着修改後的編譯器必須能夠解決例如停止問題。

+1

這是...有趣,以一種不安的方式。它聲稱不可能,但被接受爲正確的答案。這似乎導致湯普森本人在邏輯煙霧中消失。 – unwind 2009-04-24 08:29:56