安天工程師解讀CryptKeeper通用密碼事件

玄學醬發表於2017-09-25
本文講的是安天工程師解讀CryptKeeper通用密碼事件

1 事件起因

2017年1月31日,Softpedia網站釋出了一篇名為《Cryptkeeper Linux Encryption App Fails at Job, Has One Letter Skeleton Key – “P”》的文章,其中提及,CryptKeeper應用在Debian 9中存在一個BUG,會使得使用者為加密資料夾設定的密碼被替換為單個字元“p”,從而使字元“p”作為解密由其加密的資料夾的通用密碼。
文章引用了Kirill Tkhai於2017年1月26日在debian社群(bugs.debian.org)提交的Bug資訊。安天CERT為驗證此訊息的準確性,對所涉及模組的原始碼進行了分析。

2 事件驗證及分析

CryptKeeper是一款工作在Linux平臺的加密資料夾管理軟體,具有安裝、解除安裝encfs資料夾和更改資料夾密碼、建立新加密資料夾的功能,可與預設檔案管理器整合使用。CryptKeeper使用GTK庫編寫,底層對encfs模組進行了封裝,使用AES-192/256演算法對檔案進行加密。
產生問題的程式碼位於cryptkeeper/src/encfs_wrapper.cpp,在該程式碼中,作者使用了encfs的-S(Stdinpass)引數,從標準輸入讀取使用者輸入的密碼。

安天工程師解讀CryptKeeper通用密碼事件

在舊版本的encfs中,會給出兩個選項,讓使用者手動選擇一個加密的模式:

安天工程師解讀CryptKeeper通用密碼事件

CryptKeeper根據舊版本encfs的設定,在程式碼中硬編碼了”pn”選項,來模擬鍵盤輸入,以選擇paranoia模式(具有更高的加密強度)。以模擬鍵盤輸入的方式實現加密模式選擇,顯然是不夠嚴謹的,這就為後來的“通用密碼事件”埋下了隱患。不過,由於encfs並沒有提供其它的呼叫介面,CryptKeeper也沒有更好的選擇。

安天工程師解讀CryptKeeper通用密碼事件 

而本次事件中涉及的Debian9,仍處於測試版(unstable)階段,使用了較新的encfs(1.9.1-3版)。新版本的encfs在-S引數的解析過程中不再讀取模式,而是使用預配置的標準模式,並直接從輸入中讀取密碼:

 安天工程師解讀CryptKeeper通用密碼事件

在原始碼中也可以看到對應的流程,其中useStdin這個布林變數在引數為-S的時候被設定,通過fgets讀取使用者輸入的密碼。

 安天工程師解讀CryptKeeper通用密碼事件

導致CryptKeeper出現該問題的encfs相關程式碼,為2016年9月由encfs作者於提交。

安天工程師解讀CryptKeeper通用密碼事件

在encfs的新版本中,對於模式的指定如下:

安天工程師解讀CryptKeeper通用密碼事件

而在舊版本中,模式的指定使用了不同的程式碼:

安天工程師解讀CryptKeeper通用密碼事件

在新舊版本中,對於同一個Config_Prompt模式,是否指定useStdin(-S),行為是不一致的。在新版本中,如果指定了-S並且模式為Config_Prompt的話,會使用標準模式。
因此,CryptKeeper中硬編碼的”pn”值被encfs直接看作密碼,而實際應使用的密碼被拋棄。由於-S模式關閉了輸入回顯,這個BUG並不容易發現。
而當使用者重新載入時,輸入原有密碼,就會得到如下的”密碼錯誤”提示:

安天工程師解讀CryptKeeper通用密碼事件

3 事件影響

該事件的影響範圍有限,因為:

1、 CryptKeeper的使用人數較少,作者甚至一度停止了維護;
2、 該Bug目前只出現在使用了encfs最新版本(1.9.1-3)的系統上,而此版本並未被很多發行版所採用;
3、 在事件發生後,CryptKeeper作者已從Debian 9的官方源中移除了自己的軟體,並將在修復後重新上傳該軟體。

不過,對於CryptKeeper的使用者來說,該事件的影響卻是惡性的。一方面,不知情的使用者在解除掛載後,將無法再次訪問自己的加密文件;另一方面,使用者資料在攻擊者面前毫無加密強度可言,隱私資料可以被輕鬆解密獲取。

4 關於CryptKeeper作者

CryptKeeper的作者Tom Morton預留郵箱為t-morton@blueyonder.co.uk,而blueyonder.co.uk域名的註冊單位為維珍媒體(Virgin Media)。目前, blueyonder.co.uk和virginmedia.com均指向同一頁面。Virgin Media是一家英國公司,為企業和消費者提供固定和行動電話、電視、寬頻網際網路服務。 
作者於1995年在英國布里斯托大學(University of Bristol)獲得政治學學士學位,專們研究美國政治、國際關係、政治理論和撒切爾主義。作者在維珍媒體擔任執行規劃總監(Executive Planning Director)期間,在github啟動了CryptKeeper專案,程式碼最早提交時間為2007年7月12日。目前作者在美國R/GA公司任高階副總裁(SVP Strategy)。

安天工程師解讀CryptKeeper通用密碼事件

5 總結

通過上述分析可以看出,這個自2007年起就一直以硬編碼形式存在於CryptKeeper原始碼中字元“p”,之所以在2016年成為可以破解加密資料的“通用密碼”,是因為其呼叫的encfs修改了一個引數(-S)的執行邏輯。

由於此事件給使用者造成的後果是明顯可感知的——使用者使用所設定密碼無法解密資料——我們可以初步定性這是一個Bug,而暫不傾向於認為這是一個由開發者(包括 CryptKeeper的開發者和encfs的開發者)預製的後門,也暫沒有跡象表明這是一次由攻擊者入侵開發環境造成的程式碼汙染。

這個案例再度說明了系統安全的複雜性——特別是系統安全和資料安全“連線部”的脆弱性。對於圍繞開源系統(也包括閉源軟體)構建的開發環境的環境安全、過程安全,以及更廣泛的供應鏈安全,我們還需擦亮雙眼。

原文釋出時間為:2017年2月7日
本文作者:安天
本文來自雲棲社群合作伙伴嘶吼,瞭解相關資訊可以關注嘶吼網站。


相關文章