分散式交易所的安全性

上周,以太坊网络上的一个去中心化交易所EtherDelta遭遇了安全漏洞威胁,影响了用户的代币。与过去集中式交易所的一些安全漏洞相比,这种损害相对较小,但这似乎仍然是讨论分散式应用程序(尤其是分散式交易所)安全性的好机会。
发生了什么事?
在写这篇文章的时候,很多关于这次入侵的细节还不清楚。我们所知道的是,一名黑客成功劫持了EtherDelta.com的DNS,并将其路由到一个看上去和行为都与EtherDelta类似的恶意网站。然后该网站就能够从EtherDelta用户那里窃取资金,这些用户在网站受到攻击时访问了该网站。
到底是哪里出了错?
DNS劫持并不是分散服务独有的问题。目前尚不清楚劫持事件是否可能是由于EtherDelta方面的管理不善,或者问题可能源于其注册商。很明显,EtherDelta.com在一段时间内指向的是一个恶意服务器。
一旦黑客控制了EtherDelta.com,他们就可以通过几种方式利用访问该网站的用户。
In-Dapp钱包
黑客可能利用的东西之一是EtherDelta的dapp内钱包。EtherDelta有一个功能,不使用MetaMask或以太坊浏览器的用户可以在EtherDelta内创建钱包。EtherDelta将生成一个私钥,鼓励用户保存该密钥的备份,并允许用户从完全存在于EtherDelta中的钱包进行发送、接收和交易。对于不想安装插件或使用特殊浏览器的用户来说,这很方便,对于不知道如何安装浏览器插件或不想安装浏览器插件的用户,这可以简化用户体验。
In-Dapp钱包使用HTML5 localStorage存储在用户的浏览器中,这是现代浏览器的一个特性,允许网站将信息保存在用户的浏览器中,以便JavaScript应用程序将来访问。与cookie存储信息以备将来使用不同的是,localStorage不会通过HTTP请求发送到远程服务器,只对应用程序可用;这对于私有密匙之类的敏感信息非常方便,您不希望远程服务器拥有这些密匙。此外,localStorage只对存储信息的域上的网站可用,因此当您访问任何其他网站时,EtherDelta.com存储的私有密钥将不可用。
不幸的是,当黑客入侵EtherDelta.com网站时,他们能够将JavaScript应用程序替换为一个可能已经从localStorage中检索到密钥并将其发送给黑客的应用程序。任何使用EtherDelta的dapp私钥并在妥协期间访问EtherDelta.com的人,都应假定黑客拥有这些私钥,即使他们尚未使用。
密钥上传
使用Dapp内钱包的另一个后果是,如果用户想从多个设备(甚至同一设备上的多个浏览器)访问EtherDelta,就必须导入自己的私钥。任何在黑客控制EtherDelta.com时输入私钥的人,都应假定这些私钥已遭到入侵。
如何预防这种情况?
虽然Dapp内的钱包很方便,但是以太坊这样的浏览器以及MetaMask这样的浏览器插件提供了更好的安全模型。使用Mist和Metamask,应用程序永远不会获得您的密钥。他们可以请求浏览器签署消息或事务,浏览器将提示用户确认他们想要签署此消息或发送该事务。web应用程序将获得已签名的消息或已发送事务的哈希值,但非常重要的是,它永远不会与私钥接触。
如果Dapp认为Dapp内的钱包对于他们的用户体验来说是绝对必要的,那么他们可以采取一些额外的步骤来获得更多的安全性。应用程序可以要求用户提供一个密码,并用该密码加密生成的私钥。至少,这意味着用户必须在密钥被破解之前输入密码,而不是在密钥登录网站时就从本地存储中被盗。
这对OpenRelay意味着什么?
虽然我们认为与EtherDelta相比,0x协议提供了一些安全优势,但这两个系统都必须在便利性和dapp内钱包的用户体验与以太坊浏览器或插件提供的安全性之间进行权衡。
OpenRelay的联盟模式意味着许多不同的网站可能为OpenRelay提供前端。一旦我们准备推出我们的联属计划,我们将有一个明确定义的安全政策。我们目前正在讨论是否允许分支机构在OpenRelay中使用 dapp内的钱包,但我们肯定会鼓励使用像Mist和MetaMask这样的以太坊浏览器。
交易合约对资产的控制
即使您使用的是MetaMask或Mist,而不是Dapp内的钱包,EtherDelta也要求用户将他们的代币发送到EtherDelta Exchange合同。当黑客接管EtherDelta.com时,他们可以更改代币发送到的地址。非常精明的用户可能已经注意到,代币被发送到的地址不是通常的EtherDelta合约地址,但是绝大多数用户只会认为接受的地址是正确的并批准事务。
另一个问题是,在黑客被发现之后的很长一段时间内,EtherDelta.com网站完全脱机,没有留下任何与EtherDelta合约接口并提取它所持代币的简单方法。有一些关于如何通过其他方式提取资金的指南,但是对于技术水平较低的用户来说,这些指南甚至比浏览器插件更难以访问。
0 x协议
有了0x,代币就直接从你的钱包里被交易出去。您不必为了交易而将代币发送到合约中,只需批准0x代币传输即可。代币留在您的钱包中,并且只能在您向0x交易所合约提交订单或其他人向0x交易所合约提交数字签名的订单时移动。
这不是什么灵丹妙药。有人黑了一个基于0x的中继器可以欺骗您批准传输到他们的地址,而不是代币传输代理的地址。但是,如果您使用无限制的津贴,则永远不需要从相同的帐户中两次批准相同的代币。如果一个网站要求您批准一个您已经批准的代币,这是一个表明有问题的信号。

另一个问题是,当您签署一个0x订单时,您签署的消息不是很有用的信息。一个典型的签名对话框是这样的:

因此,您可能认为您签署了一条消息,授权以10个代币ABC交换5个代币XYZ,但实际上您签署了一条消息,授权以0.0005 XYZ交换10个ABC,但只有黑客才可赎回。0x项目组已经赞助了EIP-712,这将为消息签名提供更好的用户界面,因此您可以对您正在签署的消息有更大的确定性。
最后,如果您使用0x中继器交易代币,而您选择的中继器脱机一段时间,那么您的代币仍然在您的钱包中。如果你想找别的地方进行交易,你可以找到一个不同的中介人,通过他们找到交易。所有0x中继器都依赖相同的0x代币传输代理,所以您甚至不必再次批准传输。
更先进的解决方案
虽然EtherDelta是一个分散的交易所,但上周受到损害的是DNS,它是栈的一个集中组件。一些dapp将竭尽全力从它们的堆栈中提取任何集中的组件。
Dapp可以托管前端应用IPFS或swarm,并使用eis指向前端应用程序。这降低了牺牲集中式服务的可能性,但同时也为用户提供了方便。现在很少有用户使用支持IPFS / Swarm和ENS域解析的浏览器,所以如果没有一些集中的组件,构建一个拥有大量用户的应用程序是不太可行的。
即使交易所是完全分散的,也必须有人持有更新ENS记录的键,但如果这些键被破坏,ENS记录最终可能发送错误的内容。通过使用多团体合约或更复杂的社区治理系统来管理ENS记录,这可能会得到缓解,但是管理的复杂性增加了管理合约本身存在的漏洞。