作者:@korpi87
(資料圖片)
編譯:Kxp,BlockBeats
你可能很難想象,Metamask 中一個(gè)簡(jiǎn)單的簽名就能掏空你的錢(qián)包。但這樣的事卻發(fā)生在了一名資深用戶(hù)身上,今天他因一個(gè)漏洞損失了近 50 萬(wàn) USDC 。如果不多加小心的話(huà),你可能就是下一個(gè)他。所以,今天我想和大家講講這件事的來(lái)龍去脈,告訴大家以后如何注意此類(lèi)問(wèn)題。
那是在一個(gè)安靜的午后時(shí)分,Joe(化名)突然發(fā)現(xiàn)自己的錢(qián)包被轉(zhuǎn)走了 46.9 萬(wàn) USDC。這次轉(zhuǎn)賬并不簡(jiǎn)單,肯定不是攻擊者能做出的行為,因?yàn)樗麄兏静豢赡艿玫?Joe 錢(qián)包的權(quán)限。那就說(shuō)明,轉(zhuǎn)走他所有 USDC 的應(yīng)該是某個(gè)惡意合約。
在講述今天的故事之前,我需要先向大家解釋一些術(shù)語(yǔ)。USDC 是以太坊上的一個(gè)具有多種功能的合約,規(guī)定了我們可以如何使用 USDC。
在眾多功能當(dāng)中,我們需要特別關(guān)注下面兩項(xiàng)功能:
轉(zhuǎn)賬(transfer)
代轉(zhuǎn)(transferFrom)
當(dāng)你需要在錢(qián)包之間轉(zhuǎn)移 USDC,或其他 ERC20s 時(shí),就需要用到轉(zhuǎn)賬功能。它可以將 Token 從調(diào)用者(調(diào)用該功能的地址)轉(zhuǎn)移到其他地址。如果有人能以你的名義惡意使用該功能,那么他一定得先掌握了你錢(qián)包的全部權(quán)限才行。
當(dāng)你與合約產(chǎn)生互動(dòng)時(shí),它們會(huì)通過(guò)代轉(zhuǎn)功能來(lái)轉(zhuǎn)移你的 Token,具體金額由你提前預(yù)設(shè)好的比例決定。因此,如果你允許一項(xiàng)合約轉(zhuǎn)移無(wú)限量的 USDC,那么理論上它就可以拿走你所有的 USDC。
現(xiàn)在讓我們回到 Joe 的故事當(dāng)中,轉(zhuǎn)走他全部 USDC 的確實(shí)就是 transferFrom 功能。然而,只有當(dāng) Joe 批準(zhǔn)合約使用他的 USDC 時(shí),transferFrom 才能發(fā)揮作用。但事實(shí)上,Joe 堅(jiān)信自己沒(méi)有批準(zhǔn)任何事項(xiàng)。
可是,DeBank 的交易記錄清楚地顯示,在漏洞發(fā)生前 10 分鐘,該惡意合約可以無(wú)限使用賬戶(hù)中的 USDC。那么問(wèn)題就在于,如果不是 Joe 本人的話(huà),究竟是誰(shuí)給了該合約這一項(xiàng)批準(zhǔn)呢?我只能說(shuō),Joe 確實(shí)批準(zhǔn)了這一操作,但卻是在他不知情的情況下完成的。
Etherscan 上的信息顯示,Joe 本人確實(shí)沒(méi)有調(diào)用該功能,真正批準(zhǔn)了這一額度的是其他地址,這才讓惡意合約得以花光 Joe 全部的 USDC。
我們不禁疑問(wèn),別人怎么能代替我給予合約許可呢?
許可功能的引入原本是為了改善以太坊的用戶(hù)體驗(yàn),它只需一個(gè)簽名就可以讓用戶(hù)在不提交交易的情況下修改批準(zhǔn)金額。也就是說(shuō),只要有了你的簽名,任何人都可以調(diào)用許可功能,并更新你對(duì)合約的批準(zhǔn)額度。
當(dāng)你使用 1inch dApp 時(shí),你就可以體驗(yàn)到這一功能。如果你想在上面出售 USDC,那你并不需要事先批準(zhǔn),只需要簽上你的名字就夠了。有了這個(gè)簽名,1inch 便獲取了你全部 USDC 的使用權(quán)限。雖然 1inch 不會(huì)無(wú)緣無(wú)故花光你所有的 USDC,但這卻給了惡意合約機(jī)會(huì)。
Joe 一定是不小心在一個(gè)惡意網(wǎng)站上簽署了這樣的信息。不幸的是,那一次他用的是熱錢(qián)包,簽名只是隨手點(diǎn)擊一下就完成了。如果他用的是硬件錢(qián)包的話(huà),就需要在外部設(shè)備上簽署信息,那么還會(huì)有一個(gè)思考的時(shí)間。
有了 Joe 的簽名,其他地址便可以提交一個(gè)帶有許可功能的交易,這樣惡意合約就獲取了 Joe 錢(qián)包全部 USDC 的使用權(quán)限。然后,只要它調(diào)用 transferFrom 功能,就可以轉(zhuǎn)走全部這些資金了。
所以說(shuō),一個(gè)看似小小的簽名卻可以引來(lái)巨大的災(zāi)難。在某些情況下,Metamask 會(huì)在你準(zhǔn)備簽名是對(duì)你發(fā)出警告,告知你其中的危險(xiǎn)性。簽署一個(gè)信息可能是危險(xiǎn)的。但一些技術(shù)層面上的批準(zhǔn)簽名卻不會(huì)收到預(yù)警,但這些一旦濫用往往會(huì)造成巨額的損失。
如何避免今后遇到類(lèi)似的問(wèn)題?
1. 不要在 Metamask 中簽署一切內(nèi)容;
2. 花點(diǎn)時(shí)間了解你所簽署的內(nèi)容;
3. 對(duì)傳統(tǒng)的批準(zhǔn)事項(xiàng)要格外小心。
關(guān)鍵詞: 50萬(wàn)美元的血淚教訓(xùn)一個(gè)簡(jiǎn)單的簽名如何導(dǎo)致資產(chǎn)被盜