国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

區(qū)塊鏈智能合約安全開發(fā)技術(shù)研究與實現(xiàn)※

2019-01-02 08:24:48畢曉冰馬兆豐徐明昆
信息安全與通信保密 2018年12期
關(guān)鍵詞:以太合約漏洞

畢曉冰,馬兆豐,徐明昆

(1.北京郵電大學(xué)網(wǎng)絡(luò)技術(shù)研究院,北京100876;2.北京郵電大學(xué)網(wǎng)絡(luò)空間安全學(xué)院,北京 100876)

智能合約是一種計算機協(xié)議。以太坊是一個公有區(qū)塊鏈平臺,是目前最先進的支持智能合約的區(qū)塊鏈平臺。以太坊虛擬機負(fù)責(zé)將用戶編寫的智能合約代碼編譯成位碼[1-2]。

以太坊智能合約漏洞的出現(xiàn)其實跟自身的語法(語言)特性有很大的關(guān)系。 在以太坊(今天最著名的智能合約平臺)中編寫表現(xiàn)良好且安全合同的創(chuàng)建過程是一項艱巨的任務(wù)。關(guān)于這一主題的研究最近才在工業(yè)和科學(xué)領(lǐng)域開始。

自智能合約發(fā)行以來,頻發(fā)區(qū)塊鏈漏洞諸多案例:美鏈蒸發(fā)60億事件;區(qū)塊鏈界最大眾籌項目Decentralized Autonomous Organization(TheDAO)被攻擊事件;交易所用戶被釣魚導(dǎo)致 APIKEY 泄漏; MyEtherWallet 遭域名系統(tǒng)Domain Name System(DNS)劫持致使用戶Ether(ETH)被盜等等。頻頻爆出的區(qū)塊鏈安全事件,使得越來越多的安全從業(yè)者將目標(biāo)轉(zhuǎn)到了智能合約上。對智能合約漏洞進行分析與應(yīng)對顯得尤其重要。

維也納大學(xué)基于Solidity語言闡述了幾種常見的智能合約安全模式。所呈現(xiàn)的模式描述典型安全問題的解決方案??ɡ麃喞锎髮W(xué)系統(tǒng)闡述以太坊及其高級語言Solidity的安全漏洞。本文分析以太坊基于Solidity語言的重入、數(shù)據(jù)溢出、短地址攻擊三個典型漏洞作為智能合約開發(fā)人員的參考,重現(xiàn)漏洞攻擊過程并且在分析其成因的基礎(chǔ)上提出安全模式下的應(yīng)對策略[4-6]。

1 智能合約關(guān)鍵技術(shù)介紹

1.1 以太坊

比特幣的設(shè)計僅適合虛擬貨幣場景,由于存在非圖靈完備性、缺少保存狀態(tài)的賬戶概念、POW挖礦機制所帶來的資源浪費與效率問題,在很多區(qū)塊鏈應(yīng)用場景中并不適用,以太坊在此情況下應(yīng)運而生。

以太坊是通用的全球性區(qū)塊鏈,可以管理應(yīng)用的狀態(tài)。同時以太坊完美結(jié)合了區(qū)塊鏈與智能合約。它通過工作量證明機制實現(xiàn)共識,由礦工挖礦,通過P2P網(wǎng)絡(luò)廣播協(xié)議來實現(xiàn)對區(qū)塊鏈的同步等操作。在以太坊上編寫智能合約,可進行去中心化應(yīng)用的開發(fā),以滿足金融或非金融的應(yīng)用需求[1-2]。

在以太坊上部署的智能合約運行在以太坊特有的虛擬機上,通過以太坊虛擬機Ethereum Virtual Machine(EVM)和Remote Procedure Call(RPC)遠(yuǎn)程調(diào)用接口與底層區(qū)塊鏈交互。

1.2 智能合約

計算機科學(xué)家Nick Szabo描述到:智能合約是一個由計算機處理、執(zhí)行的用于實現(xiàn)應(yīng)用的協(xié)議。其總體目標(biāo)是能夠滿足普通的合約條件,如支付、抵押、保密甚至強制執(zhí)行。

從技術(shù)角度講,智能合約可以被看作一種計算機程序代碼,這種程序不經(jīng)人為干涉,可以自主地執(zhí)行全部或部分合約相關(guān)的操作。這種程序產(chǎn)生相應(yīng)的可以被驗證的證據(jù),從而體現(xiàn)執(zhí)行合約操作的有效性。

以太坊上的一個智能合約就是一段可以被以太坊虛擬機執(zhí)行的代碼,這些代碼以以太坊特有的二進制形式存儲在區(qū)塊鏈上,并由以太坊虛擬機解釋,因此被稱為以太坊虛擬機位碼(bytecode)。

智能合約一旦部署成功,就不能修改,因此出現(xiàn)漏洞就無法及時修正。

1.3 安全漏洞

以太坊的智能合約漏洞根據(jù)引入的級別將漏洞分為三類:Solidity、EVM字節(jié)碼、區(qū)塊鏈。詳細(xì)分類如下。

Solidity類:以太坊費用(Gas)快速消耗、誤操作異常、可重入攻擊、調(diào)用未知狀態(tài)、輸入類型。

EVM字節(jié)碼:不可改變的錯誤、堆棧大小限制、以太幣傳輸丟失、短地址漏洞。

區(qū)塊鏈:可預(yù)測的隨機處理、時間戳依賴、不可預(yù)測狀態(tài)。

1.4 Solidity

Solidity 是一種語法類似 JavaScript 的合約開發(fā)語言,是編寫智能合約最流行的編程語言。開發(fā)者按一定的業(yè)務(wù)邏輯編寫合約代碼。編寫后的智能合約發(fā)布在以太坊上,代碼根據(jù)業(yè)務(wù)邏輯將紀(jì)錄上鏈。以太坊更像是一個應(yīng)用生態(tài)平臺。發(fā)布合約,在以太坊上供業(yè)務(wù)直接使用。

使用Solidity進行合同開發(fā)時,合同的結(jié)構(gòu)類似于面向?qū)ο缶幊陶Z言中的類。 合同代碼由讀取和修改這些變量和函數(shù)的變量和函數(shù)組成,就像傳統(tǒng)的命令式編程一樣[7]。

2 智能合約漏洞分析

2.1 美鏈漏洞

由EVM指令集的限制,所有的指令都是針對256位這個基本的數(shù)據(jù)單位進行的操作,具備常用的算數(shù)、位、邏輯和比較操作。

美鏈漏洞就是因為操作數(shù)據(jù)發(fā)生溢出,黑客利用此轉(zhuǎn)出近60億人民幣,導(dǎo)致BEC代幣的市值接近歸0,產(chǎn)生巨大損失。

2.1.1 關(guān)鍵函數(shù)

不安全代碼:

batchTransfer函數(shù)功能為批量給若干用戶地址轉(zhuǎn)入_value個代幣。

2.1.2 攻擊原理

攻擊者傳入兩個地址,value值為2^255,當(dāng)參數(shù)傳入時未進行溢出判斷;合約中語句uint256 amount = uint256(cnt) ※ _value;執(zhí)行后也未進行溢出判斷;即假設(shè)uint256最大值為MAX的話,如果轉(zhuǎn)賬數(shù)值 uint256(cnt) ※ _value== MAX+1,則amount=0,轉(zhuǎn)賬的時候,sender賬戶-amount,而接受者賬戶+_value,至此,就能夠無限轉(zhuǎn)賬BEC了。

在remix中調(diào)用函數(shù)batchTransfer,向兩個地址轉(zhuǎn)入token值_amount=2^255,即["0x14723a 09acff6d2a60dcdf7aa4aff308fddc160c","0x4b0897b 0513fdc7c541b6d9d7e929c4e5364d2db"]," 0x8000 000000000000000000000000000000000000000000 000000000000000000"

2.1.3 分析及安全應(yīng)對模式

使用safeMath函數(shù),safeMath函數(shù)是為了計算機安全而寫的一個library函數(shù)如下。

使用safeMath函數(shù)的乘法在計算后,用assert 驗證了結(jié)果是否正確。

計算 amount的時候,用了 mul的話, 則 c /a == b 也就是 驗證 amount / cnt == _value此句執(zhí)行報錯,因為 0 / cnt 不等于 _value,也就不會發(fā)生溢出了。

EVM指令集的指令位數(shù)為256,即其所能處理的有符號數(shù)據(jù)的值范圍為-2^255~2^255,無符號的數(shù)據(jù)范圍為0~2^256-1。超出EVM所限制的范圍將會發(fā)生數(shù)據(jù)溢出。因此在使用數(shù)據(jù)時一定要進行溢出判斷;對數(shù)據(jù)進行操作時用safeMath函數(shù)。

安全模式代碼如下:

2.1.4 安全代碼不安全代碼執(zhí)行結(jié)果

安全代碼不安全代碼執(zhí)行結(jié)果對比圖如圖1~圖2所示。

圖1 賬戶"0x14723a09acff6d2a60dcdf7aa4aff308fddc160c"余額

圖2 賬戶"0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2 db"余額

安全代碼執(zhí)行結(jié)果如圖3所示。

圖3 安全代碼執(zhí)行結(jié)果

2.2 短地址漏洞

短地址攻擊通常發(fā)生在接受畸形地址的地方,如交易所提幣、錢包轉(zhuǎn)賬。

早在2017年4月,Golem項目發(fā)布一篇博文,內(nèi)容涉及一個影響Poloniex等交易所的安全漏洞。根據(jù)該帖子,當(dāng)某些交易所處理ERC20令牌的交易時,沒有對賬戶地址長度進行輸入驗證。結(jié)果是提供給合同的轉(zhuǎn)移函數(shù)的輸入數(shù)據(jù)格式不正確,以及操縱發(fā)送金額的后續(xù)下溢條件。影響是攻擊者可能會盜走用戶的token。

2.2.1 關(guān)鍵函數(shù)

sendcoin函數(shù)功能為向參數(shù)為to 地址轉(zhuǎn)入值為 amount個 token。

2.2.2 攻擊原理

取一個最后一個字節(jié)為00的地址,示例為0x254d383ab537ebeab73f816df8e1598f1321bc00,調(diào)用sendCoin函數(shù),傳入地址參數(shù)截掉最后一個字節(jié),即向地址:

0x254d383ab537ebeab73f816df8e1598f1321 bc,轉(zhuǎn)入1個token。

"0x254d383ab537ebeab73f816df8e1598f1321 bc"," 0x00000000000000000000000000000000000 00000000000000000000000000001"。執(zhí)行后發(fā)現(xiàn)轉(zhuǎn)入的amount值為即256。

2.2.3 分析及安全應(yīng)對模式

EVM在進行sendcoin函數(shù)調(diào)用時傳參。交易的輸入數(shù)據(jù)由三部分組成。第一部分4個字節(jié)為方法的哈希值0xb90b98a11。第二部分32字節(jié)為以太坊的地址:

0x000000000000000000000000254d383ab537 ebeab73f816df8e1598f1321bc,由于地址為20字節(jié)因此高位自動補零。第三部分為32字節(jié),在此函數(shù)中為需要傳輸?shù)拇鷰诺臄?shù)量為:

0x000000000000000000000000000000000000 0000000000000000000000000001。

輸入值:

0xb90b98a11000000000000000000000000254 d383ab537ebeab73f816df8e1598f1321 bc00000000 000000000000000000000000000000000000000000 00000000000001共67字節(jié)。

EVM在執(zhí)行時按照每一部分的位數(shù),自動補取值。即取到的地址最后字節(jié)為amount參數(shù)的最高字節(jié)為0x254d383ab537ebeab73f816df8e1 598f1321bc00,由此導(dǎo)致第三部分的參數(shù)少了一個字節(jié),末尾自動補零,即amount 值為:

0x000000000000000000000000000000000000 0000000000000000000100000000,即1<<8由原來的數(shù)值1變?yōu)?56。由此取出的代幣值遠(yuǎn)遠(yuǎn)大于原有應(yīng)取出的值。使得合約調(diào)用者發(fā)生代幣損失。

所以除了在編寫合約的時候需要嚴(yán)格驗證輸入數(shù)據(jù)的正確性,而且在業(yè)務(wù)功能上也要對用戶所輸入的地址格式進行驗證,防止短地址攻擊的發(fā)生。

針對這個漏洞,以太坊有不可推卸的責(zé)任,因為EVM并沒有嚴(yán)格校驗地址的位數(shù),并且還擅自自動補充消失的位數(shù)。此外,交易所在提幣的時候,需要嚴(yán)格校驗用戶輸入的地址,這樣可以盡早在前端就禁止掉惡意的短地址。

2.2.4安全代碼不安全代碼執(zhí)行結(jié)果

不安全代碼執(zhí)行結(jié)果如圖4、圖5所示。

圖4 調(diào)用前賬戶"0x254d383ab537ebeab73f816df8e1598f13 21bc00"余額

圖5 調(diào)用后賬戶"0x254d383ab537ebeab73f816df8e1598f13 21bc00"余額

進行前端控制輸入后的執(zhí)行結(jié)果如圖6所示。

圖6 前端控制輸入執(zhí)行結(jié)果

2.3 重入漏洞

在執(zhí)行智能合約時調(diào)用外部合約有很大的風(fēng)險,因為此外部合約可以接管你當(dāng)前合約的控制流程,惡意的外部合約可能會更改合約中的關(guān)鍵數(shù)據(jù),這對當(dāng)前合約造成的影響是巨大的。

當(dāng)初始執(zhí)行完成之前,外部合同調(diào)用被允許對調(diào)用合同進行新的調(diào)用時,就會發(fā)生重新進入。對于函數(shù)來說,這意味著合同狀態(tài)可能會在執(zhí)行過程中因為調(diào)用不可信合同或使用具有外部地址的低級函數(shù)而發(fā)生變化。

2.3.1 關(guān)鍵函數(shù)

該合約實現(xiàn)的是一個公共錢包功能。用戶可以向錢包存錢,合約會記錄每個用戶的資產(chǎn)情況。每個用戶也可以轉(zhuǎn)賬給合約內(nèi)的用戶。

2.3.2 攻擊原理

攻擊者部署一個惡意遞歸調(diào)用,利用EVM在交易時目標(biāo)地址如果是個合約地址,那么默認(rèn)會調(diào)用該合約的 fallback 函數(shù)。fallback函數(shù)在合約里顯示為無返回值,無函數(shù)名。攻擊者通過重寫fallback函數(shù),在其內(nèi)部進行進行withdraw函數(shù)的調(diào)用。從而遞歸提取目標(biāo)用戶的所有資產(chǎn)。

2.3.3 分析及安全應(yīng)對模式

deposit函數(shù)的功能是外部用戶向該合約錢包存錢。withdraw函數(shù)為向合約內(nèi)的其他用戶轉(zhuǎn)錢。而withdraw函數(shù)里轉(zhuǎn)賬所用關(guān)鍵語句為to.call.value(amount)();該語句會將剩余的 Gas 全部給予外部調(diào)用(fallback 函數(shù))。不能有效防止重入。

send相對transfer方法較底層,不過使用方法和transfer相同,都是從合約發(fā)起方向某個地址轉(zhuǎn)入以太幣(單位是wei),地址無效或者合約發(fā)起方余額不足時,send不會拋出異常,而是直接返回false。

send()方法執(zhí)行時有一些風(fēng)險,調(diào)用遞歸深度不能超1024。如果gas不夠,執(zhí)行會失敗。所以使用這個方法要檢查成功與否。transfer相對send較安全。

安全模式代碼:

使用transfer函數(shù)可以有效防止重入。

當(dāng)發(fā)送失敗時會 throw; 回滾狀態(tài);只會傳遞2300 Gas 供調(diào)用,防止重入。

2.3.4 安全代碼不安全代碼執(zhí)行結(jié)果

不安全代碼執(zhí)行結(jié)果如圖7所示。

圖7 發(fā)生重入執(zhí)行結(jié)果

安全代碼執(zhí)行結(jié)果如圖8所示。

圖8 安全代碼執(zhí)行結(jié)果

3 實驗結(jié)果及評測

3.1 運行環(huán)境及檢測工具

智能合約編譯環(huán)境:Browser-Solidity;

運行平臺:macOS 10.13.2;

檢測工具Security、SmartCheck。

3.2 檢測結(jié)果及分析

美鏈漏洞檢測結(jié)果如圖9所示。

圖9 美鏈安全代碼檢測結(jié)果

結(jié)果表明改進后的代碼即使用safemath函數(shù)能有效的防止操作數(shù)的溢出。

重入漏洞檢測如圖10、圖11所示。

圖10 重入漏洞不安全代碼檢測結(jié)果

圖11 重入漏洞安全代碼檢測結(jié)果

3.3 不安全模式與安全模式對比分析

針對美鏈漏洞即整數(shù)溢出問題、重入漏洞、短地址漏洞三個智能合約典型漏洞。其安全模式下的代碼與不安全代碼的對比分析如表1所示。

4 結(jié)語

建立在區(qū)塊鏈技術(shù)上的智能合約在新的業(yè)務(wù)應(yīng)用程序和科學(xué)界受到極大的關(guān)注。在以太坊中編寫安全的智能合約是一項艱巨的任務(wù)。

智能合約一經(jīng)發(fā)布便不可再修改,且為代碼公開的方式。因此,開發(fā)的時候一定要進行嚴(yán)格的代碼審查、代碼安全測試。本文通過對數(shù)據(jù)溢出、短地址攻擊、重入智能合約中的三種典型安全漏洞進行分析,重現(xiàn)攻擊并分析應(yīng)對策略給出了安全模式。有助于編寫更安全、良好的智能合約。

表1 不安全模式與安全模式對比分析

猜你喜歡
以太合約漏洞
以太極為旗,開啟新時代“黃河大合唱”
少林與太極(2023年7期)2023-08-25 05:27:52
漏洞
車易鏈:做汽車業(yè)的“以太坊”
汽車觀察(2018年9期)2018-10-23 05:46:24
三明:“兩票制”堵住加價漏洞
漏洞在哪兒
兒童時代(2016年6期)2016-09-14 04:54:43
高鐵急救應(yīng)補齊三漏洞
百通推出入門級快速工業(yè)以太網(wǎng)絡(luò)交換器系列
以太互聯(lián) 高效便捷 經(jīng)濟、可靠、易用的小型可編程控制器
自動化博覽(2014年6期)2014-05-29 09:40:16
合約必守,誰能例外!——對“情勢變更”制度不可寄于過高期望
湟中县| 丹阳市| 长治县| 昔阳县| 斗六市| 开江县| 通辽市| 措勤县| 唐山市| 乌海市| 宁安市| 鹿邑县| 革吉县| 陕西省| 湘西| 九龙城区| 洪泽县| 泉州市| 即墨市| 上饶市| 黎川县| 木里| 布拖县| 乌兰察布市| 原阳县| 怀远县| 静乐县| 新丰县| 平定县| 旺苍县| 南汇区| 库尔勒市| 湖北省| 新巴尔虎左旗| 东丽区| 鄄城县| 岳西县| 会昌县| 常宁市| 潮安县| 义乌市|