把病毒寫到區塊鏈上可以永遠不死?我們做了一個大膽的實驗

我們都知道,區塊鏈上的數據是不可篡改且永久存儲的,所以有的人將愛慕之情寫在區塊鏈上,有的人將產權寫在區塊鏈上。

設想一下,如果將惡意軟件寫在區塊鏈上,那豈不是成千上萬的礦工都成了你惡意軟件的“播種機”?

把病毒寫到區塊鏈上可以永遠不死?我們做了一個大膽的實驗

使用區塊鏈來傳播惡意軟件到底可行麼?這樣做又會存在怎樣的限制?

帶著這些問題,TowardsBlockchain 公司聯合創始人、區塊鏈高級工程師 Vaibhav Saini 做了一個大膽的實驗。讓我們去他的實驗中一探究竟。

以下為他對這個實驗的敘述。

自從我 2017 年加入區塊鏈世界以來,有一個問題一直困擾著我,那就是:

比特幣這樣的公鏈是向每一個人開放的,在區塊鏈網絡中有成千上萬個節點,它們都在向網絡中廣播消息,從黑客的角度來說,這是一個不可多得的誘人場景。那麼,從技術上來說我們可以通過感染幾個節點來撬動整個區塊鏈網絡麼?

經過幾個月的學習與思考,我熟練地掌握了區塊鏈的工作機制,也得出了這個問題的答案。

不得不說這是一個很有意思的問題,所以我將自己的思考過程凝練成這一篇文章,在文章中你將學到:

  • 為什麼惡意軟件難以感染區塊鏈?
  • 我們可以使用區塊鏈這種去中心化系統來傳播惡意軟件麼?
  • 使用星際文件系統 IPFS 和以太坊存儲網絡 Swarm 這兩個去中心化系統傳播惡意軟件的動手實例。

廢話不多說,讓我們開始吧!相信這將是一段有趣的旅程......

把病毒寫到區塊鏈上可以永遠不死?我們做了一個大膽的實驗

為什麼惡意軟件難以感染區塊鏈?

為了詳細地回答這個問題,在這裡我們將討論的範圍縮小到比特幣和以太坊這兩個公鏈上。

與其他所有區塊鏈一樣,比特幣和以太坊區塊鏈中的節點都會與其他節點通信,也會執行共識規則來驗證交易,生成區塊。

現在我們考慮一下攻擊的場景,為了在區塊鏈上傳播惡意軟件並最終感染區塊鏈,我們需要這樣做:

  • 第 1 步:在交易中發送惡意軟件。
  • 第 2 步:利用比特幣客戶端軟件中的漏洞。

看起來這兩個步驟都沒有什麼難度,但在真正實現的時候你就會發現它們都多多少少的存在著一些問題。

比如步驟1中存在的問題是,在交易中我們能發送的數據量非常小。

就拿比特幣來說,比特幣區塊的最大容量才 1MB ,平均下來每筆交易佔據的空間很小,大約只有 80 字節。

類似的,對於以太坊來說,區塊gasLimit限制了區塊的大小以及其中代碼的複雜度,換句話說,以太坊對交易的大小也有限制。

或者可以這樣說,所有的區塊鏈都是如此。

而步驟2存在的問題是,即使我們發送了惡意軟件的代碼,但讓代碼運行起來也是一個很大的問題

這是因為:

  • 交易通常都有著固定的格式。許多區塊鏈客戶端都不會接收那些格式不匹配的消息。
  • 實際上代碼的執行環境(例如以太坊虛擬機)有著很多的限制,它只允許執行區區幾種類型的指令。此外,雖說以太坊支持智能合約且擁有號稱圖靈完備的編程語言 Solidity,但以太坊虛擬機的種種限制(例如非常有限的以太坊指令集和非常有限的區塊燃料上限)讓代碼運行的環境與圖靈完備幾乎不沾邊。

而且大多數區塊鏈系統的代碼運行環境都是這樣。

此外,由於客戶端代碼往往都是開源的,因此它在落地之前通常都會經過一個非常大的開發者社區的審查,這使得我們在其中找到漏洞的可能性微乎其微。

當然了我並不是說這些客戶端不存在漏洞,只是說要是有漏洞的話,那些靠漏洞吃飯的黑客早用來執行攻擊了,能被我們撿漏的機會很少

惡人可以使用區塊鏈來傳播惡意軟件嗎?

上面說到我們很難用惡意軟件來感染區塊鏈,但這並不會阻擋我們實驗的腳步。我們退而求其次,只用區塊鏈來傳播惡意軟件可行麼?

雖說感染區塊鏈系統很困難,但就傳播惡意軟件的有效載荷(代碼和文件)而言,區塊鏈完全可以勝任。

你可能會疑惑,我們剛才說到由於交易規模的限制,在單筆交易中打包惡意軟件幾乎不可能實現,是這樣的,但是,誰說我們只能使用一筆交易來傳播惡意軟件呢?

接下來我們就用 K 元(K-ary)惡意軟件來做個實驗。

其實 K 元惡意軟件並不是什麼新鮮事物,如果你之前對惡意軟件有過了解,相信你並不會對此感到陌生(反病毒專家一定會說,你不按套路出牌)。

K 元惡意軟件自 2007 年出現以來已經感染了很多的系統。去年 4 月,黎巴嫩學者 Joanna Moubarak 發表論文詳細論述瞭如何使用區塊鏈傳播 K 元惡意軟件,接下來我會以嚴謹但不失趣味性的表述來介紹這種方法。

與傳統惡意軟件只能被裝載到一個實體中不同,K 元惡意軟件可以將有效載荷分成 K 個部分其中每一個部分看起來都像是一個正常的可執行文件,並不會產生任何入侵感染指標(indication of compromise ,IOC,計算機安全術語)。

從原理上來說,我們有兩種劃分 K 個部分的方法:

  • K 個部分按順序工作。在這種情況下,沒有必要保證惡意軟件中的這 K 個部分同時可用且同時被激活;
  • K 個部分並行工作(同時工作)。在這種情況下,惡意軟件中的這 K 個部分必須在同一時間段內可用且被激活。

當然了,具體怎麼劃分取決於我們所要執行攻擊的環境和系統。

為了使攻擊更加隱蔽,我們還可以對每個部分進行加密。不過在這種情況下,我們需要分別傳輸加密過的有效載荷和用來解密有效載荷的密鑰。

此外,如何確保執行惡意軟件時各個部分不掉鏈子呢?在執行之前,我們可以使用有效載荷的哈希值來檢驗各個部分是否都已加入到網絡中。

你可能會問,這麼做是為了什麼呢?區塊鏈能給 K 元惡意軟件的傳播帶來什麼幫助呢?

使用區塊鏈有以下優點:

  • 區塊鏈上的數據是不可篡改的,而且區塊鏈並不受任何單一實體的控制。這意味著如果我們將惡意軟件加入到區塊鏈中,他人很難將它從區塊鏈中刪除。
  • 密碼學哈希函數的使用讓惡意軟件可以便捷地驗證各組成部分的完整性。由於區塊鏈上的數據使用哈希值(基於內容尋址)而不使用存儲位置(基於位置尋址)來進行索引,這種保障交易不被篡改的機制也可以用來保障惡意軟件的各個部分不被篡改。

演示:使用IPFS和以太坊存儲網絡Swarm傳播惡意軟件

區塊鏈可以傳播惡意軟件,但具體該怎麼操作呢?接下來我們將在星際文件系統上進行演示。

這裡的惡意軟件選用鍵盤記錄器(Keylogger),首先我們使用殺毒軟件掃描檢測它,然後我們將使用星際文件系統和以太坊存儲網絡 Swarm 來存儲惡意軟件的有效載荷,並驗證殺毒軟件是否能發現各個部分中的貓膩。

我們先下載一個鍵盤記錄器,我已經將它傳到了網盤上,你可以登陸網盤下載。接下來,我們試著用殺毒軟件掃描一下。

我們可以看到殺毒軟件檢測出惡意軟件。

把病毒寫到區塊鏈上可以永遠不死?我們做了一個大膽的實驗

現在我們把惡意軟件分成 K 個部分。這裡我們需要先下載並配置星際文件系統。

安裝完成後我們使用以下命令將惡意軟件添加到星際文件系統中

 ipfs add <path-to-malware-file>

我們會得到這樣的輸出。

到這裡,我們的惡意軟件已經被分成 K 個部分並被存儲在星際文件系統中了。如上圖所示,這個惡意軟件的哈希值為:

QmNuAxMT9pepjZ26yXEk4T8qXofJrHoe7SxpoHa5WJ3T5x

如果要查看這 K 個部分,我們可以使用如下命令:

ipfs ls QmNuAxMT9pepjZ26yXEk4T8qXofJrHoe7SxpoHa5WJ3T5x

命令的輸出如下:

前面的數據是各部分文件的哈希值,我們可以用它來取出對應部分的文件。

ipfs get <hash-of-chunk>

當我們使用哈希值索引來下載某部分的文件時,我們可以完全確定這些文件沒有被篡改。

下載完成後,我們再用殺毒軟件掃描一下。這時惡意軟件各部分的文件都可以通過檢驗。

把病毒寫到區塊鏈上可以永遠不死?我們做了一個大膽的實驗

上圖表明惡意軟件的所有部分都是可用的,也就是說我們可以運行鍵盤記錄器來盜取信息了。

注意:這裡並沒有將文件永久存儲在星際文件系統中。該系統中未被固定( pinned )的內容,會被垃圾收集器( garbage collector,通常簡寫為 GC )刪除。

以太坊存儲網絡 Swarm 提供永久存儲的服務,就這點來看,它可能是一個更好的區塊鏈選擇。 而且 Swarm 的工作方式與星際文件系統類似,你可以將惡意軟件分成 K 個部分上傳然後使用其哈希值作為索引來下載它。

*免責聲明:文中演示的技術僅以技術探索與求知為目的,不建議在任何實際的公鏈中嘗試,如果這樣操作,則後果自負。

來源 | Hackernoon

編譯 | Guoxi

責編 | Aholiab

出品 | 區塊鏈大本營(blockchain_camp)

相關推薦

推薦中...