黑客故事:如何接管Java/Clojure/Scala程式設計師的電腦

小泥鰍發表於2014-08-19

Sonatype已經對此帖做出了相應的反應,並在他們的部落格上宣告將會對所有的使用者開啟SSL連結。這變化讓Java程式的生態系統變得更加安全可靠,我為此感到非常高興。

雖說如此,但如果當你看到這個部落格,並考慮花10美元來評估你的產品是否需要這個安全性的需要時,答案是否定的。這就好比汽車公司決定花10美元來評估他們的汽車是否需要氣囊。幸運的是,現實生活中汽車公司必須安裝氣囊。

Sonatype的這次機制修改令我感到很開心,希望他們能夠繼續減少安全性與產品的衝突。對於我們開發者而已,為使用者提供最安全的最有保障的產品是我們的責任。使用者對於不能處理好產品與安全性的容忍度能有多大。

有一天,我看到我的防火牆是這麼設定的,於是我開始對我的一個Clojure專案進行入侵:

黑客故事:如何接管Java/Clojure/Scala程式設計師的電腦

然後我通過80埠在 http//repo.maven.apache.org下載了clojure.jar。這意味著我將能夠通過一個未加密的http來下載包。我一開始認為這是leiningen問題。但結果完全不是。Clojure.jar和其他許多的jar包在Java/Clojure/Scala領域都很重要,他們都會被正式的放在Sonatype提供的一個公共服務 – Maven CentralSonatype有一個機制:只有那些擁有身份標識的人才允許SSL連結。你需要通過捐給Apache基金會十美元,才能獲得身份標識和SSL連結。如果你不相信我說的話,捐贈的網頁在這,此機制在此部落格上宣告。這裡面甚至提到了中間人攻擊。

因為身份標識是針對個人或者組織分發,所以像maven或者leiningen這些工具不能繫結它。如果你使用這些工具,那麼下載java程式或者安裝它的一些依賴不會通過SSL。經過我在twitter和Sonatype的一個員工對此事進行了爭論,確認了此事。

黑客故事:如何接管Java/Clojure/Scala程式設計師的電腦

你下載的jar包會來自中間人的,並且你執行的程式碼會被惡意軟體替換過。要想阻止這類的事情發生,你需要小心的執行每一步操作,稍有不慎就會支付別人十美元。

通常什麼時候會發生這類事情?如果你曾連結過咖啡店的公共網路或者別人的無線網路,中間人就能和你通訊了。你的網路服務提供者應能夠隨意的跟你通訊,有的人這麼做是為了打廣告。或者,你也會還會遭受來自國家操縱的這類攻擊。

Dilettante

為了證明這有多麼容易,我寫了一箇中間人代理dilettante,它功能是攔截來自於maven central的JAR包然後再注入惡意程式碼進去。

通過dilettante來代理http的傳輸,然後給任何在maven central下載的JAR包設定後門。那個設定了後門的版本同時會保留原有的功能,但是當他們使用的這個類庫的時候,將會提示一個友好的資訊。你可以看這個視訊
或者截圖:

黑客故事:如何接管Java/Clojure/Scala程式設計師的電腦

原始碼在這

具體實現

JAR包從maven central 下載的時候,由於是通過HTTP進行傳輸的,因此中間人可以隨意的替換。JAR包是可以被標識的,但是根據我對於標準工具使用的經驗,這些標識是不會被檢查的。其他唯一的方法可以驗證一個也是通過HTTP傳輸的SHA1和。當dilettante發現有JAR來自maven central,它將會把一個擁有後門的版本來替換成原來的。然後替換後的版本將會在受害者的電腦上執行惡意的程式碼。由於SHA1僅是通過HTTP傳輸,那麼dilettante會簡單地將它所能看到的所有雜湊表替換成對應的擁有後面JAR包的雜湊表。

我用優秀的mitproxy類庫來建立我的工具。我先為代理寫一個inline script,然後又用libmproxy建立一個獨立的工具。

JAR包只是一個包含資源,類和後設資料的壓縮包。我通過新增自己的類到JAR,從而給這個JAR設定了後門。

稍微頭疼的是想辦法如何呼叫我的惡意程式碼。我知道受害者肯定會下載一些類庫。然而我需要不管使用者呼叫類庫中的哪個類,它都能執行我的程式碼,並且還不能影響以前類庫的正常使用。

Java有靜態類塊這一概念,它能在類級別進行初始化。當類載入到記憶體的時候,靜態類裡面的程式碼會只被呼叫這一次。在我把惡意的類插入到Jar包之後,我就能像下面這樣在靜態塊裡面呼叫程式碼:

為了插入上面的程式碼,我需要將它直接插入到Java class裡面,而不是source檔案。我是使用Karakatau將程式碼以Jasmin的格式插入進去。Karakatau是一個針對Python的Java 反編譯/編譯類庫。

侷限性

這只是個概念化的試驗,同時它還是存在侷限性。

1.目前由於一些原因,它還不是很快:

我必須進行反編譯和編譯。如果能夠直接插入編譯好的程式碼到類裡面,那就更高效了。

我實際上是通過使用Python的zipfile類庫將壓縮包的類檔案都建立了個副本。從空間和速度方面而言,這是不高效的。如果能夠更加了解zip的功能,可能會找到一個高效插入資料的方法。

2.如果使用者同時下載多個JAR包。那麼我將會逐個設定後門。惡意的程式碼在每個JAR只會被執行一次。但是如果多個jar被設定了後門,那麼它將會被執行多次。如果我們將那個貓的圖片替換成一個高質量,穩定的後門並且它能夠隻影響系統一次,那麼這個問題就不會再出現。

相關文章