以太坊代幣“假充值”漏洞細(xì)節(jié)披露及修復(fù)方案區(qū)塊鏈
作為平臺(tái)方,在對(duì)接新上線的代幣合約之前,應(yīng)該做好嚴(yán)格的安全審計(jì),這種安全審計(jì)必須強(qiáng)制代幣合約方執(zhí)行最佳安全實(shí)踐。作為代幣合約方,在編碼上,應(yīng)該嚴(yán)格執(zhí)行最佳安全實(shí)踐,并請(qǐng)第三方職業(yè)安全審計(jì)機(jī)構(gòu)完成嚴(yán)謹(jǐn)完備的安全審計(jì)。
披露時(shí)間線
以太坊代幣“假充值”漏洞影響面非常之廣,影響對(duì)象至少包括:相關(guān)中心化交易所、中心化錢包、代幣合約等。單代幣合約,我們的不完全統(tǒng)計(jì)就有 3619 份存在“假充值”漏洞風(fēng)險(xiǎn),其中不乏知名代幣。相關(guān)項(xiàng)目方應(yīng)盡快自查。由于這不僅僅是一個(gè)漏洞那么簡(jiǎn)單,這已經(jīng)是真實(shí)在發(fā)生的攻擊!出于影響,我們采取了負(fù)責(zé)任的披露過程,這次攻擊事件的披露前后相關(guān)時(shí)間線大致如下:
2018/6/28 慢霧區(qū)情報(bào),USDT “假充值”漏洞攻擊事件披露
2018/7/1 慢霧安全團(tuán)隊(duì)開始分析知名公鏈?zhǔn)欠翊嬖陬愃茊栴}
2018/7/7 慢霧安全團(tuán)隊(duì)捕獲并確認(rèn)以太坊相關(guān)代幣“假充值”漏洞攻擊事件
2018/7/8 慢霧安全團(tuán)隊(duì)分析此次影響可能會(huì)大于 USDT “假充值”漏洞攻擊事件,并迅速通知相關(guān)客戶及慢霧區(qū)伙伴
2018/7/9 慢霧區(qū)對(duì)外發(fā)出第一次預(yù)警
2018/7/10 慢霧安全團(tuán)隊(duì)把細(xì)節(jié)同步給至少 10 家區(qū)塊鏈生態(tài)安全同行
2018/7/11 細(xì)節(jié)報(bào)告正式公開
漏洞細(xì)節(jié)
以太坊代幣交易回執(zhí)中 status 字段是 0x1(true) 還是 0x0(false),取決于交易事務(wù)執(zhí)行過程中是否拋出了異常(比如使用了 require/assert/revert/throw 等機(jī)制)。當(dāng)用戶調(diào)用代幣合約的 transfer 函數(shù)進(jìn)行轉(zhuǎn)賬時(shí),如果 transfer 函數(shù)正常運(yùn)行未拋出異常,該交易的 status 即是 0x1(true)。
如圖代碼,某些代幣合約的 transfer 函數(shù)對(duì)轉(zhuǎn)賬發(fā)起人(msg.sender)的余額檢查用的是 if 判斷方式,當(dāng) balances[msg.sender] < _value 時(shí)進(jìn)入 else 邏輯部分并 return false,最終沒有拋出異常,我們認(rèn)為僅 if/else 這種溫和的判斷方式在 transfer 這類敏感函數(shù)場(chǎng)景中是一種不嚴(yán)謹(jǐn)?shù)木幋a方式。而大多數(shù)代幣合約的 transfer 函數(shù)會(huì)采用 require/assert 方式,如圖:
當(dāng)不滿足條件時(shí)會(huì)直接拋出異常,中斷合約后續(xù)指令的執(zhí)行,或者也可以使用 EIP 20 推薦的 if/else revert/throw 函數(shù)組合機(jī)制來顯現(xiàn)拋出異常,如圖:
我們很難要求所有程序員都能寫出最佳安全實(shí)踐的代碼,這種不嚴(yán)謹(jǐn)?shù)木幋a方式是一種安全缺陷,這種安全缺陷可能會(huì)導(dǎo)致特殊場(chǎng)景下的安全問題。攻擊者可以利用存在該缺陷的代幣合約向中心化交易所、錢包等服務(wù)平臺(tái)發(fā)起充值操作,如果交易所僅判斷如 TxReceipt Status 是 success(即上文提的 status 為 0x1(true) 的情況) 就以為充幣成功,就可能存在“假充值”漏洞。如圖:
參考示例 TX:
https://etherscan.io/tx/0x9fbeeba6c7c20f81938d124af79d27ea8e8566b5e937578ac25fb6c6804error
修復(fù)方案
除了判斷交易事務(wù) success 之外,還應(yīng)二次判斷充值錢包地址的 balance 是否準(zhǔn)確的增加。其實(shí)這個(gè)二次判斷可以通過 Event 事件日志來進(jìn)行,很多中心化交易所、錢包等服務(wù)平臺(tái)會(huì)通過 Event 事件日志來獲取轉(zhuǎn)賬額度,以此判斷轉(zhuǎn)賬的準(zhǔn)確性。但這里就需要特別注意合約作惡情況,因?yàn)?Event 是可以任意編寫的,不是強(qiáng)制默認(rèn)不可篡改的選項(xiàng):
emit Transfer(from, to, value); // value 等參數(shù)可以任意定義
作為平臺(tái)方,在對(duì)接新上線的代幣合約之前,應(yīng)該做好嚴(yán)格的安全審計(jì),這種安全審計(jì)必須強(qiáng)制代幣合約方執(zhí)行最佳安全實(shí)踐。
作為代幣合約方,在編碼上,應(yīng)該嚴(yán)格執(zhí)行最佳安全實(shí)踐,并請(qǐng)第三方職業(yè)安全審計(jì)機(jī)構(gòu)完成嚴(yán)謹(jǐn)完備的安全審計(jì)。
后記 Q&A
Q:為什么我們采取這種披露方式?
A:本質(zhì)是與攻擊者賽跑,但是這個(gè)生態(tài)太大,我們的力量不可能覆蓋全面,只能盡我們所能去覆蓋,比如我們第一時(shí)間通知了我們的客戶,然后是慢霧區(qū)伙伴的客戶,再然后是關(guān)注這個(gè)生態(tài)的安全同行的客戶,最終不得不披露出細(xì)節(jié)。
Q:為什么說披露的不僅僅是漏洞,而是攻擊?
A:其實(shí),以我們的風(fēng)格,我們一般情況下是不會(huì)單純?nèi)ヌ崧┒矗┒催@東西,對(duì)我們來說太普通,拿漏洞來高調(diào)運(yùn)作不是個(gè)好方式。而攻擊不一樣,攻擊是已經(jīng)發(fā)生的,我們必須與攻擊者賽跑。披露是一門藝術(shù),沒什么是完美的,我們只能盡力做到最好,讓這個(gè)生態(tài)有安全感。
Q:至少 3619 份存在“假充值”漏洞風(fēng)險(xiǎn),這些代幣該怎么辦?
A:很糾結(jié),一般來說,這些代幣最好的方式是重發(fā),然后新舊代幣做好“映射”。因?yàn)檫@類代幣如果不這樣做,會(huì)像個(gè)“定時(shí)炸彈”,你不可能期望所有中心化交易所、中心化錢包等平臺(tái)方都能做好安全對(duì)接,一旦沒做好這個(gè)“假充值”漏洞的判斷,那損失的可是這些平臺(tái)方。而如果平臺(tái)方損失嚴(yán)重,對(duì)整個(gè)市場(chǎng)來說必然也是一種損失。
Q:有哪些知名代幣存在“假充值”漏洞?
A:我們不會(huì)做點(diǎn)名披露的事。
Q:有哪些交易所、錢包遭受過“假充值”漏洞的攻擊?
A:恐怕沒人會(huì)公開提,我們也不會(huì)點(diǎn)名。
Q:這些代幣不重發(fā)是否可以?
A:也許可以,但不完美。不選擇重發(fā)的代幣要么很快是發(fā)布主網(wǎng)就做“映射”的,要么得做好通知所有對(duì)接該代幣的平臺(tái)方的持續(xù)性工作。
Q:為什么慢霧可捕獲到這類攻擊?
A:我們有健壯的威脅情報(bào)網(wǎng)絡(luò),捕獲到異常時(shí),我們默認(rèn)直覺會(huì)認(rèn)為這是一種攻擊。
Q:除了 USDT、以太坊代幣存在“假充值”漏洞風(fēng)險(xiǎn),還有其他什么鏈也存在?
A:暫時(shí)不做披露,但相信我們,“假充值”漏洞已經(jīng)成為區(qū)塊鏈生態(tài)里不可忽視的一種漏洞類型。這是慢霧安全團(tuán)隊(duì)在漏洞與攻擊發(fā)現(xiàn)史上非常重要的一筆。
1.TMT觀察網(wǎng)遵循行業(yè)規(guī)范,任何轉(zhuǎn)載的稿件都會(huì)明確標(biāo)注作者和來源;
2.TMT觀察網(wǎng)的原創(chuàng)文章,請(qǐng)轉(zhuǎn)載時(shí)務(wù)必注明文章作者和"來源:TMT觀察網(wǎng)",不尊重原創(chuàng)的行為TMT觀察網(wǎng)或?qū)⒆肪控?zé)任;
3.作者投稿可能會(huì)經(jīng)TMT觀察網(wǎng)編輯修改或補(bǔ)充。