原文标题:《技术 | 从一个钱包被盗的案例,探讨 Web3 的安全指南》 原文来源:微信公众号: 阿法兔研究笔记 原文作者:Chris 阿法兔 事件 2022 年元旦假期的某个早上,小 C 准备写代码,继续测试 Web3js 的链上合约交易。突然发现自己的测试账号(Bsc 链)在 MetaMask 归零了,明明前一晚账户内还有 100usd,然后查完转账就发现: 钱都没了,钱哪去了? 背景 技术出身的小 C,最近在学习区块链开发。本身是专业开发者,已经很谨慎小心了,通常都是在测试网络上跑,跑完之后,再会去正式网络上部署,但是没有意识到整个产业目前还处在相对混乱的阶段,麻痹大意,顺手习惯导致造成了损失。 损失是如何造成的? 2021 年的最后一天,小 C 偶然看到一个账号很有趣(这个账号有很多活跃的交易),就追踪了他的一些链上交易,然后看到了一个非常有意思的项目(有很高的年化收益率),然后就鬼使神差地连上了自己的 MetaMask,然后鬼使神差的进行了 approve,因为一般 Web3 的项目就是这个流程,approve 然后转账就结束了。 但是令人惊呆的一幕出现了:点完之后,整个网站突然卡死了(其实在卡死这段时间,盗取者就把钱转走了),没有任何反应,小 C 当时没当回事,把站点给关了,去做其他事情了。 过了大概一天,小 C 重新回来开发的时候,发现账上的钱全部没有了,去查了历史记录,发现账上的余额已经被全部转走。 回顾过程 盗取者是怎么把小 C 账户上的钱都转走的? 现象:只要你 approve 了,不需要私钥理论上也可以把对应的钱全部转走。 小 C 进行了下溯源,大概是在一个钓鱼网站的 approve 出了问题,于是追溯该转账记录。 如图,可以看到,先是 approve(授权)了一个合约,授权了钓鱼合约能够对账号里面 BUSD 进行操作,而且是没有数量限制的。 为什么会是 BUSD 呢?小 C 回忆了一下,一进入这个钓鱼站点是默认选了 BUSD ,估计在浏览站点链接钱包之后,盗取者就已经筛选了出了账号里面钱最多的 token 了。 然后当小 C 以为这是一个新的 swap 合约,并且有很高的年化收益,准备先试试的时候,按照常规流程就进行 approve。approve 结束后,网站直接卡了。 后来经过追溯,大概在授权之后几十秒,合约就直接触发了一个转账操作,直接把 BUSD token 给转走了。 后来去查了一下授权的信息 基本上 MetaMask 默认授权的时候是: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 转换成数字,我们认识的就是 1.157920892373162 乘以 10 的 59 次方。基本上就可以理解为无限量转账了,也就是这个授权的操作,可以让这个合约无限量的操纵我账号的 token。看到这里感觉背后一凉,因为以前点过很多次 approve 都是不会去看的。 然后黑客操纵一个可以控制这个合约方法的钱包地址,就发起合约转账方法,把钱转走了。所以小伙伴之后点 metamask 授权的时候一定要小心。 小 C 查了下,盗取者现在这个账号里大概已经有了 3w 美金的 token 了,现在还有源源不断的受害者在转钱。但是面对区块链没有办法,根本无法找不到这个黑客是谁。 出现问题的环节 问题到底出在哪里? 因为最近在学习区块链。小 C 大概理了一下这个钓鱼的逻辑方式,害人之心不可有,防人之心不可无。大家有兴趣可以了解一下: 正常转账 案例一:直接用户间转账 A 用户向 B 用户转账 BUSD 合约正常会检查以下逻辑 1)判断 A 用户账户余额是否有足够的钱; 2)是否是 A 用户发起的转账 流程如下图 正常合约兑换 就是我们平时使用 pancakeswap、uniswap 等兑换时候的流程 案例二:通过 swap 进行 token 兑换 A 用户进行 token 兑换(BUSD 兑换 WBNB)流程 合约进行判断: 1)A 用户账户余额是否有足够的 BUSD,(假设已经授权 swap 合约可以操作 A 账户的 BUSDtoken) 2)swap 合约取 A 账户下的 500BUSD 放入 swap 的合约池中(假设汇率是 1:500) 3)成功后合约再向 A 账户转入 1BNB 注意第 2、3点,是由合约控制 token 进行操作。那么也就是说合约可以绕过我们直接发起对我们账号下的 token 的操作。 钓鱼合约 先看这张溯源图 正常的转账,转账方和合约执行的转账方应该是同一个人,即上图(1)与(2)应该是由同一个人发起的。而我被转账的这笔交易,这两个不是同一个地址。推测应该是由一个可以执行钓鱼合约的钱包地址控制执行了合约,然后将我授权给钓鱼合约里的 BUSD 转走了。 去查看钓鱼合约,不出意料钓鱼合约是一个加密的合约。不过想一下也不难,稍微学过 Solidity 的人都知道,在合约定义的时候,多设置几个 Admin 或者 Owner 就可以了。 所以以后一定要注意项目方的背书,不要随便给不知道的项目授权!!! 安全建议 因为这件事,小 C 搜了一些有用的建议和方法,也看到了很多血淋淋的教训。 这里列出来一些方法大家可以根据自己的需要选择。 1)不要共用密钥 之前看有帖子说一个助记词生成多个账号的,这种我不建议哈,因为很可能被一锅端。 2)密钥离线保存 因为现在有很多剪贴板工具输入法会将你的剪贴板记录上传到云端,如果你直接复制了,如果云端泄漏,你的密钥就直接无了。我的建议就是生成之后,第一时间抄到本子上。当然抄到本子上,你也可以参考我对密钥自己的字典加密,比如 a 用 1 代替,b 用 2 代替,1 用 a 代替,这样就可以保证即使有人看到了你的纸质密钥,也不能动你的数字资产。 3)开发和测试分开(空投和主账号隔离) 安装 2 个浏览器,一个可以是 chrome,一个是 brave。一个管理你的主钱包。另外一个可以参与领取空投,各种链上操作等 4)不要下载来历不明的软件 不要去用 baidu 这些下载来历不明的软件,我看到有案例是下载盗版 metamask,直接破产的。一定要去正规的地址下载,有条件的可以参考 google play。chrome web store 等 5)立即检查你的授权 检查的网址有下面几个,debank 没有开源,但是 UI 交互比较好,后续的有开源的,大家自己抉择吧。 https://debank.com/ https://approved.zone/ https://tac.dappstar.io/ https://ethallowance.com/ 看到图上所示,基本上就是无限的。 每次唤起 MetaMask 的时候一定要多看看授权,不要像我现在这样无脑点授权下一步。 6)进行授权前,对合约安全进行确认 https://www.slowmist.com/service-smart-contract-security-audit.html 可以使用慢雾的合约审计功能。 也可以看看该合约是否开源,如果开源的话需要确认该合约是否是可升级合约等等。 7)撸空投和福利的时候注意安全 用小号去领取,别用大号,授权的时候可以设置额度!!! 8)警惕社工的入侵,小心 Discord 私聊你的陌生人 比如 Discord 或者 Telegram,有人跟你认识几天,说要带你赚钱拿空投,让你安装他发给你的软件并登录,这种 99.99% 你会血本无归。账号被盗。 特别地,Discord 里面,进 NFT 的官方 Discord,会有人私聊你,告诉你获得了白名单,附带一个 mint 链接。骗子会把头像和名称改成官方的样子,其实是把他和你拉了一个组来实现的。其实只要不贪,这种骗局还蛮好识破的,一般会告诉你在几个小时内 mint,数量 1-10。很多大热项目一个白名单 mint 一两个不错了,这一上来顶格 10 个还带时间限制。 还有,会有骗子模仿项目官网做个假网站,私信给项目 Server 里的人,让他们来 mint. 还有小伙伴在 opensea 买了假 NFT 后来发现不是官方的 然后过了几天那个 NFT 就从账户消失了 然而已经扣了...(怎么发现的?看链条 还有官方 discord 发了官方 Opensea 网址 ) 还有假的 collab.land 骗钱包密码,给大 v 空投然后号称大 v 买了那个 NFT/token. 新的一年到来,大家一定要注意安全呀,希望看到本文的朋友都能平平安安顺顺利利! 本文感谢作者 Chris, 感谢 Free、即本聪、JulzW、大 K 快跑啊、阿猛先生的补充。 原文链接 —- 编译者/作者:区块律动BlockBeat 玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。 |
从一个钱包被盗的案例,探讨Web3的安全指南
2022-01-20 区块律动BlockBeat 来源:区块链网络
- 上一篇:北京环球度假区将引入元宇宙应用场景
- 下一篇:为什么房地产投资者应该喜欢比特币
LOADING...
相关阅读:
- Zora联合创始人:如何构建一个Web3.0超结构2022-01-19
- Web3.0时代:Blockbuster DAO为什么能重塑影视行业?2022-01-18
- 金色Web3.0周报|印象北京城市系列NFT将在1月21日中午12点开启空投2022-01-17
- Web3.0游戏聚合平台服务商ForthBox上线首款融合NFT+GameFi属性链游Space War2022-01-16
- 元宇宙是一个新时代的开启其内核由Web3.0承载2022-01-16