Mixin Safe 是 Mixin Network 在去年就公告要进行升级的资产管理框架,在去年 9 月被黑客攻击之前测试网已经在运作了,但是并没有上线实装。
考虑到发生了黑客攻击事件,未来尽快实装 Mixin Safe 肯定是一件迫在眉睫的事情。这里需要注意的是,Mixin Safe 不是一个 Mixin 主网的升级方案,而是一个有主网参与的独立的资产保管解决方案。根据它的介绍,任何个人和组织都可以通过使用它来增强自己在 Mixin 上的资产安全性。
也就是说,Mixin Safe 是一个可选套件:无论你是机构还是个人,如果希望增加安全性,就可以使用它。另一个说法则是,默认情况下,如果你只是使用 Messenger,不会直接从 Mixin Safe 受益。当然,Messenger 内置钱包的资产可能也会用 Safe 管理,但不满足「not your keys, not your coins」这样的原则。
常说没有 100% 的安全,被黑是迟早的事——但是不能用这样的理由来躺平,毕竟可以通过各种手段来提高被黒的门槛。因此,作为 Mixin 生态中的开发者,肯定要对包括 Mixin Safe 在内的可能的资管方案都做一番分析,尤其是在黑客攻击事件之后,安全方面的分析就非常重要,毕竟这影响到是否要使用 Mixin Safe 方案这样的决定。
- 本文只代表我个人的观点。
- 本文只对基本机制分析,受限于我的知识与能力,不保证内容的完整性和准确性。
- 本文只对当前 Mixin Safe 版本分析,不保证时效。
- 本文不对任何内容中提到的产品、服务、方案背书,不构成任何投资建议。
- 本文所描述的各类风险并非方案缺陷,而是各类最坏情况发生时的假设。
分析范围
我直接略过了官网 ,从 Mixin Safe 的技术说明书开始读。这里是地址。
另外还有部分代码,都在这里。
概览
首先可以得到如下简单的事实:
Mixin Safe 的金库本质上是原生链上的多签。如果用 Mixin Safe 保管 BTC,那么使用的就是 BTC 原生的多签脚本来管理 BTC;如果保管的是 ETH,那么使用的就是 ETH 合约来管理 ETH 和 ERC20 资产。
因此:
- 如果链不提供多签能力,那么 Mixin Safe 就无法支持。
- 如果链提供多签能力,但是 Mixin Safe 还没有支持,这个链上的币无法放入 Mixin Safe。
接下来技术说明书都以 BTC 为例来讲原理。
每个 Mixin Safe 金库的底层都是一个 2/3 的多签,多签方分别为:
- Holder:金库管理人,也就是 Mixin Safe 的使用者。
- Signer:一个 MPC 去中心化网络,称为 Safe Network。其 Safe 节点的参与条件为必须先 Mixin 主网的节点。也就是可以看作 Mixin 主网的子集或者全集。
- Observer:默认是 Mixin 团队,实际实体应该是 Mixin Ltd 香港公司,负责 Safe 的研发和商业化。
资金操作需要三方中的两方签名后才能执行。
其中:
- Holder 会要求创建一个 BTC 私钥。在创建金库时,会问创建人要这个私钥对应的公钥。这个私钥的来源没有限制,目前为了流程的方便支持 Bitcoin 官方钱包、硬件钱包 Ledger 和 Mixin 团队开发的手机 App Mornin Key。
- 在创建多签金库时,会给 Observer 创建一个 BTC 私钥。
Safe 使用的 BTC 脚本创建了一个相对时间锁,这个时间锁的时间是可以定制的。默认时间锁会在 52560 个区块后释放。假设每个区块 10 分钟,大概就是一年。 - Observer 的私钥默认是 Mixin 团队持有,但是可以定制为金库的创建人,也就是 Holder 提供。
- Signer 的外在表现的形态是协助管理多签资产的共管人,实际上是 Safe Network 的多个节点,这些节点控制私钥。
在使用 Mixin Safe 时,设置其他 Mixin Messenger 用户跟你共管资产时,共管人并没有私钥,只是有权限去操作 Signer 去签名交易。 - 也就是说,Mixin Safe 方案里有两层多签:第一层是资产所在的链的多签,是一个 2/3 多签组;第二层是 Signer 上资产共管人的多签,是 Mixin 上的多签,是一个 N/M 多签组,其中 N 和 M 可以设置。
风险分析
合约或者脚本漏洞
Mixin Safe 使用的 Bitcoin 脚本和 Ethereum 合约都公开在了 Github,可以在 这里 和 这里 查看。
其中 Bitcoin 脚本非常简短。Ethereum 合约使用的是 Safe Global 的合约。这个合约如果出问题的话,Safe Global 上 $790 亿的资产都会出问题。
我不是合约安全专家,暂时未对脚本和合约做深入分析,只是粗看没问题。
资产窃取
对私钥的窃取
根据 2/3 多签的特性,当其中有两个私钥泄漏时,资产就会失窃。
那么有三种可能性:
- Mixin Safe 主网 Signer 被攻破且 Mixin 团队管理的 Observer 私钥被窃取,然后等时间锁解锁。
- Mixin Safe 主网 Signer 被攻破且金库管理人掌握的 Holder 私钥被窃取。
- 金库管理人掌握的 Holder 私钥被窃取且 Mixin 团队管理的 Observer 私钥被窃取,然后等时间锁解锁。
对于金库管理人来说,总会对自己管理的私钥有信心,而担心另外两份私钥被窃取。对黑客来说,攻击 Mixin Safe 主网和 Mixin 团队确实是潜在收益更高的做法,那么影响最大的情况就是上述的第一种可能性:
Mixin Safe 主网被攻破且 Mixin 团队管理的私钥被窃取并且等时间锁解锁
对于这种情况,Mixin Safe 给的解决方案有两个:
- 在时间锁解锁之前,将资金转走。
- 在创建金库时,由 Holder 指定一个 Observer,该 Observer 私钥不由 Mixin 团队管理。
对于解决方案 1,虽然攻击者时间锁解锁之前都拿不走资产,但是攻击者可以等待,之后择机拿走资产:因为粗心的金库管理人可能忽略了时间锁解锁,没有及时转走资产。
这里暗示了一个使用 Safe 的最佳实践,即金库管理人一定要在时间锁到期之前转走资产到新的 Safe 金库或者其他地址。因为一旦时间锁解锁,此时金库的风险敞口会变大。
反过来,这也暗示了时间锁的意义之一:
在一段时间内确保,即使 Mixin 团队管理的 key 丢失,金库的安全性不被这件事影响。
对于方案 2,等同于 Holder 同时管理 Observer 私钥,那么这个 2/3 多签本质上退回到了 2/2 多签,其中 Observer 是 Holder 的一个延迟备份。攻击者需要同时攻破 Mixin Safe 主网和窃取管理人手中的任何一个私钥才行。
这样降低了 Mixin 团队管理 Observer 私钥的风险,但是也对金库管理人提出了更高的要求。
对 Signer 的拒绝服务攻击
刚才提到,Signer 实际上是 Mixin Safe 主网控制的,它是一个由一群服务器组成的在线服务。因此,即使攻击者无法攻破它获得其管理的私钥,也可以对它进行拒绝服务攻击,让它瘫痪。
在 Signer 无法工作的时期,如果攻击者具备一些特殊条件,那么也可以对资产窃取。
例如:如果攻击者获得了 Observer 私钥和对应的 Holder 的私钥,然后他还知道这个 Observer 对应的时间锁解除时间。此时,攻击者使用某种方式瘫痪了 Safe 主网,导致 Signer 不正常工作。如果在这期间时间锁过期,攻击者就可以人为地构造一个让金库管理人无法在时间锁过期之前转移资金的时机,从而攻击得手。
因此,金库管理人还需要预留攻击者瘫痪 Safe 主网以后恢复的时间,不要拖到时间锁快过期才去转移资产。
供应链攻击
即攻击 Safe 主网节点、Safe 的网站业务、Mornin 钱包的源码,在其中加入恶意代码。
供应链攻击并非针对 Mixin Safe 方案机制的攻击,所有软硬件钱包都可能遇到。在此仅评估如果发生供应链攻击,对 Mixin Safe 的影响。
这里分为几种情况:
- 在 Safe 主网节点中加入恶意代码会导致 Signer 的私钥泄漏
- 在 Safe 的网站中加入恶意代码虽然不会有私钥泄漏,但是可以通过钓鱼和诱骗等手段欺骗 Holder 和 Signer 的共管人的签名。
- 在 Mornin 钱包中加入恶意代码会导致 Holder 的私钥泄漏,但是攻击者需要知道每个私钥作用于哪个多签地址才能实施攻击。
在最坏的情况下,Signer 和 Holder 的私钥可能因此泄漏导致资产损失。不过隐藏好多签金库的信息的话,会降低被攻击的概率。具体的方案有:
- 不使用 Safe 的网站,而是自己写程序去操作。
- 不使用 Mornin 钱包管理 Holder 私钥,而是使用其他钱包。
- 私有化部署 Safe 网站和关联服务,降低开放服务的风险敞口。
当然,这些都会提升使用的难度和门槛,也是提高安全性的代价。
多签的回退
刚才提到,如果管理人定制了 Observer,那么 2/3 多签实质上回退到 2/2。这是底层链的多签的回退。考虑到 Signer 的共管人实际上是 Mixin 上的多签,这一层多签也是可能回退的。
例如,如果在创建金库时,选择了金库的多签阈值为 N=1,则 M 个共管人中,只需要收集一个签名即可转账,此时的底层多签实质上回退到了 1/3 —— 因为资产管理人也是共管人之一,当 N=1 时,实质上 Holder 和 Signer 保持了「共同投票」,此时资产管理人自己就可以操作其中所有资产。
资产不可用
在「资产窃取」章节,我分析的是机密性。但是作为安全的一环,可用性也重要。如果可用性没了,对应到加密货币资产,就是这些资产能看到,但是不能取回来。
多数私钥遗失
由于 2/3 多签的特性,如果其中有两个私钥丢失,则这笔资产就无法操作了,也分为三种情况:
- Signer 不可用 + Mixin 团队的 Observer 私钥丢失
- Holder 管理人自己的私钥丢失 + Mixin 团队的 Observer 私钥丢失
- Signer 不可用 + Holder 管理人自己的私钥丢失
其中 Signer 不可用的一种情况在上一章「对 Signer 的拒绝服务攻击」有提到,不再赘述。另一种情况是 Signer 上的共管人遗失了访问权限——不过这不属于系统设计上的问题,不表。
总之,以上三种情况如果发生,会导致的这些资产虽然没有被窃取,但是从此也无法将它们转出多签地址。
时间锁的影响
另外,由于时间锁的特性,在时间锁生效的时期,正常运作的 Safe 本质上是回退到了 2/2 多签,这个时期都可以认为 Observer 私钥是不可用的。
如果此时 Signer 不可用(刚才提到了)或者 Holder 私钥丢失,那么这部分资产在时间锁解除锁定之前,都是不可用的。
如果资产的价值有时效性(例如时间锁解锁以后不值钱了),那么管理人需要考虑这一风险。
信息泄漏
信息泄漏不会导致直接的资产安全问题,但是有的攻击手段需要知道一些相关信息才能实施攻击。
例如,如果攻击者拿到了 Holder 的私钥,那么他需要知道这个私钥对应的是哪个多签金库,才能对这个金库的共管人或者 Mixin 团队实施欺诈。
目前 Mixin Safe 使用 SegWit 上的脚本,而不是 Taproots。如此这般的话,当一个 UTXO 被消费以后,对应的脚本会随着暴露,多签参与人的信息也就随之暴露。暴露的信息可能有一些安全和隐私隐患。
其他安全问题
略
其他资管方案
目前的研究中,主流资产中只有 Ethereum 有最成熟、可用性最好、并且最灵活的多签解决方案,即 Safe.Global。其他大部分主流链的资产的支持都不太好:有的是不支持多签名,有的是缺少好用的方案,有的是不开源,有的是缺少对硬件钱包的支持,各有各的问题。
我觉得 Mixin Safe 提供的开源方案有一定的吸引力,也有一定的风险敞口。如果选择 Mixin Safe,它的配置也可以很多样,需要根据实际自行调整。