TMT观察网_独特视角观察TMT行业

彎道超車老司機戲耍智能合約 | 成都鏈安漏洞分析連載第三期 —— 競態條件漏洞區塊鏈

成都鏈安科技 2018-08-03 21:15
分享到:
導讀

引子:至道問學之有知無行,分溫故為存心,知新為致知,而敦厚為存心,崇禮為致知,此皆百密一疏。——清·魏源《庸易通義》

針對區塊鏈安全問題,成都鏈安科技團隊每一周都將出智能合約安全漏洞解析連載,希望能幫助程序員寫出更加安全牢固的合約,防患于未然。

引子:至道問學之有知無行,分溫故為存心,知新為致知,而敦厚為存心,崇禮為致知,此皆百密一疏。

—— 清·魏源《庸易通義》

卻說“DoS攻擊重現區塊鏈江湖,縝密防范助陣安全陣營”,例外判定合力數據結構的加固,亦使老牌勁敵DoS節節敗退。

此回:“重入”“競態”里應外合幣窮財盡,“交互”“限制”強強聯手鏈泰民安

區塊鏈的“高速公路”在川流不息的同時,卻也事故頻發。究其緣由,大批投資者涌入這個似乎暢通無阻,通向明日輝煌的康莊大道,都躍躍欲試一場“速度與激情”,展開對成功的追逐賽。未曾想,挑戰者中并非只有彼此,一襲黑衣,手段了得的選手大有人在,這些處心積慮的黑客總有辦法讓智能合約看似神通廣大,實則百密一疏。

5.jpg

這一回,我們將重點剖析競態條件漏洞的兩種形式,重入漏洞以及交易順序依賴漏洞。

事件回顧

2016年4月,完全自治,去中心化的項目DAO啟動,立刻成為最受歡迎的以太坊項目,然而在其發布之后,有開發者警告DAO的發起者,在splitDAO函數中潛伏著遞歸調用漏洞[1]。 2016年6月14日,DAO的項目方聲稱漏洞已被定位,資金和合約安全已受到保障。

然而就在3天之后,6月17日,黑客卻利用上述漏洞向DAO發起攻擊,360萬以太幣岌岌可危,超過6百萬美元的資金被源源不斷地被黑客暗度陳倉,著實來了一場“無間DAO”。

6.jpg

事件發生后,DAO負責人采取措施減緩了資金流失的速度,以太坊也在7月修改源碼幫助DAO轉移資金,嘗試奪回失竊資金,卻導致了以太坊的硬分叉[2]。

想要分析黑客如何對DAO的資金探囊取物,就不得不提到競態條件這個術語。 

什么是競態條件

競態條件的官方定義是如果程序的執行順序改變會影響結果,它就屬于一個競態條件 [3]。

在智能合約中,競態條件漏洞被攻擊者利用后,攻擊者利用一個與存在漏洞合約平起平坐的外部合約競爭奪取控制權,改變該智能合約的行為。

用一個形象的比喻來說明,將智能合約理解成一條高速公路,所有函數和功能理解為車輛,原本的執行順序規定了車輛經過的順序,此時一名熟練的老司機,駕駛著GTR在彎道超車加塞,擾亂了整個道路的秩序,搶占了在道路中的領先地位,進而為所欲為,戲耍合約規則。

7.jpg

以太坊智能合約的特點之一是能夠調用和利用其它外部合約的代碼,調用外部合約主要存在的危險就是外部合約可以接管控制流,并對調用函數不期望的數據進行更改。這類漏洞有多種形式,我們在這里深度解析重入和交易順序依賴兩種。

競態條件漏洞分析及詳細修復建議

1.   重入漏洞(Reentrancy)

問題描述

合約通常用來處理 Ether,因此通常會將 Ether 發送給各種外部用戶地址。調用外部合約或將以太網發送到地址的操作需要合約提交外部調用。這些外部調用可能被攻擊者劫持,迫使合約執行進一步的代碼(即通過回退函數),包括回調自身。因此代碼執行"重新進入"合約。這種攻擊被用于上述臭名昭著的DAO 攻擊。

我們把存在漏洞的合約簡化成如下案例合約:

1.png

該合約有兩個函數:depositFunds()和withdrawFunds(),depositFunds()的功能是增加msg.sender的余額,withdrawFunds()的功能是取出msg.sender指定的數值為_weiToWithdraw的Ether。

現在,一個攻擊者創建了下列合約:

2.png

PS:注意此處由于重入攻擊造成了balances[msg.sender]溢出,強烈推薦所有數學運算都使用SafeMath進行,這個要點我們在第一期溢出漏洞中已經提到(敲黑板)。

我們來分析下該合約是如何進行重入攻擊的:

1、假設普通用戶向原合約(Reentrancy.sol)存入15 ether;

2、攻擊者部署攻擊合約(POC.sol),并調用setInstance()指向原合約部署地址;

3、攻擊者調用攻擊合約的depositEther()函數,預先向原合約預存1 ether,此時, 在原合約中,攻擊合約的地址有1 ether余額;

4、攻擊者調用攻擊合約的withdrawFunds()函數,該函數再調用原合約的withdrawFunds()函數,并傳參1 ether;

5、進入原合約,withdrawFunds()函數的第一行require(balances[msg.sender] >= _weiToWithdraw);,攻擊合約地址下余額為1 ether,等于_weiToWithdraw,條件滿足,進入下一行;

6、withdrawFunds()函數的第二行require(msg.sender.call.value(_weiToWithdraw)());,向msg.sender轉入_weiToWithdraw(此時是1 ether),由于msg.sender是合約地址,solidity規定向合約地址接收到ether時如果未指定其他有效函數,那么默認會調用合約的fallback函數,執行流進入攻擊合約,并調用攻擊合約的fallback函數,并且,因為是通過call.value()()方式發送以太幣,該方法會發送所有剩余gas;

7、進入攻擊合約的fallback函數,if判斷原合約余額,此時為16 ether,條件滿足,再次"重入"原合約的withdrawFunds()函數;

8、再次進入原合約的withdrawFunds()函數,因為balances[msg.sender] -= _weiToWithdraw;并未執行,所以此時攻擊合約地址仍有1 ether,第一個require條件滿足,執行到第二個require;

9、此后步驟6-8將一直重復,直到原合約余額少于1 ether或者gas耗盡;

10、最后進入原合約,執行balances[msg.sender] -= _weiToWithdraw;,注意,此處會從balances[msg.sender]中減去所有提取的ether,導致balances[msg.sender]溢出,如果此處使用SafeMath,可以通過拋出異常的方式避免重入攻擊。

最終的結果是攻擊者只使用了1 ether,就從原合約中取出了所有的ether。

漏洞修復

1、 在可能的情況下,將ether發送給外部地址時使用solidity內置的transfer()函數[4],transfer()轉賬時只發送2300 gas,不足以調用另一份合約(即重入發送合約),使用transfer()重寫原合約的withdrawFunds()如下;

3.png

2、 確保狀態變量改變發生在ether被發送(或者任何外部調用)之前,即Solidity官方推薦的檢查-生效-交互模式(checks-effects-interactions);

4.png

3、 使用互斥鎖:添加一個在代碼執行過程中鎖定合約的狀態變量,防止重入調用

5.png

接述事件回顧,重入在DAO攻擊中發揮了重要作用,最終導致了 Ethereum Classic(ETC)的分叉。有關The DAO原始漏洞的詳細分析,請參閱Phil Daian的文章。

2.    交易順序依賴攻擊

問題描述

與大多數區塊鏈一樣,以太坊節點匯集交易并將其形成塊。一旦礦工解決了共識機制(目前Ethereum的 ETHASH PoW),這些交易就被認為是有效的。解決該區塊的礦工也會選擇來自該礦池的哪些交易將包含在該區塊中,這通常是由gasPrice交易決定的。在這里有一個潛在的攻擊媒介。攻擊者可以觀察事務池中是否存在可能包含問題解決方案的事務,修改或撤銷攻擊者的權限或更改合約中的對攻擊者不利的狀態。然后,攻擊者可以從這個事務中獲取數據,并創建一個更高級別的事務gasPrice 并在原始之前將其交易包含在一個區塊中。

我們來看如下案例漏洞合約:

6.png

這個合約包含1000個ether,找到并提交正確答案的用戶將得到這筆獎勵。當一個用戶找出答案Ethereum!。他調用solve函數,并把答案Ethereum!作為參數。不幸的是,攻擊者可以觀察交易池中任何人提交的答案,他們看到這個解決方案,檢查它的有效性,然后提交一個遠高于原始交易的gasPrice的新交易。解決該問題的礦工可能會因攻擊者的gasPrice更高而先打包攻擊者的交易。攻擊者將獲得1000ether,最初解決問題的用戶將不會得到任何獎勵(合約中沒有剩余ether)。

漏洞修復

有兩類用戶可以進行這種的提前交易攻擊。用戶(修改他們的交易的gasPrice)和礦工自己(他們可以按照他們認為合適的方式重新排序交易)。一個易受第一類(用戶)攻擊的合約比一個易受第二類(礦工)攻擊的合約明顯更糟糕,因為礦工只能在解決一個區塊時執行攻擊,這對于任何針對特定區塊的單個礦工來說都是不可能的。在這里,我將列出一些與他們可能阻止的攻擊類別相關的緩解措施。

可以采用的一種方法是在合約中創建限制條件,即gasPrice上限。這可以防止用戶增加gasPrice并獲得超出上限的優先事務排序。這種預防措施只能緩解第一類攻擊者(任意用戶)的攻擊。在這種情況下,礦工仍然可以攻擊合約,因為無論gasPrice如何,他們都可以根據需要排序交易。

更可靠的方法是盡可能使用提交---披露方案(commit-reveal)。這種方案規定用戶使用隱藏信息(通常是散列)發送交易。在交易已包含在塊中之后,用戶發送一個交易解密已經發送的數據(披露階段)。此方法可防止礦工和用戶進行前瞻性交易,因為他們無法確定交易內容。然而,這種方法無法隱藏交易價值(在某些情況下,這是需要隱藏的有價值信息)。 ENS智能合約允許用戶發送交易,其承諾數據包括他們愿意花費的以太數量。然后,用戶可以發送任意值的交易。在披露階段,用戶退還了交易中發送的金額與他們愿意花費的金額之間的差額。

前事不忘,后事之師

DAO事件在當時區塊鏈行業轟動一時,損失之重,令無數投資人捶胸頓足,我們總結下來,為了防止類似的情況發生,開發者應注意以下幾點:

  1. 開發過程中注意查閱Solidity或者其他官方語言中是否已給出相關內置函數或者嚴謹的交互模式,如有應嚴格遵守,切不可異想天開;

  2. 勤于思考狀態變量有可能發生的意外,對有潛在問題的狀態變量應予以鎖定;

  3. 綜合運用gas限制以及披露方案,保障交易信息在合理的環節以合理的形式呈現。

區塊鏈時代的安全問題都帶有互聯網發展早期的影子,安全知識的遷移以及防范意識的提升將會是斬除隱患的利刃。

欲知后事,且看下回:底層函數調用險象環生 外部功能慎用防患未然

引用:

[1]:  

https://courses.csail.mit.edu/6.857/2017/project/23.pdf

[2]:

http://baijiahao.baidu.com/s?id=1587206953375229861&wfr=spider&for=pc

[3]:

https://blog.csdn.net/Clifnich/article/details/78447524

[4]: 

https://blog.sigmaprime.io/solidity-security.html#race-conditions

合約 攻擊 交易 函數 漏洞
分享到:

1.TMT觀察網遵循行業規范,任何轉載的稿件都會明確標注作者和來源;
2.TMT觀察網的原創文章,請轉載時務必注明文章作者和"來源:TMT觀察網",不尊重原創的行為TMT觀察網或將追究責任;
3.作者投稿可能會經TMT觀察網編輯修改或補充。


專題報道

主站蜘蛛池模板: 中国在职研究生招生信息网| IIS7站长之家-站长工具-爱网站请使用IIS7站长综合查询工具,中国站长【WWW.IIS7.COM】 | 仿古建筑设计-仿古建筑施工-仿古建筑公司-汉匠古建筑设计院 | 品牌广告服务平台,好排名,好流量,好生意。 | 高压直流电源_特种变压器_变压器铁芯-希恩变压器定制厂家 | 仿古建筑设计-仿古建筑施工-仿古建筑公司-汉匠古建筑设计院 | 防爆大气采样器-防爆粉尘采样器-金属粉尘及其化合物采样器-首页|盐城银河科技有限公司 | 导电银胶_LED封装导电银胶_半导体封装导电胶厂家-上海腾烁 | 西宁装修_西宁装修公司-西宁业之峰装饰-青海业之峰墅级装饰设计公司【官网】 | 智能门锁电机_智能门锁离合器_智能门锁电机厂家-温州劲力智能科技有限公司 | 钢板仓,大型钢板仓,钢板库,大型钢板库,粉煤灰钢板仓,螺旋钢板仓,螺旋卷板仓,骨料钢板仓 | 手持式线材张力计-套帽式风量罩-深圳市欧亚精密仪器有限公司 | 间苯二酚,间苯二酚厂家-淄博双和化工 | 等离子表面处理机-等离子表面活化机-真空等离子清洗机-深圳市东信高科自动化设备有限公司 | 上海佳武自动化科技有限公司 | 石家庄网站建设|石家庄网站制作|石家庄小程序开发|石家庄微信开发|网站建设公司|网站制作公司|微信小程序开发|手机APP开发|软件开发 | 定做大型恒温循环水浴槽-工业用不锈钢恒温水箱-大容量低温恒温水槽-常州精达仪器 | 塑料检查井_双扣聚氯乙烯增强管_双壁波纹管-河南中盈塑料制品有限公司 | ★店家乐|服装销售管理软件|服装店收银系统|内衣店鞋店进销存软件|连锁店管理软件|收银软件手机版|会员管理系统-手机版,云版,App | 东莞压铸厂_精密压铸_锌合金压铸_铝合金压铸_压铸件加工_东莞祥宇金属制品 | 圆窗水平仪|伊莉莎冈特elesa+ganter | 袋式过滤器,自清洗过滤器,保安过滤器,篮式过滤器,气体过滤器,全自动过滤器,反冲洗过滤器,管道过滤器,无锡驰业环保科技有限公司 | 酒吧霸屏软件_酒吧霸屏系统,酒吧微上墙,夜场霸屏软件,酒吧点歌软件,酒吧互动游戏,酒吧大屏幕软件系统下载 | 十二星座查询(性格特点分析、星座运势解读) - 玄米星座网 | 中山市派格家具有限公司【官网】 | 立式硫化罐-劳保用品硫化罐-厂家直销-山东鑫泰鑫硫化罐厂家 | 厦门ISO认证|厦门ISO9001认证|厦门ISO14001认证|厦门ISO45001认证-艾索咨询专注ISO认证行业 | 篮球架_乒乓球台_足球门_校园_竞技体育器材_厂家_价格-沧州浩然体育器材有限公司 | 杭州代理记账费用-公司注销需要多久-公司变更监事_杭州福道财务管理咨询有限公司 | 聚合甘油__盐城市飞龙油脂有限公司 | 粉末冶金注射成型厂家|MIM厂家|粉末冶金齿轮|MIM零件-深圳市新泰兴精密科技 | 国际金融网_每日财经新资讯网 | 仿清水混凝土_清水混凝土装修_施工_修饰_保护剂_修补_清水混凝土修复-德州忠岭建筑装饰工程 | 窖井盖锯圆机_锯圆机金刚石锯片-无锡茂达金刚石有限公司 | 喷码机,激光喷码打码机,鸡蛋打码机,手持打码机,自动喷码机,一物一码防伪溯源-恒欣瑞达有限公司 | 电动高尔夫球车|电动观光车|电动巡逻车|电动越野车厂家-绿友机械集团股份有限公司 | 质检报告_CE认证_FCC认证_SRRC认证_PSE认证_第三方检测机构-深圳市环测威检测技术有限公司 | 冻干机(冷冻干燥机)_小型|实验型|食品真空冷冻干燥机-松源 | 哈尔滨京科脑康神经内科医院-哈尔滨治疗头痛医院-哈尔滨治疗癫痫康复医院 | 汕头市盛大文化传播有限公司,www.11400.cc | 北京网站建设首页,做网站选【优站网】,专注北京网站建设,北京网站推广,天津网站建设,天津网站推广,小程序,手机APP的开发。 |