你剛搬進一棟號稱銀行等級的新大樓,門禁、監視器都頂規,你安心到不行。結果你要出國,怕沒人幫你收包裹,就手寫一張授權小紙條給樓下代收店,上面寫:來拿包裹的人,可以直接開我家門進去放。更慘的是,你還把這張紙條拿去影印,隨手發給好幾個人。最後有個陌生人拿著影本,大搖大擺開門,把你家裡價值780萬美元的現金和名錶全部搬光。事後你去找大樓理論,人家只回你一句:大樓保全根本沒壞,壞的是你那張亂寫的紙條。
這次在 以太坊 上的失竊案,劇情幾乎一模一樣。主角用的錢包是很多人愛用的 Safe,本身沒被攻破,真正出事的是錢包主人自己授權的一個 小幫手合約,裡面藏了一個超蠢的寫碼失誤。
你的錢包沒破,是你親手點頭的那個小幫手出賣了你
故事是這樣,朋友跟我聊到都傻眼。
這位受害者應該是個大戶,錢放在 Safe 這種多簽錢包裡。Safe 就像銀行的金庫,要好幾把鑰匙一起轉才能開,安全性在圈內是數一數二的。駭客根本打不穿它。
打不穿金庫怎麼辦?駭客就換個想法:騙你自己開門。
受害者為了方便操作,授權了一個 helper contract,也就是幫你跑腿的小幫手智能合約。可能是為了自動歸集資金、省 gas 費,或是跟某個 去中心化 應用互動。在我看來,這個動作就跟你在玩鏈遊、刷 流動性 挖礦時,按下的那個 Approve 一模一樣。
問題就出在這個小幫手的程式碼,有一行邏輯寫錯了。它大概長這樣:只要有人呼叫我,我就幫他從主人錢包搬錢,完全沒檢查 這個人到底是不是主人。駭客用鏈上工具一掃就發現了,馬上呼叫這個函式,金庫就這樣被合法地搬空了,整整 780萬美元。
欸等等,我用的不是最安全的錢包嗎?怎麼還會被偷? 對,你家大門是沒壞,但你把備份鑰匙跟門禁卡,直接送給了壞人啊。
為了讓你秒懂,我們注意到可以這樣對照:
| 黑話 | 翻成白話 | 你可以這樣想 |
|---|---|---|
Safe 錢包 |
超安全的金庫 | 大樓本身,沒壞 |
helper contract |
你授權的小幫手 | 你亂寫的代收紙條 |
Approve 授權 |
你親手按的同意鍵 | 你簽名把鑰匙交出去 |
| 駭客的手法 | 呼叫有漏洞的函式 | 拿著你的紙條影本開門 |
我認為這才是最毛的地方。整起攻擊沒有什麼高深數學,就是利用了你的信任。你以為你在授權一個貼心小工具,實際上你授權的是一個 看到誰都開門的笨管家。
我認為:懶得看合約,就先別按確認
講白了,在加密貨幣世界,方便跟安全永遠在打架。
以後不管你在 交易所 之外用熱錢包、冷錢包,只要看到跳出授權視窗,先停三秒。問自己三件事:這個合約是誰寫的?有沒有被審計過?我是不是給了無限額度?
養成習慣,定期去 revoke 工具上取消不用的授權,大錢一定要放多簽或硬體錢包,小錢才拿出來互動。別讓一個幾分鐘寫出來的小幫手,把你幾年存下來的錢一次送走。
延伸思考與常見問題
Q1:Safe 錢包是不是不安全了,以後還能用嗎?
Safe 本身這次沒有被攻破,出包的是主人額外授權的外部小幫手合約。只要你不亂授權,Safe 依然是目前相對安全的選擇之一。
Q2:helper contract 小幫手合約到底是什麼東西?
它就是一段幫你自動執行操作的智能合約,像是幫你一次領很多獎勵或省手續費的工具。你授權它,它就能在一定範圍內動用你錢包裡的錢。
Q3:一般人要怎麼避免按到這種死亡授權?
第一是只跟知名、有審計的應用互動,第二是不要給無限額度,第三是定期檢查並取消用不到的授權。大額資產記得分開存放,不要全放在天天互動的熱錢包裡。