引子: “庖人雖不治庖,尸、祝不越樽俎而代之矣。” -- 《莊子·逍遙游》
古時候,有一位杰出的領袖名叫唐堯。他所治理的地區人們安居樂業,但是他聽聞隱士許由十分有才干,便萌生了將領導權讓給許由的想法。但是許由拒絕了,并說出了這樣一段話“鷦鷯巢于深林,不過一枝。”至此,后人也用越俎代庖一詞來表達越權的含義。
“越俎代庖”
在智能合約的實現中存在著訪問權限,如果權限設置不合理,很容易造成智能合約被攻擊,嚴重的還會造成巨大的經濟損失。成都鏈安-安全實驗室對于智能合約安全有著豐富的經驗和積累,但隨著區塊鏈技術越來越受重視,智能合約的數量也越來越多,隨之而來的智能合約被攻擊事件也越來越多,也讓我們感受到了“讓區塊鏈更安全”的企業使命是多么的重要,但是一己之力難于對抗所有的威脅,接下來,我們將會把自己的安全經驗積累通過與智能合約CTF靶場ethernaut相結合,通過技術連載的方式向廣大智能合約開發者普及在開發過程中,如何實現更安全的代碼。
動態 | 世界經濟論壇2020年預測:公共部門將越來越多使用智能合約:世界經濟論壇日前宣布對區塊鏈領域的預測稱,2019年見證了從大肆宣傳到質量的轉變,而在2020年,“區塊鏈有機會產生社會影響。”該非政府組織表示,未來區塊鏈項目必須建立更多的合作伙伴關系才能成功,公共部門將越來越多地使用智能合約。(Fxstreet)[2020/1/7]
現在我們就來聊一聊ethernaut靶場的第一題Fallback,代碼函數“越俎代庖”的事件。
越權漏洞是指在智能合約中,因函數可見性設置不合理或函數缺乏有效的驗證導致本不能調用某一函數的用戶通過直接或者繞過驗證的方式成功調用該函數。該漏洞可被單獨利用,也可能結合其他漏洞進行組合攻擊,利用方式簡單,漏洞影響視存在漏洞的函數而定,可能對合約造成毀滅性打擊。
2.1 合約中的“俎”與“庖”
如何理解合約中的“俎”與“庖”呢?先來看一段合約代碼,如下圖所示:
動態 | 普華集團憑借形式化智能合約技術獲“院士推優計劃”百強獎:近日,第三屆中國工業設計展覽會在武漢舉行,普華集團憑借基于區塊鏈技術創立的形式化智能合約技術,榮獲“2019年一帶一路創新設計榜院士推優計劃百強獎”。據悉,形式化智能合約技術是由普華集團研發的智能合約可視化增強技術,它由可視化視圖、模板與庫、指令規則集、視圖轉化器、指令編譯器等內容組成。(新浪財經)[2020/1/6]
這一段合約代碼出自ethernaut靶場的第一題Fallback。針對于靶場中的問題,解題思路是通過調用回調函數function() payable public來觸發owner = msg.sender;,使得合約的所有者變成調用者。題目非常的簡單,只要向此合約發起一筆交易,且滿足require的條件就可觸發fallback函數。
正常情況下,在對一個合約調用中,如果沒有其他函數與給定的函數標識符匹配,或者沒有提供附加數據,那么fallback 函數會被執行。一般是作為轉入以太幣的默認操作。所以智能合約開發時一般是不需要將owner = msg.sender寫到fallback函數中的。如下圖所示:
動態 | 1月以太坊智能合約創建量環比下降59.69%:據PeckShield態勢感知平臺數據顯示,1月以太坊主網智能合約創建量為745,115個,較去年12月份智能合約創建量(1,848,648個)大幅下降了59.69%,且2月份以來整體合約創建量數據還在持續降低,半個月以來僅創建279,821個,不及1月份創建總量半數。不過,去年12月份到今年1月,以太坊主網的活躍合約量和新增地址數并沒有明顯變化,2月份以來兩項數據均出現明顯下滑,考慮僅可能和春節有一定關系。[2019/2/14]
然而,在這里本不該被用戶調用的owner=msg.sender被調用了,導致權限控制不當,產生了越權,“俎”與“庖”就這樣發生了接下來的故事。
2.2 相關安全事件
2.2.1 Bancor合約事件
2020年6月18日,Bancor network(0x5f58058c0ec971492166763c8c22632b583f667f)被爆出存在漏洞。漏洞產生的原因是合約中存在一個public的safeTransferFrom方法,使得攻擊者可以直接調用此方法授權給Bancor network合約的代幣轉出到任意賬戶。
現場 | 孫志勇:智能合約價值在于提供效率 證據保全 自動執行:金色財經現場報道,在”共識2018區塊鏈大會·北京”上,中國政法大學教授孫志勇在談到區塊鏈與智能合約時表示,智能合約的價值在于提供效率、證據保全和自動執行。而智能合約對現有法律的挑戰表現為,跨境執行與法律監管的沖突、稅收沖突、智能合約的自身爭議處理以及智能合約與傳統法律的銜接。[2018/7/27]
其關于轉賬和授權的三個函數權限均為public,這使得任何用戶都能對其進行調用。本次事件涉及資金50W余美元。詳細代碼如下圖所示:
權限為public的safeTransferFrom方法這個“奸臣”并沒有得到Bancor合約“國王”的許可,直接奪走了“國家”的“財政大權”。幸而Bancor network團隊和白帽首先發現了此問題,并對資金進行了轉移。在后續也對該漏洞進行了修復,才得以避免損失。詳細分析見(https://mp.weixin.qq.com/s/vN1bNLqdvr8JEqq9QI0X1Q)
安盛推出適用于航班延誤的智能合約保險產品:全球第二大金融公司、保險巨頭安盛(AXA)推出了一項以太坊公鏈上的智能合約保險產品。這款名為Fizzy的產品與之前稱為FlightDelay的Etherisc類似,個人支付保險費,如果航班延誤超過兩個小時,則自動獲得賠償。[2018/6/19]
而同樣的事件也在另外一個合約中上演,接下來我們將介紹6月底的VETH合約漏洞事件。
2.2.2 VETH項目事件
2020年6月30,VETH項目被爆出漏洞。本次事件中“越俎代庖”的主角則是合約中的changeExcluded函數的external修飾符。
external修飾符使得任何人都可以調用changeExcluded函數來繞過transferFrom函數內部的授權轉賬額度檢查,將合約的VETH代幣盜走。
此次事件,攻擊者利用此漏洞盜走919299個VETH后大量拋售,導致VETH代幣價值瞬間流失。詳細見(https://mp.weixin.qq.com/s/plbSmpMfvIk_A457GoUaQA)涉及到的合約代碼如下圖所示:
通過以上兩個案例,相信大家已經意識到了合約中“越俎代庖”事件的嚴重影響,那么如何在合約代碼編寫的過程中有效的區分“俎”與“庖”呢?
2.3“俎”、“庖”信息大揭秘
針對越權事件,首先需要合約開發人員了解函數可見性。
函數的可見性,一共有external、public、internal和private四種:
External
外部函數作為合約接口的一部分,意味著我們可以從其他合約和交易中調用。 一個外部函數 f 不能從內部調用(即 f 不起作用,但 this.f() 可以)。 當收到大量數據的時候,外部函數有時候會更有效率,因為數據不會從calldata復制到內存.
Public
public 函數是合約接口的一部分,可以在內部或通過消息調用。對于 public 狀態變量, 會自動生成一個 getter 函數(見下面)。
Internal
這些函數和狀態變量只能是內部訪問(即從當前合約內部或從它派生的合約訪問),不使用 this 調用。
Private
private 函數和狀態變量僅在當前定義它們的合約中使用,并且不能被派生合約使用。
開發人員在構造一個函數時,應當遵循這些可見性進行開發,要明確哪些函數是可以由用戶調用的“俎”,而哪些又是合約中不能任意替代的“庖”,以最小原則進行分配。
比如一個函數safeTransfer在設計時是用于轉賬操作的,用戶可以通過調用此函數,轉賬此合約發行的代幣。我們使用public和external都可以滿足需求,但就安全的角度,我們應當使用external,避免合約內對此函數進行調用,造成不可預期的風險。如存在有一個safeTransferFrom函數,用戶可以通過授權給此合約其他代幣,將其他代幣轉移到一個指定地址的,當_token等于合約本身時,就會以合約本身的身份調用sadeTransfer函數,即而將合約內的錢轉到其他地址。
然而只是遵循函數可見性是遠遠不夠的,函數的可見性,只是區分了合約內部、繼承合約和外部這三個界限,遠遠不能滿足我們的需求。想要達到較為完善的權限管理,我們應當引入“角色”的概念,如:管理員、普通用戶、特權用戶等。在合約中存儲這些角色的地址,通過判斷地址或標志變量來進行權限的控制。如下圖所示:
通過修飾器對這些不同的“角色”進行管理,如使用onlyOwner修飾器,限制特定的地址才可調用此函數。對應“角色”的權限管理。使用修飾器的方式,可以更加清晰的判斷出是否存在紕漏。
就鏈上現狀來看,智能合約權限管理錯誤造成的漏洞比比皆是,其中不乏很多“著名項目”,而此類漏洞造成的損失也是巨大的。成都鏈安安全團隊依據多年合約審計和鏈上分析安全經驗給出以下幾點建議:
1、 遵循權限最小化開發原則,在設計函數時應當就規劃好可見性。
2、 建立角色機制,使用修飾器對各函數進行權限管理,避免紕漏。
3、 上線前一定找專業機構做好代碼審計,正所謂“一人一個腦,做事沒商討;十人十個腦,辦法一大套”。
自從十多年前創建以來,比特幣就與世界各地的監管者保持著緊張的關系。美國早在2012年就考慮了關閉比特幣的可能性,據報道,就在上個月,美國總統唐納德·特朗普告訴財政部長史蒂夫·姆努欽(SteveM.
1900/1/1 0:00:00暴走時評:區塊鏈技術可以幫助建立一個自我主權的金融體系,而捍衛這種體系至關重要的隱私權則應當歸屬于人民。與流行的看法相反,隱私并不是為那些試圖遮遮掩掩的人準備的,而是為那些失去一切的人準備的.
1900/1/1 0:00:00價格沿下降趨勢線持續震蕩整理,成交量持續萎縮,日線指標線持續粘合,明顯即將變盤的前兆,今日反彈高點9230美金,就已經突破下降壓制線了,只是量能還未放大,目前價格還未站穩,價格再次回落.
1900/1/1 0:00:00據TheBlock數據報告,穩定幣交易量在6月創下了549億美元的歷史新高,比上個月的482億美元增長了約14%。交易量仍然是由Tether所發行的USDT占主導地位.
1900/1/1 0:00:00金色財經 區塊鏈6月25日訊 六月中旬,基于算法的去中心化金融協議Compound批準了一項提案,允許將其原生代幣COMP代幣分發給平臺上的借款人和貸款人.
1900/1/1 0:00:00據BitUniverse幣優交易所平臺幣銷毀所需年限數據顯示,HT的銷毀所需年限,僅為5.82年(銷毀所需年限=總市值/過去一年已銷毀價值),遠低于其它頭部平臺的銷毀所需年限.
1900/1/1 0:00:00