去年年底,猶他大學資料中心進行清理時,發現了一盤存檔的磁帶,其中包含 UNIXv4 作業系統的程式碼。該系統於 1973 年為 PDP-11/45 開發,此前一直被認為已遺失。 UNIXv4 延續了前一年發布的 UNIXv3 的發展,後者率先採用了 C 語言和無名管道。 UNIXv4 的一個顯著特徵是將核心從組合語言重寫為 C 語言。 UNIXv4 的核心程式碼由 Ken Thompson 編寫,驅動程式由 Dennis Ritchie 編寫。
2025年12月底,電腦歷史博物館的工作人員找到了必要的設備,並成功恢復了儲存在磁帶上的檔案。他們使用readtape工具包將磁帶上記錄的類比訊號數位化,並利用在檔案恢復過程中開發的、基於James Gosling實現的Emacs編輯器的功能來解碼檔案格式。
除了 UNIXv4 程式碼外,磁帶上還包含最早的 C 編譯器之一的原始程式碼以及 SNOBOL 語言解釋器。 UNIXv4 程式碼後來經過清理,並以適合在 PDP-11 模擬器上編譯和運行的形式發佈在 GitHub 上。 UNIXv4 程式碼共包含 61,000 行,其中 27,000 行是 C 程式碼,33,000 行是 PDP-11 組合程式碼,約 1,000 行是頭檔。

一位安全研究人員注意到 UNIXv4 自帶的「su」實用程式。該實用程式代碼不足 50 行,安裝時使用了 setuid-root 標誌,允許使用者在輸入正確密碼後以 root 權限執行 /bin/sh。其程式碼存在一個漏洞,該漏洞會導致緩衝區溢出:它會將使用者輸入的密碼複製到一個固定長度為 100 個字元的陣列中,而沒有驗證輸入的長度。
這個問題曾被93歲的道格拉斯·麥克羅伊(Douglas McIlroy)評論過。麥克羅伊是貝爾實驗室Unix早期開發團隊的成員,他提出了無名管道的概念,並創建了echo、spell、diff、sort、join和tr等實用工具。根據麥克羅伊回憶,在1988年莫里斯蠕蟲出現之前,很少有人注意到緩衝區溢位。對手動輸入的資料添加大小檢查被認為是不必要的程式碼,而溢出時崩潰則被認為是一種笨拙的無效輸入處理方式。隨著時間的推移,處理自動生成的字串時發生的溢出問題得到了修復,但對於手動輸入,當時的邏輯是“誰會想手動輸入很長的字串呢?”
來源: opennet.ru
