亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        區(qū)塊鏈智能合約安全開發(fā)技術(shù)研究與實(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)

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

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

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

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

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

        1.1 以太坊

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

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

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

        1.2 智能合約

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

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

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

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

        1.3 安全漏洞

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

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

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

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

        1.4 Solidity

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

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

        2 智能合約漏洞分析

        2.1 美鏈漏洞

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

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

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

        不安全代碼:

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

        2.1.2 攻擊原理

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

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

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

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

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

        計(jì)算 amount的時(shí)候,用了 mul的話, 則 c /a == b 也就是 驗(yàn)證 amount / cnt == _value此句執(zhí)行報(bào)錯(cuò),因?yàn)?0 / cnt 不等于 _value,也就不會(huì)發(fā)生溢出了。

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

        安全模式代碼如下:

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

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

        圖1 賬戶"0x14723a09acff6d2a60dcdf7aa4aff308fddc160c"余額

        圖2 賬戶"0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2 db"余額

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

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

        2.2 短地址漏洞

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

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

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

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

        2.2.2 攻擊原理

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

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

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

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

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

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

        0x000000000000000000000000000000000000 0000000000000000000000000001。

        輸入值:

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

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

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

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

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

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

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

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

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

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

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

        2.3 重入漏洞

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

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

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

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

        2.3.2 攻擊原理

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

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

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

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

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

        安全模式代碼:

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

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

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

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

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

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

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

        3 實(shí)驗(yàn)結(jié)果及評(píng)測(cè)

        3.1 運(yùn)行環(huán)境及檢測(cè)工具

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

        運(yùn)行平臺(tái):macOS 10.13.2;

        檢測(cè)工具Security、SmartCheck。

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

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

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

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

        重入漏洞檢測(cè)如圖10、圖11所示。

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

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

        3.3 不安全模式與安全模式對(duì)比分析

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

        4 結(jié)語

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

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

        表1 不安全模式與安全模式對(duì)比分析

        猜你喜歡
        以太合約漏洞
        以太極為旗,開啟新時(shí)代“黃河大合唱”
        少林與太極(2023年7期)2023-08-25 05:27:52
        漏洞
        車易鏈:做汽車業(yè)的“以太坊”
        汽車觀察(2018年9期)2018-10-23 05:46:24
        三明:“兩票制”堵住加價(jià)漏洞
        漏洞在哪兒
        高鐵急救應(yīng)補(bǔ)齊三漏洞
        百通推出入門級(jí)快速工業(yè)以太網(wǎng)絡(luò)交換器系列
        以太互聯(lián) 高效便捷 經(jīng)濟(jì)、可靠、易用的小型可編程控制器
        合約必守,誰能例外!——對(duì)“情勢(shì)變更”制度不可寄于過高期望
        亚洲中文高清乱码av中文| 97人人超碰国产精品最新o| 小12箩利洗澡无码视频网站| 免费啪啪av人妻一区二区| 综合久久久久6亚洲综合| 亚洲少妇一区二区三区老| 亚洲色一区二区三区四区| 四虎影视成人永久免费观看视频 | 免费国产黄网站在线观看| 国产片AV在线永久免费观看| 国产精品一级黄色大片| 国产精品亚洲综合久久系列| 精品一二三四区中文字幕| 日韩精品久久久久久免费| 久久久天堂国产精品女人| 2021国产精品久久| 高清av一区二区三区在线| 日本一二三四区在线观看| 天天躁日日躁aaaaxxxx| 国产在线无码制服丝袜无码| 久久精品国产只有精品96| 日本不卡视频一区二区三区| 九色综合九色综合色鬼| 91麻豆国产香蕉久久精品| 亚洲国产精品夜男人天堂| 精品国产亚洲一区二区三区四区| 99久久久无码国产精品秋霞网| 国产激情精品一区二区三区| 亚洲天堂成人在线| 亚洲处破女av一区二区| 午夜性刺激免费看视频| 国产精品成年片在线观看| 国产亚洲AV无码一区二区二三区 | 蜜桃视频一区二区三区四| 免费视频爱爱太爽了| 国产一区a| 人妻av午夜综合福利视频| 人妻中文字幕在线一二区| 天天躁日日躁狠狠躁欧美老妇小说| 猫咪免费人成网站在线观看| 国产一级做a爱视频在线|