智能合约权限管理系统的安全强化

新闻

2018年7月9日0:00UTC,去中心化加密货币交易所Bancor受到攻击,合约内一个可以升级合约并提币的地址私钥被盗,导致被转走25,534个ETH被转走,约合7,855万人民币

图片来自金色财经App

IAM

DUO团队认为对于智能合约来说,只有一个管理账号是非常危险的。遗憾的是,目前市场上大多数合约都是单一管理员账户的模式。

与这些合约不同,DUO体系的智能合约Beethoven从设计初期就包括了多管理员账户协同管理的模式,每个管理账户都有自己对应的职责。

在DUO体系IAM(Identity and Access Management – 身份识别和访问管理)系统的最初构思阶段,我们设计了一个超级管理员负责管理以下五个角色:价格来源1(pf1)、价格来源2(pf2)、价格来源3(pf3)、转化费收集账号(fc)以及运营账号(opt)。

作为价格来源的3个地址,pf1、pf2和pf3可以将价格提交到智能合约里。fc负责收集拆分合并的转化费用。opt负责更新智能合约的参数,例如价格容忍误差、会员门槛、价格更新冷却期等等。

为了保障合约的安全性,我们重新设计了IAM,确保任何单独的地址都无法通过更改智能合约Beethoven获益。全新的IAM系统逻辑可见下图:

我们的基本逻辑是增加管理地址的数量,这样即使失去一个地址也不会影响智能合约的运作。在新的设计下,我们拥有一个候选地址池,该池在任何情况下都最少有2个账号。智能合约初期会生成6个候选账号1个添加者。添加者可以将2个新候选地址加入池中。在加入前,添加者的地址会被一个随机选取的候选地址替换;同时新的添加者地址将从地址池中被剔除。添加者没有权利加入使用过的地址,且加入的2个新地址不能相同。在加入候选账号后,下一步就需要为这些账号赋予不同的角色。

地址池的所有地址都有资格成为委托人。委托人可以在地址池中随机选择一个地址用来委托角色(委托人的地址除外)。因此就算一个委托人的私钥泄漏,黑客也无法委托自己的地址成为成为任何角色。只有当两个账户的私钥都被同一个人掌握,才有委托自己的地址成为一个角色的可能性,由于委托的随机性和池中地址的数量,这种情况发生的概率很低。如果地址池足够大,概率会进一步降低。在委托新角色之后,委托人和受委托的地址都会从地址候选池池中被去除。

以上的设计虽然看上去已经足够安全,但是地址验证还存在一个问题:我们能确保账户在初始阶段的有效性,可如何确保新加入的以太坊地址的有效性呢?

实际上,我们的添加者可以将任何字符串作为地址加入池中。由于Solidity没有提供任何检查地址有效性的函数,因此智能合约容易受到攻击。短地址攻击就是一个利用短地址偷取以太币的鲜明例子。因此我们选择在链下验证候选地址的有效性。我们会密切关注地址池,一旦发现无效账户,就需要将不合理地址删除。

为了增加IAM的人为容错率,我们提供了一种从地址池中去除候选账户的方法:赋予了添加者从池中移出地址的权限。在这个新系统中,添加者被替换为地址池管理者(pm)。与之前的设计相似,每次增加或移除地址前pm都会被随机取缔。我们最终的IAM系统逻辑如下图所示:

前文提到,黑客掌握了两个账户的私钥并控制一个管理角色的可能性是存在的。为了降低这个风险,IAM系统内置了一个24小时的冷却期。在上一次管理操作后,需要等待24小时才能执行下一个管理操作。同时,每个管理操作都会发出一个事件到区块链上。受到攻击时,DUO团队能够立即检测到入侵行为,并且在黑客掌控任何角色前有1天的时间关闭其账户。

全新设计的IAM系统比之前简单的解决方案增加了更多灵活。一方面,我们使用了更多候选管理账户地址来抵御丢失或曝光的管理账号;另一方面,IAM系统也提高增加了系统的无效地址容错率。

作者介绍

Weitao Yang

DUO Network 区块链和大数据工程师

德勤咨询,新加坡国立大学

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180711G0UHHH00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注腾讯云开发者

领取腾讯云代金券