當前位置:
首頁 > 最新 > 一個惡意種子生成器是如何偷走用戶 400 萬美元的?

一個惡意種子生成器是如何偷走用戶 400 萬美元的?

關鍵時刻,第一時間送達!

近日,外媒 Ars Technica 發表了一篇文章,講述了一個惡意的種子生成器 iotaseed.io 是如何從用戶的錢包中偷走了價值大約 4 百萬美金的IOTA 的(目前已被下線)。文中提到,「該網站將種子的數據和與其相關的錢包信息存儲在一起,允許任何運行這個網站的人(或者劫持該網站的人)在錢包裝滿之後提走裡面的錢。」

這讓我感到很好奇,因此我決定分析下該騙局得逞的詳細技術過程。

尋找代碼

現在打開 iotaseed.io 網站,界面會顯示:「網站已關閉,非常抱歉。」

但幸運的是,時光機器(Wayback Machine)保存了一個歷史備份,我們可以在這裡找到它:

http://web.archive.org/web/20180103035549/https://iotaseed.io/

該網站鏈接到了一個 GitHub 資源庫,你可以在其中查看並下載代碼。為了讓訪問者從網站本身而不是從 GitHub 上下載代碼,網站還給出了一個理由:「該存儲庫可能含有新的、還未被完全測試過的代碼。」

鑒於這一信息,我猜測,這是為了讓所有代碼審核者看不到它,並讓其擁有者偷走用戶種子的代碼並不是 GitHub 存儲庫的一部分,所以只是作為插件添加到了 iotaseed.io 網站上——這就解釋了為什麼用戶被告知使用網站而不是 GitHub 存儲庫,並且這也說明了如果某人將該網站上的 JavaScript 和 GitHub 存儲庫的 JavaScript 對比,應該會有區別。

不幸地是,GitHub 存儲庫中 iotaseed.io 與 norbertvdberg/iotaseed 的鏈接從那之後被刪除了,該存儲庫的擁有者 norbertvdberg 的所有賬戶也被刪除了。雖然時光機器存檔了該 GitHub repository 的首頁,但當你嘗試查看代碼、或者下載該代碼的 ZIP 文件時,會出現一個「時光機器並未存檔該頁面」的報錯。

然而,該頁面的右上方仍然說道,該代碼被 8 個人復刻過,並且根據此 GitHub 的文章稱,當某個公共存儲庫被刪除時,其分支仍然會被保留,這意味著,這個存儲庫的副本可能還存在 GitHub 上的某個地方!

在快速搜索時光機器歸檔中某個可見的 commit 信息後,出現了如下的結果:

eggdroid/eggseed3 似乎是原始 iotaseed.io 代碼的一個分支,其中 26 條提交都是由用戶 norbertvdberg 完成的,早先的 GitHub 存儲庫用戶也是他。

現在我們已經有了網站和 GitHub JavaScript 文件,讓我們來對比它們,看看是否有不同。

分析代碼

隨後我仔細查看了 index.html,並發現了多出來一個被載入的 JavaScript 文件,它是一個通知庫,而我最初忽略了它。我下載了時光機器中的版本並將它與 GitHub 存儲庫中的版本進行 diff,然後發現了這一條明顯可疑的代碼:

看來有人對 Notifier.js 庫進行了非常仔細的修改,以隱藏一些代碼。Notifier.notify 方法已經被做了改變,從而檢查圖像參數是否包含「T」,如果包含,它就將參數的一部分解碼為 JavaScript 並對其進行評估。 另一個修改是添加了一個 Notifier.init() 方法。當頁面載入時會調用該方法,而該方法會調用 notify 方法,並通過一個圖像參數來觸發代碼。

對上面代碼使用的 data URL 運行 atob(image.split(",")[2]) 後會產生以下代碼片段(為了清晰起見,我添加了縮進和間距):

惡意代碼的第二階段會將 ./images/logo_small_bottom.png 繪製到屏幕外的 元素中,從該圖像的數據中讀出一些文本,然後將該文本評估為 JavaScript。

查看GitHub存儲庫後發現,2017 年 8 月 28 日竊賊添加了 logo_small_bottom.png,然後在同一天的 3 個小時後進行了更新。當運行這個圖像解碼器時,這兩個版本都不會生成有效的代碼。

然而,實際網站上使用的圖像,即由時光機器保存的圖像,是不同的,並且會生成以下代碼(我再次添加了縮進和間距):

這個代碼破解了Math.seedrandom函數,而這個函數被生成器代碼所使用,它會總是使用固定的種子「4782588875512803642」加上一個計數器變數,這個變數每次運行seedrandom時會增加1。 這會導致Math.random()始終返回相同的可預測的一系列數目,導致生成的IOTA錢包種子始終相同。 當你多次打開iotaseed.io 存檔時,這變得很明顯, 因為生成的種子總是相同的XZHKIPJIFZFYJJMKBVBJLQUGLLE9VUREWK9QYTITMQYPHBWWPUDSATLLUADKSEEYWXKCDHWSMBTBURCQD,即使在不同的計算機上也是如此。

有一點需要注意,用於種子RNG的數字(前面例子中的「4782588875512803642」)對於每個用戶都是不同的。 由於Wayback Machine在某個特定時間點保存了圖像的副本,因此每次在特定日期打開存檔時,種子都是相同的,上面的代碼已在1月3日發布。 但是,如果你在不同日期查看存檔,例如10月31號或者11月19號,這個數字(以及生成的種子數)則會發生變化。 這意味著./images/logo_small_bottom.png文件是由iotaseed.io伺服器實時生成的。 當創建這個PNG文件時,被破解的隨機函數中使用的數目被修改(並且可能存儲在某個地方,以便攻擊者稍後可以回來竊取IOTA),這導致網站實際上為不同的用戶生成了不同的種子。 (但是,這個伺服器端的「隨機性」似乎並不是很好,比如說它至少給一個人提供了一個已經用過的錢包。) 展示代碼如何變化的演示可在此找到。

使用官方 IOTA JavaScript庫的話,與前面提到的種子(XZHKIPJIFZFYJJMKBVBJLQUGLLE9VUREWK9QYTITMQYPHBWWPUDSATLLUADKSEEYWXKCDHWSMBTBURCQD)相對應的地址應該是PUEBLAHRQGOTIAMJHCCXXGQPXDQJS9BDFSCDSMINAYJNSILCCISDVY99GMKAEIAICYQUXMIYTNQCJYVDX,並且根據這個網站判斷,這將是一個空的錢包。 然而,其它顯示某個地址的交易歷史信息的網站只給出了一個404錯誤(例如,見此處),這表明要麼我錯誤解碼了這個地址,要麼我誤解了IOTA網路的工作原理。

結論

這是一個非常聰明且隱蔽的後門,顯然它的意圖是惡意的,而不是在密碼實現方面的某種錯誤。 目前還不清楚這個代碼是由GitHub存儲庫和網站的所有者norbertvdberg添加的,還是norbertvdberg的託管帳戶被黑客入侵。但從所有者的反應即他們刪除了GitHub、Reddit和Quora賬戶來看,似乎這個網站是特意為偷竊的意圖而設立的。

竊取者採取了許多步驟來隱藏後門,並且快速查看Web瀏覽器中的開發人員工具不會顯示任何可疑內容。 例如,第一階段中使用的data:url以iVBORw0KGgo開頭,這是基於64位的有效的PNG頭部的開頭,這意味著該URL可能被誤以為嵌入式圖像而被忽略,因為這在通知庫中並不會非常可疑。 部分JavaScript是從一個圖像中被載入的,除此之外,沒有任何其他的網路請求被發出。 不幸的是,這足以欺騙許多人以至於他們認為沒有啥問題。

如果你仔細查看Developer Tools中的網路請求,可以看到JavaScript針對圖像發出的請求。

總之,這次被盜事件應該被看作一個提醒,對於加密貨幣(特別是在處理大量金錢的時候!)來說,妄想症可能反而是件好事。 你不應該依賴在線服務(如種子生成器或網路錢包)來持有你在意的任何數量的貨幣,並且你應該確保使用開放了源代碼並經過社區仔細審查和審核過的軟體。 在這個例子中,iotaseed.io確實宣稱它是「開放源代碼」,所有代碼都可供你審查,這可能足以說服某些人,但沒人意識到竊取者是如何修改其實際網站上的代碼的。 如果人們仔細地審核可能會發現這一後門。這個例子說明表面上而非徹底實行「開放源代碼」(特別是在加密貨幣領域)將導致災難性的結果。

鏈接:https://thatoddmailbox.github.io/2018/01/28/iotaseed.html

譯者:張斌

責編:言則


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 CSDN 的精彩文章:

矽谷再不是程序員們的夢想天堂了
Google 已經能用 AI 來預測你的航班是否延誤了!

TAG:CSDN |