智能合約攻擊之使用Oraclize服務(wù)區(qū)塊鏈

                  區(qū)塊鏈安全檔案 2018-09-04 02:49
                  分享到:
                  導(dǎo)讀

                  WF曲速未來:近日,在眾多攻擊案例中,有些漏洞成因或攻擊模式少有研究涉及,也出現(xiàn)了一些比較隱蔽的攻擊鏈。一起分析一下因為使用Oraclize服務(wù)的疏忽引起的漏洞和如何在自己的合約中使用Oraclize服務(wù)。

                  近日,在眾多攻擊案例中,有些漏洞成因或攻擊模式少有研究涉及,也出現(xiàn)了一些比較隱蔽的攻擊鏈。下面WF曲速未來跟你一起分析一下因為使用Oraclize服務(wù)的疏忽引起的漏洞和如何在自己的合約中使用Oraclize服務(wù)。

                  使用Oraclize服務(wù)的疏忽

                  為了將區(qū)塊鏈技術(shù)應(yīng)用到線下,例如將飛機(jī)延誤險、數(shù)字貨幣兌換等業(yè)務(wù)上鏈,區(qū)塊鏈需要具有訪問鏈外數(shù)據(jù)的能力。但是如果智能合約直接從外部服務(wù)獲取數(shù)據(jù),由于網(wǎng)絡(luò)延遲,節(jié)點處理速度等各種原因,會導(dǎo)致每個結(jié)點獲取的數(shù)據(jù)不同,使區(qū)塊鏈的共識機(jī)制失效。

                  現(xiàn)有的解決方案是使用第三方發(fā)送區(qū)塊鏈的交易,交易會同步到每個節(jié)點,從而保證數(shù)據(jù)的一致性。Oraclize是一個預(yù)言機(jī),為以太坊等區(qū)塊鏈提供數(shù)據(jù)服務(wù),它獨立于區(qū)塊鏈系統(tǒng)之外,是一個中心化的第三方。Oraclize可以提供的數(shù)據(jù)訪問服務(wù)包括隨機(jī)數(shù)、URL訪問、IPFS等。Oraclize的架構(gòu)如圖所示:

                  Oraclize不是鏈上直接可以調(diào)用的函數(shù),而是一個鏈外的實體。為了抓取外部數(shù)據(jù),以太坊智能合約需要發(fā)送一個查詢請求給Oraclize,當(dāng)Oraclize監(jiān)聽到鏈上有相關(guān)請求時,立即對互聯(lián)網(wǎng)上的資源發(fā)起訪問,然后調(diào)用合約中的回調(diào)函數(shù)__callback將查詢結(jié)果返回區(qū)塊鏈。

                  例如,用美元兌換以太幣的智能合約的數(shù)據(jù)查詢語句如下:

                  監(jiān)聽到請求后,Oraclize會訪問URL獲得查詢結(jié)果,然后調(diào)用__callback的函數(shù),Oraclize返回的數(shù)據(jù)通過__callback函數(shù)參數(shù)傳回智能合約。上圖中函數(shù)調(diào)用的參數(shù)[3]中的“3334312e3533”即為當(dāng)時的匯率:1ETH = $341.53,隨后智能合約會根據(jù)這個查詢結(jié)果進(jìn)行后續(xù)的邏輯處理。

                  SIGMA合約使用了Oraclize服務(wù)查詢匯率。該合約的__callback回調(diào)函數(shù)如下:

                  由于__callback函數(shù)中存在整數(shù)溢出,導(dǎo)致owner的代幣余額被下溢成一個很大的值,導(dǎo)致代幣增發(fā)。從代幣份額排名可以看出攻擊者的賬戶地址為0x2ef045a75b967054791c23ab93fbc52cc0a35c80,而該地址并不是創(chuàng)建合約的賬戶地址(0xC7e92D8997359863a8F15FE87C0812D7A3a8F770)。

                  跟蹤Transactions,發(fā)現(xiàn)0xC7e92D8997359863a8F15FE87C0812D7A3a8F770調(diào)transfer_ownership將合約的owner設(shè)置為0x2ef045a75b967054791c23ab93fbc52cc0a35c80。

                  針對這個漏洞是否使用SafeMath就可以解決了呢?答案是否定的。在Oraclize調(diào)用__callback之前,有用戶對查詢函數(shù)的調(diào)用,而且這個調(diào)用花費以太幣。

                  使用SafeMath的情況下,發(fā)生溢出的事務(wù)會回滾,但本例中能夠回滾的只有Oraclize對__callback函數(shù)調(diào)用的事務(wù),而之前用戶花費以太幣發(fā)生的事務(wù)則無法回滾。WF曲速未來表示這個現(xiàn)象的根本原因是Oraclize是一個獨立的實體,導(dǎo)致邏輯上應(yīng)該完整的一個操作被分割成了兩個事務(wù)。因此,通過Oraclize與鏈下數(shù)據(jù)交互時只能更加小心,代碼編寫需要更加謹(jǐn)慎。

                  如何在自己的合約中使用oraclize服務(wù)

                  在區(qū)塊鏈中正確部署了地址解析器和連接器之后,可以使用node bridge --oar標(biāo)志(生成最新的oar地址)或使用node bridge --instance latest。如果你不使用確定性O(shè)AR,則還需要使用生成的新地址解析器更新合約構(gòu)造函數(shù)。

                  1.在自己的合約中導(dǎo)入usingOraclize.sol合約

                  從github上下載oraclizeAPI_0.4.sol合約,并將該文件重命名為usingOraclize.sol,放在你的contracts文件夾中。然后通過

                  在自己的合約中導(dǎo)入usingOraclize.sol合約。

                  2.在構(gòu)造函數(shù)中添加地址解析器OAR

                  例如:

                  注意:選擇的地址將用于部署Oraclize合約,確保不要在同一地址部署你自己寫的使用了Oraclize的合約。

                  3.發(fā)送查詢

                  在Oraclize服務(wù)中,你必須向Oraclize智能合約發(fā)送查詢,Oraclize接收你的查詢并進(jìn)行相應(yīng)的請求。 一旦服務(wù)從API接收數(shù)據(jù),他們就會在智能合約中調(diào)用回調(diào)函數(shù),你可以訪問和處理所請求的數(shù)據(jù)。

                  以上代碼用于檢索1個ETH的當(dāng)前美元價格。oraclize_queryfunction用于通知Oraclize有關(guān)第三方API。在_callback函數(shù)中,第一個參數(shù)是請求的ID。 第二個參數(shù)是請求的結(jié)果。

                  向Oraclixe發(fā)送一個查詢時

                  1.如果第一個實參是字符串,就表示數(shù)據(jù)源,第二個實參是數(shù)據(jù)源的輸入條件

                  2.如果URL數(shù)據(jù)源后只有一個字符串實參,表示向此URL發(fā)送HTTP GET請求

                  3.如果URL數(shù)據(jù)源后有兩個字符串實參,表示向此URL發(fā)送HTTP POST請求,第三個實參即為POST請求的內(nèi)容,例如:

                  1)如果第一個實參是數(shù)字,就表示在預(yù)約查詢,比如第一個實參86400,則表示Oracize在看到此查詢86400s(24h)后開始查詢。

                  2)如果最后一個實參是數(shù)字,它表示自定義的gasLimit,默認(rèn)為200000,不得低于200000。

                  3)沒有花費完的gas將被返還給Oraclize,而非用戶。

                  區(qū)塊鏈安全公司W(wǎng)F曲速未來提醒:來自任意以太坊地址的第一個Oraclize查詢調(diào)用都是免費的

                  Oraclize 合約 數(shù)據(jù) 使用 區(qū)塊
                  分享到:

                  1.TMT觀察網(wǎng)遵循行業(yè)規(guī)范,任何轉(zhuǎn)載的稿件都會明確標(biāo)注作者和來源;
                  2.TMT觀察網(wǎng)的原創(chuàng)文章,請轉(zhuǎn)載時務(wù)必注明文章作者和"來源:TMT觀察網(wǎng)",不尊重原創(chuàng)的行為TMT觀察網(wǎng)或?qū)⒆肪控?zé)任;
                  3.作者投稿可能會經(jīng)TMT觀察網(wǎng)編輯修改或補(bǔ)充。