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