【預警】Bancor危機:Token背后潛伏的“上帝之手”區塊鏈
我們也號召大家,去更多地了解相關項目的智能合約,關注手中的Token到底由誰控制,利用社區力量監督項目管理員權限。
風險提示:包括 Status 和 FunFair 在內的部分國內外熱門區塊鏈項目,智能合約存在管理員權限過高的問題,或導致項目存在過度中心化的風險,相關 Token 生態極易發生單點失效。致命問題可能會出現在兩個方面:一是項目方濫用權限,二是超級管理員身份被盜用。這兩種情況一旦發生,相關 Token 生態可能會迅速崩塌。
恐怖的智能合約管理員權限
作為比特幣和區塊鏈愛好者,我們崇尚去中心化。然而,很多持幣者可能還不太清楚,目前各類 Token 項目智能合約管理員擁有超級權限竟已逐漸成為常態。據我們不完全統計,排名前 570 名的 Token 合約中,有 342 個合約存在只有管理員能調用的功能(onlyOwner),不少合約更存在管理員任意鑄幣、燒幣、凍結賬戶、關停轉賬等過高權限 [1]。
安比(SECBIT)實驗室研究了排名靠前的 Status (SNT) 和 FunFair (FUN) 項目。我們認為這兩個熱門項目都存在非常嚴重的管理員權限過高問題。
Status 合約中有名為 Controller 的管理員角色,可調用 generateTokens() 往任意地址增發代幣,可調用 destroyTokens() 銷毀任意地址上的代幣 [2]。但 Status 項目的白皮書并沒有相關特殊權限聲明。而且,這兩個超級權限函數在實現上,并沒有觸發 Mint 或 Burn 事件,只有普通的 Transfer 事件。
倘若有人利用管理員身份作惡,社區可能難以第一時間發現。通過掃描區塊鏈數據我們發現,目前 Status 團隊僅于 2017 年 6 月 19 日依次傳入極小值成功調用了增發和銷毀的函數進行測試,因此普通用戶無需過分恐慌。但需要知道的是官方團隊隨時保留有這樣的超級權限。
此外,Status 合約還應用了可升級的代理合約機制,管理員可以通過任意設置代理合約 controller 地址的方式,在關鍵函數前面插入可升級的校驗邏輯,來影響轉賬等關鍵操作。
知名的 FunFair (FUN) 項目也存在與 Status 類似的問題 [3]。白皮書中并未提及其 Token 合約中的特殊權限;通常原本應當在眾籌后一定時間內關閉的鑄幣等功能,項目方依然未關閉。倘若有人作惡,增發巨額數量的 Token 至市場上拋售,后果不堪設想。
此外還有不少項目有同樣的問題。我們呼吁相關項目方應立即向社區做好風險告知與特殊權限披露,社區參與者也可以積極發揮監督力量。
Token 持有者有權了解,項目方也有義務披露以下這些內容:
-
Token 及業務合約中項目方擁有的特殊權限明細
-
項目方為何需要這些特殊權限
-
特殊權限會在哪些情況下使用
-
特殊權限被濫用會發生哪些后果
-
哪些特殊權限可以被永久關閉以及何時關閉
-
特殊權限動用歷史記錄的詳細說明
-
特殊權限動用的監控渠道
-
項目方采取何種措施來保障特殊權限不被濫用和盜用
-
如何通過更好的智能設計提升社區治理水平
此外,交易所作為區塊鏈項目生態中的中堅力量,也應當積極督促項目方限制過高權限以及透明運營。
管理員權限過高造成損失的真實案例
目前為止還沒有熱門項目團隊利用超級權限作惡的證據,或許我們可以舒一口氣。但即使在信任官方團隊不會主動作惡的前提下,惡性安全事件依然有可能發生。
加密貨幣交易平臺 Bancor 于 7 月 10 日稱遭到攻擊,丟失 24,984 個 ETH,3,236,967 個 BNT,229,356,645 個 NPXS,折算法幣金額為 1250 萬美金的以太坊,1000 萬美金的 Bancor 代幣和 100 萬美金的 Pundix 代幣。
初期不少媒體報道稱 Bancor 智能合約存在安全漏洞。安比(SECBIT)實驗室遂對此安全事件進行追溯分析。
Bancor 主要合約包括 SmartToken 和 BancorConverter,分別為 ERC20 Token 合約以及與業務相關的 Token 轉換交易合約。
本次 Bancor 平臺被盜事件與 BancorConverter 合約有關,攻擊者(黑客/內鬼)極有可能獲取了 0x009bb5e9fcf28e5e601b7d0e9e821da6365d0a9c 賬戶的私鑰。
而此賬戶正是轉換代幣合約BancorConverter(0x3839416bd0095d97bE9b354cBfB0F6807d4d609E)的 owner,同樣擁有極高權限。owner 作為該合約的所有者和管理員,有唯一的權限通過 withdrawTokens() 方法提走合約中的全部 ERC20 Token 至任意地址。
第一次攻擊發生在以太坊主網區塊高度 5930096,北京時間 7 月 9 日 8 時 6 分。攻擊者利用 owner 身份,首先調用 withdrawTokens() 轉走 0.1 ERC20 ETH 進行攻擊測試 [4]。
三分鐘后,攻擊者再次轉走 22000 巨額數量的 ERC20 ETH 至其控制的地址(0x33ed22f4b6b05f8a5faac4701550d52286bd735a)上 [5]。
隨后,攻擊者再調用 Ether Token 合約(0xc0829421C1d260BD3cB3E0F06cfE2D52db2cE315)的 withdrawTo() 方法,將 ERC20 版本的以太代幣兌換為真實以太幣 [6]。
至此,22000 個 ETH 便完全被攻擊者借用管理員身份所盜走。
攻擊者還控制了以下賬戶,如法炮制地偷走其賬戶余額,以及其所管理合約中的代幣。
目前,區塊鏈瀏覽器網站 EtherScan 已將攻擊者的地址標注為 Fake_Phishing1701 和 Fake_Phishing1702。
此外,Bancor SmartToken ERC20 合約也由 owner 完全控制,目前是一個名為 MultiSigWallet 的合約,暫未被盜用。
owner 對 SmartToken 合約具有以下權限:
-
owner 可通過 disableTransfers() 任意禁用轉賬功能
-
owner 可通過 issue() 任意增發代幣
-
owner 可通過 destroy() 任意銷毀代幣
以上這些功能均通過 ownerOnly 進行限定,換句話說,owner 對 Bancor 合約擁有最高權限。
Bancor 團隊如何處理被盜事件
Bancor 項目方在攻擊發生后,識別出攻擊者地址,聲稱凍結了攻擊者偷來的 BNT 代幣。
經我們調查,Bancor 管理員實際動用了 destroy() 方法來“銷毀”用戶手中的 Token。
管理員可以從任意賬戶 _from 中扣除任意金額 _amount 的 Token,同時將總供應量 totalSupply 縮減。
這就是常說的 燒幣 功能。由于攻擊者在得手后,將偷來的幣分散到若干個地址中。Bancor 的管理員不得不挨個依次調用 destroy() 來銷毀對應地址的代幣,再調用 issue() 方法將燒毀的幣重新增發到自己手中。但此補救方法對于 NPXS Token 和已轉走的 ETH 無效,這些被盜的幣將被轉至交易所拋售。
Bancor 團隊也發表聲明稱普通用戶的錢包沒有受到影響,并進一步解釋鑄幣、燒幣以及存儲大量以太幣是他們協議中價格發現機制的一部分。
Bancor 安全事件的影響與反思
除開巨額被盜事件,Bancor 團隊的這一聲明和處理方式,同樣引起了社區的恐慌。人們紛紛質疑 Bancor 項目智能合約中 owner 管理員的超級權限,甚至稱之為“后門”。
Udi Wertheimer 早在一年前就曾發文抨擊 Bancor 項目無論是眾籌合約還是 ERC20 Token 合約都缺乏良好的設計,稱所有的 Token 都由 Bancor 團隊完全掌控,管理員擁有絕對控制權,極度中心化 [7]。而 Bancor 團隊則一直聲稱自己十分重視安全,并采用業內最佳的錢包和私鑰管理方案 [8]。不過,他們并沒有披露此次被盜事件的細節,如攻擊者如何能控制多個管理員賬戶。
我們把目光放至整個通證生態。社區參與者對管理員擁有的權限知之甚少,而項目方的相關披露與風險提示更少。安比(SECBIT)實驗室也正在智能合約風險列表中收錄各類權限過高問題 [9],試圖借此引導社區重視這些問題。
https://github.com/sec-bit/awesome-buggy-erc20-tokens
對于 Token 合約,當有賬戶存在超級權限時,整個 Token 生態極容易發生單點失效。致命問題可能會出現在兩個方面,一是項目方作惡,二是超級管理員身份被盜用。當 Token 的價值全部依賴在某一個人或少數幾個人身上時,可想而知這其中暗藏的風險會非常之高。以 Bancor 為例,在巨大的經濟利益面前,即使我們信任了發行方不會濫用權限,卻依然無法保證別有用心者不會借此攻擊。對于發行與運營極度依賴項目方的 Token,可能我們永遠無法形成類似對比特幣的共識與信仰。
Bancor 危機也給我們帶來很多反思:
-
Bancor 是否是真正的去中心化交易協議
-
智能合約在哪些情況下需要管理員
-
合約管理員權限的邊界在何處
-
如何保障錢包及私鑰安全
管理員權限是把雙刃劍。在 Bancor 事件中,黑客利用了管理員權限盜取代幣,而項目方也正利用了管理員權限來降低損失。不過我們認為,開發者依然可以通過良好的代碼設計來降低Token 和 協議合約對管理員的依賴。同時,我們也號召大家,去更多地了解相關項目的智能合約(它可能跟你想象的不太一樣),關注手中的 Token 到底由誰控制,利用社區力量監督項目管理員權限。
參考文獻
[1] CoinAlpha 對 ERC20 亂象的總結https://medium.com/finance-3/the-myth-of-the-erc-20-token-standard-ab0d76cf8532
[2] Status 合約代碼
https://etherscan.io/address/0x744d70fdbe2ba4cf95131626614a1763df805b9e#code
[3] FunFair 合約代碼
https://etherscan.io/address/0x419d0d8bdd9af5e606ae2232ed285aff190e711b#code
[4] 第一次攻擊測試
https://etherscan.io/tx/0xf9fd6ac9bb4e632cf07d5b80b59bb6e417fe52305ea720e552ca6ca204951629
[5] 第二次攻擊
https://etherscan.io/tx/0xf9fe97d642705fa016c4f8d11ea13ce581ba75c57ac455586254e15d915e9bde
[6] 兌換成 ETH
https://etherscan.io/tx/0x43a964e635f31b0cc329db6f980f09096054e4e3a627c85654852fd026b92ba0
[7] 對 bancor 的質疑
https://medium.com/unchained-reports/bancor-unchained-all-your-token-are-belong-to-us-d6bb00871e86
[8] bancor 的回應
https://blog.bancor.network/response-to-bancor-unchained-cdb3bd2ba505
[9] SECBIT 智能合約風險列表
https://github.com/sec-bit/awesome-buggy-erc20-tokens/blob/master/ERC20_token_issue_list_CN.md#c-權限管理問題列表
1.TMT觀察網遵循行業規范,任何轉載的稿件都會明確標注作者和來源;
2.TMT觀察網的原創文章,請轉載時務必注明文章作者和"來源:TMT觀察網",不尊重原創的行為TMT觀察網或將追究責任;
3.作者投稿可能會經TMT觀察網編輯修改或補充。