这一切都可以归结为两点:
Hot Wallet相比冷钱包,冷钱包有的风险热钱包基本都会有,除此之外,热钱包多了个:助记词(或私钥)被盗风险。此时的热钱包要考虑的安全就多了,比如运行环境的安全,如果运行环境有相关病毒,那么就有被盗风险。还有热钱包如果存在某些漏洞,通过漏洞也可以直接盗走助记词。 热钱包除了常规的转币功能外,如果要与那些 DApp(DeFi、NFT、GameFi 等)交互,要么直接用自带的浏览器访问,要么通过 WalletConnect 协议与 PC 浏览器打开的 DApp 交互。 注:本手册提到的 DApp 默认指运行在以太坊系列区块链上的智能合约项目。 默认情况下,这样的交互是不会导致助记词被盗的,除非钱包安全设计本身有问题。从我们的安全审计及安全研究历史数据来看,存在钱包助记词被目标页面恶意 JavaScript 直接盗取的风险。但这个情况比较罕见,因为这实际上属于极其低级的错误,知名钱包都不大可能会犯这种错误。 这里我最担心的问题实际上都不是以上这些,这些对我来说都可控(你也可以的),我最关心/担心的问题是:知名钱包的每次版本迭代是如何确保不会被植入恶意代码或后门?这个问题言下之意很清楚:当前的钱包版本我验证了没什么安全问题,我敢放心用,但我不知道下一个版本安全性如何,毕竟,我或者我的安全团队不可能有那么多时间与精力都去做验证。 这里所说的恶意代码或后门造成的盗币事件已经好几起了,如曾经的 CoPay、近期的 AToken 等,具体事件可以自行搜索了解。 对于这种情况,作恶主要有几种方式:
安全这东西,无知者无畏、知者敬畏,许多点是细思恐极的。所以对于存有重要资产的钱包,我的安全原则也简单:不做轻易更新,够用就好。 DeFi 安全到底是什么当我们提 DApp 时,可能是 DeFi、NFT 或 GameFi 等等,这几个的安全大多是相同的,但会有自身的特别点。我们这里以 DeFi 为例先讲解下,当我们提 DeFi 安全时,到底指的是什么?业内几乎都只看智能合约部分,似乎智能合约安全了也就没事了。其实远远并非如此。 DeFi 安全至少包括如下几部分:
智能合约安全 智能合约安全确实是安全审计最重要的切入点,慢雾针对智能合约的安全审计点可以参考:
对于高级玩家来说,如果智能合约部分本身安全性可控(无论是自己能安全审计还是读懂专业机构的安全审计报告),那么也就无所谓其他部分的安全了。可控是个很有差异的理解,有的得看玩家实力。比如说智能合约权限过大的风险,玩家是有要求的,除非项目方本身实力雄厚及口碑良好,完全中心化也都无所谓。但对于那些不大知名的、有争议的或新出现的项目,如果你说这个项目的智能合约有权限过大的风险,尤其是这种权限还可以影响你的本金或收益,你肯定就不愿意了。 权限过大这种风险是很微妙的,很多时候权限这东西是方便项目方做相关治理及风险应急的。但对我们来说,这就是人性考量了,万一项目方作恶呢?于是业内有了折中的实践:增加时间锁 (Timelock) 来解决一些权限过大的风险,比如:
链上可以直接看到 Timelock 的时间锁(delay 参数)是 48 小时(172800 秒):
也就是说,如果 Compound 的 admin(项目方)需要变更目标智能合约的一些关键值时,这笔交易上链后会有记录,但必须等到 48 小时后才可以最终完成执行。这意味着,只要你愿意,你是可以审计 admin 的每一次操作,你至少有 48 小时来反应。比如如果你不放心,你可以在 48 小时内把资金撤走。 还有一种削弱项目方权限过大风险的做法是:将 admin 多签了,比如用 Gnosis Safe 进行多签管理,这样至少不会出现一言堂。这里需要注意的是,多签可以是 “皇帝的新衣”,比如一个人掌握了多把钥匙。所以目标项目的多签策略需要公示说明清楚,钥匙都由谁保管,保管钥匙的角色也一定是有口碑的。 这里需要特别注意,任何安全策略,都可能出现 “皇帝的新衣” 问题,表面做得好,实际上却不是,呈现出了一种虚假安全感。再举个例子,Timelock 这玩意,看去似乎挺好,实际上出现过有的项目方部署的 Timelock 是有后门的情况。用户一般也不会直接去看 Timelock 源码,而且也不一定看得懂,于是放了个后门在那,一时半会还真不一定有人留意到。 除了权限过大风险,智能合约安全的其他内容也都很关键,但理解门槛还是挺高的,这里就不展开了,我的建议是这样:至少可以逐步学会阅读安全审计报告,熟能生巧。 区块链基础安全 区块链基础安全指的是区块链本身的安全性,如:共识账本安全、虚拟机安全等。如果区块链本身安全性堪忧,其上运行的智能合约项目也可以直接喝西北风了。选择一条拥有足够安全及知名度的区块链,甚至大概率可以源远流长的区块链是多么的重要。 前端安全 前端安全真是魔鬼,与用户走得太近了,特别容易让用户魔怔后上当受骗。可能大家主要的注意力都在自己的钱包上和目标项目的智能合约安全上了,前端安全非常容易被忽视。这里我需要再次强调,前端安全是魔鬼!我重点说说。 前端安全里我最在意的点是:我怎么知道我在这个前端页面里的交互对象就是我以为的智能合约? 造成这种不安全感主要是因为以下这两种风险:
内部作恶很好理解,比如开发人员偷偷将前端页面里的目标智能合约地址替换为一个有后门的合约地址,或者直接植入个授权钓鱼脚本。当你访问该前端页面时,你钱包后续的一系列涉及加密货币的操作都可能是在陷阱里完成的。神不知鬼不觉,币没了。 第三方作恶,主要指的是两种:
为什么这里说可能会被影响是因为,如果项目方在前端页面以下面这样的方式来引用第三方远程 JavaScript 文件的话,就可能不会被影响:
这里的关键点是 HTML5 的一个不错的安全机制:标签里的 integrity 属性(SRI 机制),integrity 支持 sha256, sha384, sha512,如果第三方 JavaScript 资源不满足 integrity 的哈希完整性校验,就不会加载,这个可以很好防止非预期的代码执行。但使用这个机制需要目标资源支持 CORS 响应。具体参考:
等等,为什么我前面又提了 “可能”,是因为有存在被绕过的场景。至于绕过方式我就不提了,因为大多情况下,你只需关注目标前端页面在引入第三方远程 JavaScript 文件时是否有 integrity 机制。可惜的是,OpenSea 没有,让我们祝福它。 通信安全 通信安全这部分,重点看 HTTPS 安全就好。首先目标网站一定要 HTTPS,绝不允许存在 HTTP 明文传输的情况。因为 HTTP 明文传输实在太容易被中间人劫持攻击了,现在 HTTPS 这种安全传输协议已经非常普遍。如果 HTTPS 出现中间人劫持攻击,比如植入了恶意 JavaScript 代码到目标前端页面,此时浏览器必然会出现 HTTPS 证书错误的高显目提醒。举个例子,曾经 MyEtherWallet 的坑。 MyEtherWallet 曾经是个很流行的网页钱包,现在也挺知名,不过已经不仅仅是网页钱包了。我前面有说过,网页钱包我非常不建议使用,除了前端安全的各种猫腻之外,还可能出现 HTTPS 劫持的风险。 2018.4.24,MyEtherWallet 就出现过 HTTPS 劫持的重大安全事件,回顾可见:
当时黑客是通过 BGP 这个上古协议劫持了 MyEtherWallet 大量用户所用的 DNS 服务(Google Public DNS),这导致许多用户访问 MyEtherWallet 时,浏览器出现 HTTPS 错误证书的提醒。其实吧,遇到错误证书了,原则上就别继续访问了,因为这表示目标页面已经被劫持了。但是真的许多用户不懂这个安全风险,顶多犹豫下就忽略错误证书的提醒继续强制访问了。 由于目标页面已经被劫持,黑客注入了恶意 JavaScript 代码,直接就盗走了目标用户在目标页面上的明文私钥,之后批量转走这些用户相关的加密货币(主要是 ETH)。 这绝对是个经典案例,黑客为了盗币,动用了 BGP 劫持,真是杀鸡用了牛刀。之后也出现过几起类似的案例,这里就不提了。这里对于用户来说实际上只需要注意一点,当你真的要用网页钱包或玩相关 DApp 时,一定要注意:当目标页面出现 HTTPS 错误证书提醒时,就立即停止继续访问、关闭页面,那么你什么事都不会有。 安全上有个残酷现实,是这样的:当已经出现风险时,就别给用户选择,一旦给了,总会有用户无论出于何种原因会掉坑里。其实这里项目方是需要肩负起相关责任的,比如这个 HTTPS 劫持,其实已经有很好的安全解决方案,项目方的开发人员只需配置好 HSTS 即可。HSTS 全称 HTTP Strict Transport Security,是浏览器支持的一个 Web 安全策略,如果开启了这个配置,浏览器发现 HTTPS 证书错误后就会强制不让用户继续访问。明白什么意思了吧? 人性安全 人性安全这块很好理解,比如项目方内部作恶,这点在前面已经提了些内容,暂时就不过多展开。因为之后,这块还会专门展开讲讲。 金融安全 金融安全是个很需要敬畏的概念,放在 DeFi 上,涉及到金融的点,用户最关心的是币价、年化收益,一定要好,至少要稳。简而言之是,我作为用户,我玩这个 DeFi,我要赚钱。如果亏了,得让我心服口服。嗯,这也是人性。 这部分可能出现诟病的有:
合规安全 合规安全是个非常大的话题,前面提到的 AML(Anti Money Laundering) 只是其中一点,还有如 KYC(Know Your Customer)、制裁地区限制、证券风险有关的内容等等。其实对于用户来说,这些不是我们可以对抗的,只能说当玩一个项目时,目标项目可能会受到某些国家的安全监管,因此可能会出现我们在意的隐私信息采集的问题。你可能不在意这点隐私,但却有在意的人。 比如,2022 年初出现的一件小事:钱包支持 Address Ownership Proof Protocol(AOPP) 协议。 当时我看了下 AOPP 的协议设计,原来支持了 AOPP 的钱包可能泄露用户隐私:监管机构会有能力知道一个被监管的交易所和一个不知道的外部钱包之间的关联。参考: 怪不得许多隐私钱包重视这个反馈,纷纷删除了这个协议的支持。话说回来:这个协议设计还真有意思。我注意到也有的钱包暂无计划删除对 AOPP 的支持,比如 EdgeWallet,他们的观点认为 AOPP 并没暴露更多的用户隐私,而且可以让加密货币的流转提供更大的帮助,因为,如果用户无法证明一个外部钱包地址属于自己,那么一些被监管的交易所是不允许用户提币到这个外部钱包地址的。 刚开始知名硬件钱包 Trezor 也是不删除 AOPP 的支持,后来在 Twitter 上迫于社区及用户压力做了删除妥协了。 你看,就这么小的一点,实际上对于有的人来说是隐私大事。这里并不是说要对抗监管,不管合规安全。其实在我的观点里,适当的合规安全妥协是必要的。这个话题就不继续展开说了,按你的舒服的方式去理解就行。 到这,DApp 安全的主要部分的相关内容就介绍完了。 除了以上这些,还有未来的新增或更改而引入的安全问题,我们经常说 “安全是动态的、不是静态的”,指的就是这点。比如现在很多项目方都有安全审计及漂亮的安全审计报告,但如果认真阅读质量不错的报告就会发现,这些报告会说明清楚,什么时间范围安全审计了什么内容,内容的唯一标记是什么(比如链上开源验证后的地址或 GitHub 仓库的 commit 地址,再或者目标代码文件的哈希值)。所以报告是静态的,如果你发现目标项目有不符合报告里的描述内容,就可以指出。 NFT 安全前面提的 DeFi 安全几乎内容都可以应用到 NFT 安全上,但 NFT 又有自己独特的安全点,比如:
Metadata 指的主要就是图片、动图等内容,关于 Metadata 的具体标准建议可以参考 OpenSea 出的: 这里可能带来的安全问题主要有两点:
签名安全问题很严重,下面展开。 小心签名!签名安全是我特别需要提的,因为签名协议坑很多,已经发生了数起安全事件,尤其围绕 NFT 的。但我注意到其实太多人还是无法很好应对这部分安全问题,究其原因在于很少有人把这部分安全问题讲明白。 签名安全里首要遵守的最大安全原则是:所见即所签。即你看到的内容就是你预期要签名的内容,当你签名发出去后,结果就应该是你预期的,绝不是事后拍断大腿的。 签名安全有关的一些内容在 “Cold Wallet” 部分有提到,印象不深的建议回顾下,这里重点讲讲不一样的内容。 OpenSea 在 2022 年前后出现过数起用户持有的知名 NFT 被盗事件,尤其是 2022.2.20 集中爆发,根本原因在于:
比较正确的解读可以见这: 这个相关签名要拿到其实不难,黑客需构造正确的待签名内容,哈希后,诱骗目标用户完成签名(这里是盲签,也就是说用户实际上不知道自己到底签名的内容是什么),黑客拿到签名后的内容,构造利用数据,完成利用。 我这里拿其中一个 NFT 市场进行具体说明(不一定是 OpenSea)。当目标用户在 NFT 市场里授权了相关 NFT 挂单后,攻击者构造了正确的待签名内容,通过 Keccak256 哈希后,在钓鱼页面上弹出了待签名的内容给用户,此时用户看到的东西如下:
仔细看,MetaMask 弹出的这个窗口,能看出什么?账户及余额、签名请求的来源网站、正在签名的消息,没了... 就这点内容,用户怎么会想到自己一旦点击了 “签名” 后,灾难就来了,自己的相关 NFT 就可以被盗走了。 |