原文標題:《技術 | 從一個錢包被盜的案例,探討 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 默認授權的時候是:
轉換成數字,我們認識的就是 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
冷萃財經原創,作者:Awing,轉載請註明出處:https://www.lccjd.top/2022/01/21/%e4%bb%8e%e4%b8%80%e4%b8%aa%e9%92%b1%e5%8c%85%e8%a2%ab%e7%9b%97%e7%9a%84%e6%a1%88%e4%be%8b%ef%bc%8c%e6%8e%a2%e8%ae%a8web-3%e7%9a%84%e5%ae%89%e5%85%a8%e6%8c%87%e5%8d%97/?variant=zh-tw
文章評論