Nbzs

 · 大約1個月 ago

区块链个人安全黑手册——小心签名!(持续更新)

目录
签名安全是我特别需要提的,因为签名协议坑很多,已经发⽣了数起安全事件,尤其围绕 NFT 的。但我注意到其实太多⼈还是⽆法很好应对这部分安全问题,究其原因在于很少有⼈把这部分安全问题讲明⽩。

签名安全⾥⾸要遵守的最⼤安全原则是:所⻅即所签。即你看到的内容就是你预期要签名的内容,当你签名发出去后,结果就应该是你预期的,绝不是事后拍断⼤腿的。

签名安全有关的⼀些内容在“Cold Wallet”部分有提到,印象不深的建议回顾下,这⾥重点讲讲不⼀样的内容。

OpenSea 在 2022 年前后出现过数起⽤户持有的知名 NFT 被盗事件,尤其是 2022.2.20 集中爆发,根本原因在于: 
⽤户在 OpenSea 授权了 NFT(挂单)。 
⿊客钓⻥拿到⽤户的相关签名。 
⽐较正确的解读可以⻅这个相关签名要拿到其实不难,⿊客需构造正确的待签名内容,哈希后,诱骗⽬标⽤户完成签名(这⾥是盲签,也就是说⽤户实际上不知道⾃⼰到底签名的内容是什么),⿊客拿到签名后的内容,构造利⽤数据,完成利⽤。

我这⾥拿其中⼀个 NFT 市场进⾏具体说明(不⼀定是 OpenSea)。当⽬标⽤户在 NFT 市场⾥授权了相关 NFT 挂单后,攻击者构造了正确的待签名内容,通过 Keccak256 哈希后,在钓⻥⻚⾯上弹出了待签名的内容给⽤户,此时⽤户看到的东⻄如下:

仔细看,MetaMask 弹出的这个窗⼝,能看出什么?账户及余额、签名请求的来源⽹站、正在签名的消息,没了...就这点内容,⽤户怎么会想到⾃⼰⼀旦点击了“签名”后,灾难就来了,⾃⼰的相关 NFT 就可以被盗⾛了。

这其实就是⼀种盲签,⽤户并不需要在 NFT 市场⾥签名,可以被诱骗在任何⽹站(钓⻥⽹站)上签名,⽽⽤户根本就⚠不知道这些签名的实际意义,可惜的是⿊客知道。对于⽤户来说,只需牢记:拒绝盲签。OpenSea 之前存在盲签情况,2022.2.20 后改进了,采⽤ EIP-712 进⾏了升级改进。但即使不是盲签,还是有⽤户会粗⼼⼤意。

为什么会出现这种情况,最最本质的原因还是在于签名并不存在浏览器同源策略的约束,你可以简单理解为:同源策略可以确保⼀个⾏为只在明确的域名下发⽣,不会跨域发⽣,除⾮项⽬⽅故意要跨域的发⽣。如果签名有同源策略,那么⾮⽬标域名产⽣的请求签名,即使⽤户签名完成了,⿊客也没法将这个签名⽤于⽬标域名下的攻击。这⾥就不继续展开说了,协议级别的安全改进,我有注意到新草案,我希望这种情况能尽快得到改善。⽬前提到的签名安全涵盖了主要⽅式,但变种其实挺多,⽆论如何,万变不离其宗。最好的吃透⽅式是⾃⼰从头到尾完整将攻击复现⼀遍,甚⾄⾸创⼀些独特的攻击⽅式。⽐如这⾥提到的签名,其实⾥⾯有⼤量细节,⽐如如何构造待签名内容、签名后的内容具体都是什么?除了 approve 这种授权⽅式,还有其他的吗(有,⽐如 increaseAllowance)。

好吧,这⾥展开的话就太过技术了。很好的是,你清楚签名的重要性了。对于⽤户来说,取消授权(approve)是可能在源头上对抗这类攻击的。你可以⽤一些知名的⼯具来操作: 
Token Approvals 
是以太坊官⽅浏览器提供的授权检查及取消的⼯具,以太坊系列区块链基本都类似,因为他们的区块链浏览器基本都是 Etherscan 代为开发的,⽼牌经典,⽀持多链,越来越强。
 
Rabby 扩展钱包 
我们安全合作⽐较多的⼀款钱包,他们的“授权检查及取消”功能⽀持的以太坊系列是我⻅过最多的...

我不得不承认,签名安全的知识点对于初学者来说是⾮常不友好的。这个仓库⾥汇总了许多有关内容,你可以⾃⾏翻阅,如果都能看懂,我相信这⽅⾯的安全知识不会再成为你的负担:)

返回目录     下一篇

#区块链个人安全黑手册 #比特币 #区块链安全