上周,以太坊網(wǎng)絡(luò)上的一個去中心化交易所EtherDelta遭遇了安全漏洞威脅,影響了用戶的代幣。與過去集中式交易所的一些安全漏洞相比,這種損害相對較小,但這似乎仍然是討論分散式應(yīng)用程序(尤其是分散式交易所)安全性的好機會。
發(fā)生了什么事?
在寫這篇文章的時候,很多關(guān)于這次入侵的細節(jié)還不清楚。我們所知道的是,一名黑客成功劫持了EtherDelta.com的DNS,并將其路由到一個看上去和行為都與EtherDelta類似的惡意網(wǎng)站。然后該網(wǎng)站就能夠從EtherDelta用戶那里竊取資金,這些用戶在網(wǎng)站受到攻擊時訪問了該網(wǎng)站。
到底是哪里出了錯?
DNS劫持并不是分散服務(wù)獨有的問題。目前尚不清楚劫持事件是否可能是由于EtherDelta方面的管理不善,或者問題可能源于其注冊商。很明顯,EtherDelta.com在一段時間內(nèi)指向的是一個惡意服務(wù)器。
一旦黑客控制了EtherDelta.com,他們就可以通過幾種方式利用訪問該網(wǎng)站的用戶。
In-Dapp錢包
黑客可能利用的東西之一是EtherDelta的dapp內(nèi)錢包。EtherDelta有一個功能,不使用MetaMask或以太坊瀏覽器的用戶可以在EtherDelta內(nèi)創(chuàng)建錢包。EtherDelta將生成一個私鑰,鼓勵用戶保存該密鑰的備份,并允許用戶從完全存在于EtherDelta中的錢包進行發(fā)送、接收和交易。對于不想安裝插件或使用特殊瀏覽器的用戶來說,這很方便,對于不知道如何安裝瀏覽器插件或不想安裝瀏覽器插件的用戶,這可以簡化用戶體驗。
In-Dapp錢包使用HTML5 localStorage存儲在用戶的瀏覽器中,這是現(xiàn)代瀏覽器的一個特性,允許網(wǎng)站將信息保存在用戶的瀏覽器中,以便JavaScript應(yīng)用程序?qū)碓L問。與cookie存儲信息以備將來使用不同的是,localStorage不會通過HTTP請求發(fā)送到遠程服務(wù)器,只對應(yīng)用程序可用;這對于私有密匙之類的敏感信息非常方便,您不希望遠程服務(wù)器擁有這些密匙。此外,localStorage只對存儲信息的域上的網(wǎng)站可用,因此當(dāng)您訪問任何其他網(wǎng)站時,EtherDelta.com存儲的私有密鑰將不可用。
不幸的是,當(dāng)黑客入侵EtherDelta.com網(wǎng)站時,他們能夠?qū)?u>JavaScript應(yīng)用程序替換為一個可能已經(jīng)從localStorage中檢索到密鑰并將其發(fā)送給黑客的應(yīng)用程序。任何使用EtherDelta的dapp私鑰并在妥協(xié)期間訪問EtherDelta.com的人,都應(yīng)假定黑客擁有這些私鑰,即使他們尚未使用。
密鑰上傳
使用Dapp內(nèi)錢包的另一個后果是,如果用戶想從多個設(shè)備(甚至同一設(shè)備上的多個瀏覽器)訪問EtherDelta,就必須導(dǎo)入自己的私鑰。任何在黑客控制EtherDelta.com時輸入私鑰的人,都應(yīng)假定這些私鑰已遭到入侵。
如何預(yù)防這種情況?
雖然Dapp內(nèi)的錢包很方便,但是以太坊這樣的瀏覽器以及MetaMask這樣的瀏覽器插件提供了更好的安全模型。使用Mist和Metamask,應(yīng)用程序永遠不會獲得您的密鑰。他們可以請求瀏覽器簽署消息或事務(wù),瀏覽器將提示用戶確認他們想要簽署此消息或發(fā)送該事務(wù)。web應(yīng)用程序?qū)@得已簽名的消息或已發(fā)送事務(wù)的哈希值,但非常重要的是,它永遠不會與私鑰接觸。
如果Dapp認為Dapp內(nèi)的錢包對于他們的用戶體驗來說是絕對必要的,那么他們可以采取一些額外的步驟來獲得更多的安全性。應(yīng)用程序可以要求用戶提供一個密碼,并用該密碼加密生成的私鑰。至少,這意味著用戶必須在密鑰被破解之前輸入密碼,而不是在密鑰登錄網(wǎng)站時就從本地存儲中被盜。
這對OpenRelay意味著什么?
雖然我們認為與EtherDelta相比,0x協(xié)議提供了一些安全優(yōu)勢,但這兩個系統(tǒng)都必須在便利性和dapp內(nèi)錢包的用戶體驗與以太坊瀏覽器或插件提供的安全性之間進行權(quán)衡。
OpenRelay的聯(lián)盟模式意味著許多不同的網(wǎng)站可能為OpenRelay提供前端。一旦我們準(zhǔn)備推出我們的聯(lián)屬計劃,我們將有一個明確定義的安全政策。我們目前正在討論是否允許分支機構(gòu)在OpenRelay中使用 dapp內(nèi)的錢包,但我們肯定會鼓勵使用像Mist和MetaMask這樣的以太坊瀏覽器。
交易合約對資產(chǎn)的控制
即使您使用的是MetaMask或Mist,而不是Dapp內(nèi)的錢包,EtherDelta也要求用戶將他們的代幣發(fā)送到EtherDelta Exchange合同。當(dāng)黑客接管EtherDelta.com時,他們可以更改代幣發(fā)送到的地址。非常精明的用戶可能已經(jīng)注意到,代幣被發(fā)送到的地址不是通常的EtherDelta合約地址,但是絕大多數(shù)用戶只會認為接受的地址是正確的并批準(zhǔn)事務(wù)。
另一個問題是,在黑客被發(fā)現(xiàn)之后的很長一段時間內(nèi),EtherDelta.com網(wǎng)站完全脫機,沒有留下任何與EtherDelta合約接口并提取它所持代幣的簡單方法。有一些關(guān)于如何通過其他方式提取資金的指南,但是對于技術(shù)水平較低的用戶來說,這些指南甚至比瀏覽器插件更難以訪問。
0 x協(xié)議
有了0x,代幣就直接從你的錢包里被交易出去。您不必為了交易而將代幣發(fā)送到合約中,只需批準(zhǔn)0x代幣傳輸即可。代幣留在您的錢包中,并且只能在您向0x交易所合約提交訂單或其他人向0x交易所合約提交數(shù)字簽名的訂單時移動。
這不是什么靈丹妙藥。有人黑了一個基于0x的中繼器可以欺騙您批準(zhǔn)傳輸?shù)剿麄兊牡刂?,而不是代幣傳輸代理的地址。但是,如果您使用無限制的津貼,則永遠不需要從相同的帳戶中兩次批準(zhǔn)相同的代幣。如果一個網(wǎng)站要求您批準(zhǔn)一個您已經(jīng)批準(zhǔn)的代幣,這是一個表明有問題的信號。
另一個問題是,當(dāng)您簽署一個0x訂單時,您簽署的消息不是很有用的信息。一個典型的簽名對話框是這樣的:
因此,您可能認為您簽署了一條消息,授權(quán)以10個代幣ABC交換5個代幣XYZ,但實際上您簽署了一條消息,授權(quán)以0.0005 XYZ交換10個ABC,但只有黑客才可贖回。0x項目組已經(jīng)贊助了EIP-712,這將為消息簽名提供更好的用戶界面,因此您可以對您正在簽署的消息有更大的確定性。
最后,如果您使用0x中繼器交易代幣,而您選擇的中繼器脫機一段時間,那么您的代幣仍然在您的錢包中。如果你想找別的地方進行交易,你可以找到一個不同的中介人,通過他們找到交易。所有0x中繼器都依賴相同的0x代幣傳輸代理,所以您甚至不必再次批準(zhǔn)傳輸。
更先進的解決方案
雖然EtherDelta是一個分散的交易所,但上周受到損害的是DNS,它是棧的一個集中組件。一些dapp將竭盡全力從它們的堆棧中提取任何集中的組件。
Dapp可以托管前端應(yīng)用IPFS或swarm,并使用eis指向前端應(yīng)用程序。這降低了犧牲集中式服務(wù)的可能性,但同時也為用戶提供了方便。現(xiàn)在很少有用戶使用支持IPFS / Swarm和ENS域解析的瀏覽器,所以如果沒有一些集中的組件,構(gòu)建一個擁有大量用戶的應(yīng)用程序是不太可行的。
即使交易所是完全分散的,也必須有人持有更新ENS記錄的鍵,但如果這些鍵被破壞,ENS記錄最終可能發(fā)送錯誤的內(nèi)容。通過使用多團體合約或更復(fù)雜的社區(qū)治理系統(tǒng)來管理ENS記錄,這可能會得到緩解,但是管理的復(fù)雜性增加了管理合約本身存在的漏洞。