时间:2022-02-18|浏览:538
事件
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 默认授权为:
我们知道的是 1.157920892373162 乘以 10 59 次方。基本上可以理解为无限转账,也就是授权操作,可以让合同无限操纵我账号的 token。看到这里感觉背后很凉,因为之前点过很多次 approve 不会去看。
然后黑客操纵一个可以控制合同方法的钱包地址,发起合同转账方法,把钱转走。所以小伙伴点了 metamask 授权时一定要小心。
小 C 查了一下,盗窃者现在这个账号大概已经有 3了w 美金的 token ,还有源源不断的受害者在转账。但面对区块链,没有办法找到黑客是谁。
问题环节
问题在哪里?
因为我最近在学区块链。C 大概理清了这种钓鱼的逻辑方式,害人之心不可或缺,防人之心不可或缺。有兴趣可以了解一下:
正常转账
案例1:直接用户间转账 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
注意第二、三点,由合同控制token 操作。也就是说,合同可以绕过我们直接在我们账户下发起 token 的操作。
钓鱼合约
正常转账时,转账方和合同执行的转账方应为同一人,应由同一人发起。我转账的交易不是同一个地址。据推测,合同的执行应由可以执行钓鱼合同的钱包地址控制,然后授权给钓鱼合同中的 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 互动比较好,后续有开源。让我们自己选择。
每次唤起 MetaMask 一定要多看授权,不要像我现在这样无脑授权下一步。
6)授权前确认合同安全
可采用慢雾合同审计功能。
还可以看合同是否开源,如果开源,需要确认合同是否可升级等。
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.
用戶喜愛的交易所
已有账号登陆后会弹出下载