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

?

DEALS——追蹤代幣轉賬信息不一致

2024-02-20 08:21:42姜人楷宋書瑋羅夏樸羅瑞杰王炳森
計算機研究與發(fā)展 2024年2期
關鍵詞:代幣數(shù)據(jù)結構合約

姜人楷 宋書瑋 羅夏樸 陳 廳 羅瑞杰 王炳森 喬 翱

1 (電子科技大學網(wǎng)絡空間安全研究院 成都 611731)

2 (香港理工大學電子計算學系 香港特別行政區(qū) 999077)

(202121080527@std.uestc.edu.cn)

由于區(qū)塊鏈的去中心化、開放性和匿名性,傳統(tǒng)交易所和借貸機構正在擴展到去中心化平臺(decentralized platform,Depl). 為傳統(tǒng)交易所和借貸機構提供了新功能,例如允許任何人無需中介即可獲得服務[1]. 由于Depl 擁有著大量的投資者, 去中心化生態(tài)中有70%的價值是被鎖定在Depl 中的,這些價值總計超過355.7 億美元(其中去中心化交易所占215.1 億美元,去中心化借貸平臺占140.6 億美元[2]).而根據(jù)知名去中心化金融數(shù)據(jù)平臺 Defillama 的數(shù)據(jù)顯示,大多數(shù)的Depl 是運行在以太坊區(qū)塊鏈上的:資金排名前 50 名的去中心化交易所中有 12 個運行在以太坊上,前 50 名去中心化借貸平臺中有 18 個運行在以太坊上[2]. 這些Depl 都是基于運行在以太坊上的智能合約實現(xiàn)的[2]. 智能合約是在以太坊區(qū)塊鏈上運行的程序[3]. 傳統(tǒng)平臺一旦實現(xiàn)為智能合約,就可以根據(jù)預先編寫的程序提供預期的服務.

本文的工作重點是去中心化交易所和去中心化借貸平臺,我們將它們統(tǒng)稱為Depl,它們實際上是中心化平臺在以太坊區(qū)塊鏈上的智能合約.

Depl 提供多種功能,包括資產(chǎn)交換和抵押資產(chǎn)進行借貸,其與傳統(tǒng)平臺類似. 在區(qū)塊鏈背景下,資產(chǎn)以代幣(token)的形式實現(xiàn),代幣本質上是具有所有權賬本、使用賬本記錄資產(chǎn)轉移信息的智能合約[4-5].因此,用戶之間轉移代幣的過程實際上是代幣合約接口被用戶調用后,在代幣賬本中記錄資產(chǎn)轉移的過程,該過程簡稱為代幣轉移. 為了規(guī)范化該過程,以太坊改進提議(EIP)已經(jīng)提出了多個標準來指導此類代幣接口的實現(xiàn). Depl 功能的實現(xiàn)依賴于 Depl與代幣接口進行交互,進而使代幣賬本更新用戶資產(chǎn),將用戶資產(chǎn)所有權在Depl 和其他用戶之間周轉,最終實現(xiàn)金融功能. 調查發(fā)現(xiàn),2020—2022 年之間最流行的前60 個Depl[6]都通過EIP 定義的標準接口與代幣合約進行交互.

然而,雖然代幣標準為Depl 和代幣之間的交互提供了便捷的方式,但它并不一定保證代幣的實際轉移符合Depl 的預期. 本文分析了 60 個 Depl 的白皮書、文檔(或網(wǎng)頁),沒有發(fā)現(xiàn)任何 Depl 描述此問題. 對于Depls 和Depls 的用戶來說,他們會直接默認一致性.

不幸的是,事實證明,確實存在一些代幣實際轉移與 Depl 的預期不符的事件. 發(fā)生此類事件的后果可能將導致代幣非法轉讓,使用戶和Depl 的財產(chǎn)遭受損失. 例如,惡意行為者利用名為 HYDRO 的有缺陷的代幣進行虛假存款,而該代幣由于合約中的錯誤而未轉移. 然而,名為 Etherdelta 的 Depl 認為,由于代幣成功調用了代幣的轉賬接口,存入了超過 26 億枚代幣. Etherdelta 在自己的合約數(shù)據(jù)結構中記錄了錯誤的代幣轉賬信息,直到2019 年才知道有錯誤.

我們分析了與Depl 相關的攻擊案例,發(fā)現(xiàn)在一些攻擊案例中,Depl 慣于使用自己合約內部的數(shù)據(jù)結構來記錄代幣轉移信息. 這和代幣的所有權賬本非常相似. 我們在第4 節(jié)中對2020—2022 年最流行的Depl 進行了手動分析,發(fā)現(xiàn) 85% 的Depl 使用這種方法記錄代幣轉移信息. 就代幣而言,EIP 規(guī)定了代幣使用統(tǒng)一的數(shù)據(jù)結構來記錄代幣轉移信息,但是Depl 沒有相關的規(guī)定.

因此,受案例和人工分析的啟發(fā),本文通過研究Depl 合約中記錄代幣轉移信息的數(shù)據(jù)結構、該數(shù)據(jù)結構改變量和代幣合約中的數(shù)據(jù)結構改變量之間的關系來探索未發(fā)現(xiàn)的安全問題或財產(chǎn)風險. 對于正式的描述,“核心數(shù)據(jù)結構”用于描述“記錄代幣轉移信息的數(shù)據(jù)結構”. “行為”被定義為“智能合約對合約自身的核心數(shù)據(jù)結構進行修改”. 本文探討了 Depl與代幣行為的不一致,即 Depl 預期代幣轉移與代幣本身的轉移之間的差異.

本文提出了一種自動化方法,通過實現(xiàn)名為DEALS(dex and lending scope)的工具來檢測 Depl 和代幣之間的行為不一致. 實現(xiàn)自動檢測不一致存在2個挑戰(zhàn):第1 個挑戰(zhàn)是自動識別Depl 應用程序的核心數(shù)據(jù)結構. 由于Depl 的實現(xiàn)沒有標準化的協(xié)議,因此其核心數(shù)據(jù)結構的相關信息未知. 這就導致了定位Depl 核心數(shù)據(jù)結構困難. 第2 個挑戰(zhàn)是在多合約交互過程中將Depl 和代幣的行為分別關聯(lián)起來. 由于合約交互信息只能在運行時獲取,現(xiàn)有的靜態(tài)分析方法很難識別合約交互的行為.

為了解決第1 個挑戰(zhàn),該工作從排名靠前的Depl 文檔和開源代碼中總結了為Depl 提供核心功能的函數(shù),即核心函數(shù). 同時,該工作總結了Depl 常用于存儲代幣轉賬信息的數(shù)據(jù)結構類型,即核心數(shù)據(jù)結構. 通過利用Depl 的核心功能和核心數(shù)據(jù)結構模式對區(qū)塊鏈上的智能合約進行過濾,可以達到自動識別核心數(shù)據(jù)結構的目的.

對于第2 個挑戰(zhàn),通過使用完整節(jié)點來重放交易并研究合約交互以跟蹤 Depl 和代幣的行為來解決.該方案定義適用于 Depl 的行為關聯(lián)規(guī)則,然后檢測每條追蹤路徑的不一致行為.

本文的主要貢獻包括4 個方面:

1) 據(jù)我們所知,本文工作是第1 個檢測 Depl 和代幣之間不一致行為的工作. 研究了Depl 的核心功能和核心數(shù)據(jù)結構,發(fā)現(xiàn)了造成財產(chǎn)損失或導致用戶迷惑的10 個不一致的原因.

2) 通過分析得到了Depl 的3 種主流核心數(shù)據(jù)結構,發(fā)現(xiàn)屬于這3 種核心數(shù)據(jù)結構的不同的Depl 有3 957 個.

3) 通過使用DEALS,對區(qū)塊高度在 5 萬~1 200萬之間的所有交易進行了檢測. 實驗結果表明,有1 012 749 筆交易存在不一致行為,這關聯(lián)到 2 871 組Depl 和代幣. 通過手動分析所有觸發(fā)不一致的對,只有 57 對誤報,因此DEALS 的精準率高達 98.0%.

4) 總結了不一致的行為,揭示了10 個主要原因,包括尺度不一致、鎖幣規(guī)則不明確等.

1 相關工作

在本文工作之前,已經(jīng)有一些針對智能合約安全檢測的工作. 一些安全分析工具被用于檢查代碼漏洞(例如,重入性、整數(shù)溢出、未經(jīng)檢查的調用等),比如 TokenScope[7],,oyente[8],Manticore[9],VeriSmart[10]和 MythX[11];一些工具專注于判斷合約行為的合法性,比如Sereum[12]和SODA[13]. 一些工具比如TXSPECTOR[14]通過合約執(zhí)行流程和交易記錄聯(lián)合分析,以及基于規(guī)則庫輔助攻擊檢測;一些工具針對一些具體的漏洞. 例如,Nguyen 等人[15]推出了SGUARD,這是一種自動修復智能合約的工具,用以確保其不存在4 個常見漏洞. SMARTPULSE 工具用于自動驗證智能合約中的時間屬性[16]. 一些工具使用程序分析方法對智能合約進行檢測. 比如EOSAFE 是第一個靜態(tài)分析框架,旨在識別EOSIO 智能合約中最常見的漏洞[17]. SMARTEST 是一種新穎的符號執(zhí)行技術,用于有效識別智能合約中容易受攻擊的交易序列[18].EThor 是一種EVM 字節(jié)碼的自動靜態(tài)分析器,是基于對EVM 字節(jié)碼語義的Horn 子句抽象[19]. Slither 是一個用于自動檢測漏洞和優(yōu)化代碼的靜態(tài)分析框架[20].

另一方面,還已經(jīng)有了一些關于Depl 的研究. 大多數(shù)關于Depl 的研究都集中在經(jīng)濟方面[21-25]. 只有少數(shù)論文強調了Depl 面臨的風險和挑戰(zhàn)[22-26],但沒有深入探討這些風險的原因和解決方案. Meier 等人[27]建議使用技術接受和統(tǒng)一理論(UTAUT)來解決Depl貸款的合理性問題. Burda 等人[28]研究了通過Depl 中的代幣向參與者分配決策權如何影響他們在平臺啟動之前和之后的角色.

與該工作最接近的工作是 TokenScope 和 Token-Aware[29]. TokenScope 針對 ERC-20[30]規(guī)則的代幣進行了研究,重點解決了代幣本身的代碼功能與標準接口和標準事件不一致的問題. TokenAware 專注于定位復雜的核心數(shù)據(jù)結構來識別代幣傳輸. 本文重點關注Depl 期望的代幣轉賬信息與代幣實際轉賬信息的不一致,即行為不一致. 例如,如果Depl 記錄用戶存入了10 個代幣,但用戶實際轉賬的代幣數(shù)量與此不同,則表明存在行為不一致.

盡管現(xiàn)有研究致力于智能合約的漏洞檢測和修復,也有一些關于Depl 的研究內容,但據(jù)我們所知,現(xiàn)有的智能合約研究都沒有考察 Depl 和代幣之間的不一致行為.

2 背景知識

本節(jié)將介紹一些與本文有關的相關概念.

1)賬戶(account). 以太坊由2 種類型的賬戶組成——外部賬戶和合約賬戶. 外部賬戶由擁有相應私鑰的個人控制,它無法作為程序執(zhí)行或被調用. 合約賬戶由以太坊虛擬機(EVM)中執(zhí)行的代碼(智能合約)管理,它具備可執(zhí)行的代碼,也具備可以被調用的接口[31].

2)交易(transaction). 交易是指從一個帳戶發(fā)送到另一個帳戶的消息,這個消息中包含具體調用接口的名稱和參數(shù)以及其他相關信息. 外部賬戶發(fā)起的交易稱為外部交易,而執(zhí)行過程中觸發(fā)的其他交易稱為內部交易. 每個外部交易都有一個區(qū)塊鏈全局唯一的標識符,稱為交易 ID 或交易哈希,其實質是一個長為 256 b 的索引.

3)全節(jié)點和全同步(full node & full sync). 以太坊中的全節(jié)點運行 EVM 實例,并通過同步維護區(qū)塊鏈的相同副本. 當新節(jié)點加入以太坊網(wǎng)絡時,它需要從其他節(jié)點下載區(qū)塊并重放其 EVM 中的所有歷史交易,以與現(xiàn)有節(jié)點達成共識. 這個過程稱為完全同步[32].

4)追蹤路徑(trace). 在以太坊中,追蹤路徑是指從外部交易開始到完成的執(zhí)行日志. 從 EVM 的角度來看,追蹤路徑是以太坊操作碼的有序序列. EVM 按順序執(zhí)行這些操作碼,生成合約數(shù)據(jù)變化的記錄[33].

5)代幣. 代幣是一類智能合約,本質上是具有所有權賬本、使用賬本記錄資產(chǎn)轉移信息的智能合約的總稱. 最被廣泛采用的代幣標準是ERC-20 標準,它定義了6 個代幣的標準接口、2 個標準事件和所有權賬本. 所有權賬本的在代碼中的表現(xiàn)形式即代幣的核心數(shù)據(jù)結構. 標準接口用于代幣傳輸,并將傳輸信息存儲在核心數(shù)據(jù)結構中. 2 個用于指導代幣轉移的標準接口方法分別是Transfer 方法和TransferFrom方法[29].

6)去中心化交易所和去中心化借貸所(decentralized exchange & decentralized lending).去中心化交易所和去中心化借貸所是指通過智能合約實現(xiàn)的交易所和借貸平臺. 我們將它們統(tǒng)稱為Depl. 用戶可以與Depl 合約進行交互,由此在區(qū)塊鏈上進行代幣兌換或代幣借貸,實現(xiàn)代幣在用戶和平臺之間的流動.

7)核心數(shù)據(jù)結構和行為(core data structure &behavior). 核心數(shù)據(jù)結構表示 Depl 或代幣合約中記錄代幣轉移信息的數(shù)據(jù)結構. 本文將代幣和Depl 的核心數(shù)據(jù)結構分別表示為M和N,將代幣和 Depl 的行為分別表示為Bm和Bn. 行為是指智能合約對合約自身的核心數(shù)據(jù)結構進行修改.

3 探索Depl

本節(jié)將介紹 Depl 分析的結果,4 位具有以太坊領域專業(yè)研究經(jīng)驗的研究人員參與了分析. 所有的信息都是從互聯(lián)網(wǎng)上的各種渠道收集的,通過自然語言處理的方式進行了分析,并對分析結果進行了人工驗證,最終得到結果. 分析時間跨度從2020 年開始跨越至2022 年結束,在3 年的時間跨度范圍內分析結果呈現(xiàn)一定不變性. 不變性表現(xiàn)在功能和核心數(shù)據(jù)結構基本不變. 這表明,盡管區(qū)塊鏈應用發(fā)展迅速,但Depl 在功能和代碼實現(xiàn)上基本穩(wěn)定,代表該研究對未來Depl 的發(fā)展具有一定的普適性意義.

據(jù)我們所知,本文是第一篇研究和總結 Depl 如何存儲代幣轉移信息的論文. 本節(jié)手工研究了所有白皮書和文檔,但發(fā)現(xiàn)它們幾乎都沒有考慮行為的不一致. 研究結果發(fā)現(xiàn)了一系列Depl 共有的核心功能、大部分主流Depl 都使用核心數(shù)據(jù)結構存儲代幣轉移信息,本文還定義了核心函數(shù)和核心事件,并對核心數(shù)據(jù)結構的模式進行了分析.

3.1 分析范圍

分析對象是從知名去中心化金融數(shù)據(jù)平臺Defillama 上獲取的2020—2022 年以太坊最流行的60 個Depl 應用. 所有信息均來自開源互聯(lián)網(wǎng). 信息種類包括 Depl 的白皮書、文檔(或網(wǎng)頁)和源代碼. 源代碼來自文檔或Github,是進行分析時的最新代碼.

3.2 核心功能分析

核心功能是指Depl 為用戶提供核心服務的功能. 同樣也可以認為被用戶使用次數(shù)最多的服務就是Depl 的核心功能.

首先,該工作利用自然語言處理的方式對白皮書、開源文檔中的內容進行分析,提取到一系列Depl的核心功能. 為了驗證結果的準確性,我們再針對自然語言處理的結果進行了人工的驗證和補全. 同時,該工作爬取Etherscan 上這些合約最近1 000 次被調用的接口中次數(shù)最靠前的函數(shù). 分析發(fā)現(xiàn)最常見的功能有存款、取款、增加流動性、減少流動性、交易等.

值得注意的是,自然語言處理領域在最近幾年有顯著的進步,但不會對該工作的分析結果造成影響,因為對處理結果都進行了人工核驗和補全. 相反,自然語言處理的進步會對核心功能分析的自動化提供更優(yōu)越的輔助.

3.3 核心函數(shù)、核心事件、核心數(shù)據(jù)結構分析

雖然從文檔和白皮書以及被調用次數(shù)中可以分析出應用層面Depl 的核心功能,但是從智能合約的角度出發(fā),Depl 的內部實現(xiàn)仍未可知.

通過簡單腳本的編寫,重點尋找既與核心功能在定義上較為相似的函數(shù)或者事件(即在命名或參數(shù)上相似),又會在函數(shù)內部中調用代幣傳輸接口的Depl 外部函數(shù)(因為核心功能必然涉及到代幣的轉移). 這樣做的目的是篩選那些可能實現(xiàn)核心功能的函數(shù)或標志核心功能被觸發(fā)的事件.

4 位研究人員共同對上述腳本的結果進行了分析. 令人驚喜的是,研究發(fā)現(xiàn)大多數(shù)最具代表性的Depl 都使用核心數(shù)據(jù)結構來記錄代幣的轉移信息.實現(xiàn)核心功能并具備核心數(shù)據(jù)結構的函數(shù)稱為核心函數(shù),標志核心功能被觸發(fā)和被觸發(fā)前也具備核心數(shù)據(jù)結構的時間稱為核心事件.

表1 是記錄代幣轉移信息和不記錄代幣轉移信息的Depl 數(shù)量統(tǒng)計.

Table 1 Token Transfor Information Statistic Recorded by Depl表1 Depl 記錄代幣轉賬信息統(tǒng)計

不記錄代幣轉賬信息的Depl 主要用于2 種場景:1)Depl 只是傳遞訂單,起到起始點對點撮合的作用.2)代幣傳輸信息存儲在鏈外,僅中間傳輸信息存儲在鏈上. 這些沒有核心數(shù)據(jù)結構的Depl 由于其功能的特殊性并不占據(jù)主流. 而主流Depl 一般使用核心數(shù)據(jù)結構來存儲代幣轉賬信息.

主流的核心數(shù)據(jù)結構主要分為3 類.

1)核心數(shù)據(jù)結構1 是mapping(address=>struct).映射結構將代幣的地址映射到代幣的信息結構. 因此,這類核心數(shù)據(jù)結構Bn的語義是:值的增加表明Depl 期望自己接收代幣.

2)核心數(shù)據(jù)結構2 是mapping(address=>mapping(address=>uint256). 這個核心數(shù)據(jù)結構同時記錄了正在交互的用戶地址和代幣地址. 這類核心數(shù)據(jù)結構Bn的語義是:值的增加表明Depl 認為某一個賬戶向Depl 轉移了代幣.

3)核心數(shù)據(jù)結構3 是mapping(address=>mapping(address=>struct)). 核心數(shù)據(jù)結構3 與核心數(shù)據(jù)結構2 具有相同的嵌套映射結構,但鍵值對中的值是結構體,結構體額外記錄了除代幣數(shù)量以外的其他信息. 結構體的語義與上面提到的2 個核心數(shù)據(jù)結構是相同的.

除了以上3 種核心數(shù)據(jù)結構外,還有一些特殊的核心數(shù)據(jù)結構. 例如,一些 Depl 各自使用自己定制的復雜數(shù)據(jù)結構. 這些核心數(shù)據(jù)結構的含義因 Depl 而異. 不同年度中的不同Depl 各自擁有一些完全不同的核心數(shù)據(jù)結構,這些數(shù)據(jù)結構的出現(xiàn)和變化并不穩(wěn)定,因此不認為它們是主流的核心數(shù)據(jù)結構.

3.4 模式分析

核心數(shù)據(jù)結構的描述在源碼層面上進行,而模式是在字節(jié)碼級別描述EVM 如何定位核心數(shù)據(jù)結構的. 更具體地,模式是用于定位核心數(shù)據(jù)結構的非連續(xù)性操作碼序列.

分析模式的目的是令后續(xù)工具和實驗都具備從字節(jié)碼層面定位Depl 的核心數(shù)據(jù)結構的能力. 因為雖然在源代碼中定位核心數(shù)據(jù)結構很簡單,但大多數(shù)合約都不是開源的. 為了擴大智能合約實驗的范圍,本文將字節(jié)碼作為研究對象,因為它在區(qū)塊鏈上完全透明可獲得,由此使實驗范圍可以擴大到已部署在以太坊上的合約整體.

例如,核心數(shù)據(jù)結構1 對應的模式如圖1 所示,該模式使用用戶的地址作為映射變量的鍵. SHA3 是對一類哈希算法提案的統(tǒng)稱,在以太坊中的實現(xiàn)是Keccak-256 算法,SHA3 可以將輸入的內容散列為固定長度的輸出[34]. SSTORE 是以太坊中的存儲操作,該操作將存儲值存儲在存儲地址中. SHA3 與鍵和核心數(shù)據(jù)結構 ID 的內容拼接并加上結構體偏移量得到的結果是SSTORE 將存儲新值的位置.

Fig. 1 Pattern 1 of Depl圖1 Depl 的模式1

ID 是貯存變量(storage variable)的整數(shù)標識. 這個標識從0 開始,按照源代碼中定義的變量順序依次遞增. “地址| ID”代表拼接在一起后的結果. 箭頭的尾端代表被操作數(shù),頭部代表即將進行的操作. 當SHA3 操作完成后,運算結果是一個Storage 位置,這是區(qū)塊鏈中信息持久化的單位. 此時的結果等于結構體變量的起始Storage 位置. 對應在源碼中是“balance[addr]”.

在以太坊的結構體實現(xiàn)中,結構體占用一個連續(xù)的存儲空間,該空間被結構體項一一緊密地填滿.存放余額的變量可能處于結構體的任意一處. 因為ADD 操作被用來更正偏移量,操作的結果即是余額最終的Storage 位置.

核心數(shù)據(jù)結構2 與核心數(shù)據(jù)結構3 對應的模式分別如圖2 和圖3 所示. 模式2 與模式1 不同之處在于模式2 將進行2 次SHA3 操作. 第1 個鍵和核心數(shù)據(jù)結構 ID 的內容拼接作為第1 次SHA3 的操作數(shù).第2 個鍵和第1 次SHA3 的結果拼接作為第2 次SHA3的操作數(shù). 第2 次SHA3 的結果是SSTORE 存儲新值的位置. 模式3 則是模式1 和模式2 的結合,它既包含了2 次SHA3 操作,又具備了結構體的偏移操作.

Fig. 3 Pattern 3 of Depl圖3 Depl 的模式3

4 DEALS

本節(jié)將介紹 DEALS,自動化檢測 Depl 和代幣行為之間不一致的工具的設計方式.

4.1 概 述

DEALS 將合約字節(jié)碼和追蹤路徑作為工具的輸入,用以識別 Depl 行為和代幣行為之間的不一致.

合約字節(jié)碼和追蹤路徑作為以太坊區(qū)塊鏈上公開透明的內容可以直接獲取,獲取的方法多樣.本文獲得合約字節(jié)碼的方式是使用谷歌提供的BigQuery[35]數(shù)據(jù)庫,通過數(shù)據(jù)庫查詢的方法簡便獲取. 本文獲取追蹤路徑的方式是通過全同步的方式從以太坊公鏈中獲取.

一組不一致本質上是一個包含了不一致行為的交易,該交易中的不一致信息可以用4 個字段來描述:TXID、Depl 地址、代幣地址和不一致的代幣數(shù)量.

如圖4 所示,DEALS 包括3 個階段:階段1,DEALS 定位不同合約的核心數(shù)據(jù)結構ID. 階段2,以核心數(shù)據(jù)結構ID 為基礎,DEALS 使用全節(jié)點同步來重放所有交易. 階段3,DEALS 比較每條追蹤路徑中的2 個行為,以找出不一致的實例.

Fig. 4 Workflow of DEALS圖4 DEALS 工作流程

階段1 的目的是定位合約中的核心數(shù)據(jù)結構. 只有在合約中定位到核心數(shù)據(jù)結構后,DEALS 才能監(jiān)控其變化. 階段2 的目的是監(jiān)視每個追蹤路徑中的Bm和Bn. 由于每一條追蹤路徑都是以太坊上真實的操作留下的,檢測每一條追蹤路徑意味著在真實的以太坊上檢測不一致行為. 階段3 的目的是自動比較Bm和Bn的行為,最終找到每個追蹤路徑中包含的不一致之處. 綜上,使用形式化的描述,即如果DEALS檢測到Bm和Bn表示不同的代幣轉移信息,則DEALS認為該交易存在不一致.

4.2 階段1:定位核心數(shù)據(jù)結構

在智能合約中,每個貯存變量都有一個整數(shù)標識ID. 這個整數(shù)表示從0 開始,按照源代碼中定義變量順序依次遞增. 由于用戶余額信息作為永久信息存儲在以太坊中,因此核心數(shù)據(jù)結構都是貯存變量.DEALS 使用這個唯一的 ID 來監(jiān)視核心數(shù)據(jù)結構的行為. 因此階段1 的目標是尋找核心數(shù)據(jù)結構ID.

尋找核心數(shù)據(jù)結構ID 分為2 個步驟進行:1)DEALS根據(jù)Depl 的模式獲取數(shù)據(jù)結構ID. 2)DEALS 對上一步驟獲得的數(shù)據(jù)結構ID 進行過濾,獲得Depl 的核心數(shù)據(jù)結構.

4.2.1 獲取Depl 數(shù)據(jù)結構ID

DEALS 在步驟1 中接收以太坊上所有已部署的字節(jié)碼,并輸出代幣的核心數(shù)據(jù)結構 ID 和 Depl 的數(shù)據(jù)結構 ID.

TokenAware 是該工作的前驅工作,它可以被用來定位代幣的核心數(shù)據(jù)結構. TokenAware 通過對代幣智能合約賬本的修改來推斷代幣的轉移行為,并對由基本類型組成的復雜類型的指令序列進行定位.借助TokenAware,DEALS 可以輕松獲取代幣的核心數(shù)據(jù)結構ID,但TokenAware 不能直接在Depl 中使用. TokenAware 的應用場景是代幣,它的一些核心規(guī)則在Depl 中并不成立.

具體來說,步驟1 更改了2 條TokenAware 的核心規(guī)則. 第1 條核心規(guī)則的更改是,在TokenAware 中,需要固定匹配數(shù)據(jù)結構的修改次數(shù)為2 次,而在Depl 應用中規(guī)則為對數(shù)據(jù)結構的修改次數(shù)沒有限制.這是因為一筆代幣可能在一筆Depl 的交易中發(fā)生多次轉賬,因此 Depl 可以在一筆交易中多次記錄代幣轉賬信息. 第2 條核心規(guī)則的更改是,模式的匹配需對應本文第4 節(jié)中的3 類Depl 模式,而不是代幣中的模式. 該規(guī)則用于避免過濾掉3 類目標之外的無用數(shù)據(jù)結構.

總的來說,DEALS 利用了TokenAware 的核心技術,并在這一步進行了改造. 最后得到代幣的核心數(shù)據(jù)結構ID 以及與Depl 核心數(shù)據(jù)結構相同的數(shù)據(jù)結構ID.

4.2.2 過濾Depl 核心數(shù)據(jù)結構

在步驟2 中,DEALS 需要將核心數(shù)據(jù)結構和其他具有相同字節(jié)碼序列的不相關變量區(qū)分開來. DEALS使用Depl 的核心函數(shù)和核心事件來過濾這些數(shù)據(jù)結構. 根據(jù)第4 節(jié)的知識,只有核心函數(shù)或發(fā)出核心事件的函數(shù)內部存儲的數(shù)據(jù)結構才是存儲代幣轉移信息的核心數(shù)據(jù)結構.

需要注意的是,從Depl 獲取核心數(shù)據(jù)結構的源代碼是從去中心金融平臺Defillama 在 2020—2022 年最流行的60 個Depl 的源代碼. 該工作使用這些源代碼來獲取Depl 的核心功能、函數(shù)、事件、數(shù)據(jù)結構,是為了使這些信息更具有代表性. 由于以太坊的活躍性,可能有很多非流行的Depl 存在.

因此,為了既使過濾條件具備代表性,又要防止過度嚴格的過濾策略導致很多非流行的Depl 的核心數(shù)據(jù)結構被過濾,因此需要生成簽名字典作為過濾條件.

簽名字典以最流行的60 個Depl 的核心函數(shù)和核心事件字典為基準生成,并混淆字典中函數(shù)和事件的參數(shù)順序,以減少參數(shù)對過濾算法的影響,使得Depl 的核心功能在過濾算法中成為主要的過濾條件,又允許非流行的Depl 的核心函數(shù)和事件的實現(xiàn). 簽名字典包括函數(shù)簽名和事件簽名. 例如,函數(shù)簽名是通過對函數(shù)名稱和函數(shù)參數(shù)類型列表連接形成的字符串進行哈希處理并取前 4 個字節(jié)來生成的. 如果智能合約提供了這個函數(shù)接口,那么函數(shù)簽名就會出現(xiàn)在智能合約的原始字節(jié)碼中.

在得到簽名字典后,具體的過濾算法如算法1所示.

算法1.Depl 核心數(shù)據(jù)結構過濾算法.

算法1 展示了通過函數(shù)簽名字典過濾核心數(shù)據(jù)結構的過程. DEALS 按順序過濾核心數(shù)據(jù)結構操作碼. 當遍歷到PUSH4 操作碼并且該操作碼的參數(shù)在函數(shù)簽名字典中(行②)時,說明此時DEALS 即將進入核心函數(shù). 因為智能合約操作碼采用了將函數(shù)簽名壓入棧的方式(即PUSH4 函數(shù)簽名)來標記函數(shù)的入口. 在核心函數(shù)內部,符合Depl 模式的數(shù)據(jù)結構就是核心數(shù)據(jù)結構.

DEALS 還記錄合約地址和核心數(shù)據(jù)結構,以供后續(xù)階段使用.

4.3 階段2:識別行為

在階段1 之后,DEALS 得到了代幣和Depl 的核心數(shù)據(jù)結構ID. 階段2 利用核心數(shù)據(jù)結構ID 在重放交易時識別它們的行為. 這個階段分為2 種情況:DEALS 首先監(jiān)控交易中是否調用了 Depl 和代幣合約,如果同時調用了Depl 和代幣,那么DEALS 認為該筆交易存在Depl 和代幣的交互,可能發(fā)生Depl 和代幣行為的不一致;否則會繼續(xù)監(jiān)聽交易過程中是否有任何行為,并獲取這些行為的相關信息.

4.3.1 監(jiān)控被調用的合約

在一個追蹤路徑中可能涉及到調用多個合約,但其中只有少數(shù)追蹤路徑會同時調用Depl 和代幣.除了監(jiān)控外部交易所調用的合約是否是Depl 以外,DEALS 還在重放交易的過程中監(jiān)視CALL 操作碼的執(zhí)行,從而監(jiān)視被調用的合約列表.

當執(zhí)行CALL 操作碼時,EVM 會提前在棧頂準備好CALL 操作所需的參數(shù). 必需的參數(shù)之一是調用的合約地址. DEALS 將在重放的過程中監(jiān)控 Depl 和代幣的合約地址是否都被調用. 只有在一條追蹤路徑中同時調用了 Depl 和代幣時,DEALS 才會執(zhí)行下一步操作. 這一步的目的是由于真實世界中大部分的交易并沒有涉及到Depl 和代幣,因此也不需要再去檢測不一致的行為. 拋去了這些交易后將大大減輕DEALS 的工作壓力.

需要注意的是,情況2 是在滿足情況1 時,分別在Depl 和代幣的執(zhí)行語境中進行,從而分別監(jiān)控Depl 和代幣的核心數(shù)據(jù)結構和它們的行為.

4.3.2 監(jiān)控核心數(shù)據(jù)結構

在情況2 中,通過模式1~3,可以找出具備這些不同核心數(shù)據(jù)結構模式的行為. DEALS 采用了維護污點地址表的方法,其中加載了地址、存儲位置和變化值的關系. 污點地址表的含義即被污點污染的地址的列表.

首先介紹構建污點表的過程. 初始狀態(tài)具有2 類污點源:一是:將Depl 合約的核心數(shù)據(jù)結構 ID 作為污點源;二是將運行時所有的地址類型作為污點源.

污點傳播有2 類情況.

第1 類情況是初始污點源向外傳播的情況. 當執(zhí)行 SHA3 操作碼時,DEALS 會將 SHA3 操作碼的2 個操作數(shù)與正在執(zhí)行合約的核心數(shù)據(jù)結構 ID 進行比較,如果其中一個操作數(shù)匹配,并且另一個操作數(shù)是地址時,則將污點傳播到運算結果且運算結果為Storage 位置,并將該地址、核心數(shù)據(jù)結構 ID 和運算結果相關聯(lián). 污點的含義是它有可能與核心數(shù)據(jù)結構的行為有關,但并不能馬上判斷該數(shù)據(jù)與哪一個模式有關. 關聯(lián)的意義是為了在找到行為后定位該行為與哪一個地址有關.

第2 類情況是非初始污染源向外傳播的情況. 如果SHA3 操作或者ADD 操作對污點表中一個非初始污點和一個新的地址進行操作,那么DEALS 將SHA3 操作結果標記為污點繼續(xù)傳播. 并且,將新的地址、此時的操作結果與非初始污點相關聯(lián)的數(shù)據(jù)一同關聯(lián).

第1 類污點傳播可以將污點傳播到模式1 所在的Storage 位置. 第2 類污點傳播可以將污點傳播到模式2 和模式3 所在的Storage 位置.

根據(jù)污點表中的數(shù)據(jù),每當執(zhí)行 SSTORE 操作碼時,DEALS 都會判斷SSTORE 的Storage 位置是否在污點表中. 如果在污點表中,那么說明該SSTORE操作碼改變的對象正是Depl 的核心數(shù)據(jù)結構,意味著這個操作正在發(fā)生行為. 那么DEALS 會以hook 的方式先于SSTORE 操作訪問該Storage 位置中的初始值,即余額原值,再訪問SSTORE 操作后該Storage 位置的現(xiàn)值,即余額現(xiàn)值. 那么DEALS 就得到了余額改變量. 同時通過污點表可以得到與該Storage 位置相關的地址. DEALS 檢測存儲位置的每次變化,并計算該追蹤路徑中所有變化的總量,由此得到了Depl或代幣的行為.

4.4 階段3:檢測不一致

在階段2,DEALS 已經(jīng)檢測到了Depl 和代幣各自的行為,但是Depl 與代幣行為的不一致指 Depl 預期代幣轉移與代幣本身的轉移之間的差異. 因此需要對行為不一致在數(shù)據(jù)層面進行更加公式化的表達,從而使DEALS 可以自動化檢測不一致.

DEALS 階段3 的結果如圖5 所示. 為了表述方便,將特定代幣的地址和特定 Depl 的地址分別簡寫為AoT(address of Token)和AoD(address of Depl).

Fig. 5 Tuple result of DEALS in one trace圖5 一條追蹤路徑中DEALS 的元組結果

對于Depl 的模式1 而言,由于該模式直接使用映射結構作為Depl 的核心數(shù)據(jù)結構,且映射結構的鍵是代幣的地址,這意味著它只存儲自己擁有的各種代幣的余額. 那么Bn中三元組的含義是:AoD 期待AoT 將value數(shù)量的代幣轉移給自己.

對于Depl 的模式2 和Depl 的模式3 而言,由于模式2 和模式3 都具有嵌套映射的結構,因此它們可以準確地存儲某個用戶轉移了某種類型的代幣以及轉移的金額. 那么Bn中三元組的含義是:某個用戶將數(shù)量為value的AoT代幣轉移到了AoD中.

對于代幣而言,Bm中的三元組的含義是該AoT將value數(shù)量的代幣轉移給了AoD.AoT實際上就是該代幣自身的地址.

所以根據(jù)2 類行為的語義,我們總結出了一條適用于自動化判斷不一致行為的公式,即如果Bm和Bn中value不相同,則判定為發(fā)生了行為不一致. 行為不一致的代幣的數(shù)量是兩者value值相減的絕對值.

5 實 驗

5.1 實驗結果

在第4 節(jié)中,本文經(jīng)過總共長達3 年的理論調研分析,發(fā)現(xiàn)即使經(jīng)過長時間的時間跨越,Depl 的功能和代碼實現(xiàn)仍然基本穩(wěn)定. 為了檢驗該理論調研的正確性,我們選擇了2018—2021 年與2020—2022 年時間跨度不同的年限作為實驗的驗證對象檢驗理論調研的正確性.

為了評估交易,實驗重放了區(qū)塊高度在 5 萬~1 200萬之間的交易,這些交易的生成時間為2018 年1 月30 日至2021 年3 月8 日,總共涉及8.59 億筆交易. 其中,有101 萬筆交易出現(xiàn)了不一致的行為,涉及110個Depl 和2 544 個代幣,總共2 871 組的Depl 和代幣.實驗結果被有序分為10 類并公開在互聯(lián)網(wǎng)①https://github.com/R-K-Jiang/DEALS上.

所有結果在表2 中展示.

Table 2 Relevant Statistical Data of Inconsistent Depl表2 發(fā)生不一致的 Depl 的 相關統(tǒng)計數(shù)據(jù)

DEALS 總共檢測到 26 874 個屬于模式1 的不一致、984 725 個屬于模式2 的不一致以及 1 150 個屬于模式3 的不一致.

有902 191 筆不一致的交易發(fā)生在與地址為0x2a0c②0x2a0c0DBEcC7E4D658f48E01e3fA353F44050c208的Depl 交互過程中,這是結果中發(fā)生過最多不一致交易的Depl. 在地址為0x2a0c 的Depl 與地址為0x4a22①0x4a220E6096B25EADb88358cb44068A3248254675的代幣交互過程中,總共有 35 499 筆交易存在不一致,這是所有檢測出不一致最多的Depls 和代幣組. 由于地址長度太長,本文只給出地址的前4位數(shù)字.

5.2 DEALS 的精準度

為了解析 DEALS 的精準度,我們手動檢查了所有檢測出不一致的Depl 和代幣組,總共2 871 組. 誤報的含義是,當 Depl 與代幣實際沒有發(fā)生行為不一致,但 DEALS 檢測到不一致時即為誤報. 經(jīng)結果分析,僅發(fā)現(xiàn) 57 個誤報,這意味著 DEALS 的精準度達到 98.0%.

誤報主要有2 個原因:1)部分用戶不直接與Depl交互,而是調用私有部署的中間合約間接與Depl 交互. 這些中間合約的用處是簡化用戶需要多次才能完成的操作. 但Depl 只記錄中間合約的余額,但中間合約又將代幣轉移給實際所有者. 8 對Depl 和代幣以及1 237 個不一致的誤報都屬于這種情況. 2)部分Depl 在充值或提現(xiàn)時可以指定其他地址而不是msg.sender作為充值賬戶,這導致DEALS 檢測到代幣的核心數(shù)據(jù)中msg.sender對應的余額減少,但Depl 的核心數(shù)據(jù)結構中msg.sender對應的余額并沒有增加. 49 對Depl 和代幣以及612 個不一致的誤報都屬于這種情況.

Depl 和代幣這2 類誤報都是由于代幣實際轉入的賬戶與 Depl 的存款賬戶不同造成的. 因此,如果一條追蹤路徑中存在另一個賬戶的代幣余額變化等于Depl 的存款賬戶的余額變化,那么該結果可能屬于誤報. 但由于其他不一致也可能具備與誤報相似的特征,為了減輕誤報可能導致?lián)p失更多真實的不一致,并且該類情況相對較少,因此該類誤報處于可以承受的范圍.

另外,如果Depl 在其官網(wǎng)或白皮書中已經(jīng)聲稱存在不一致,那么這些不一致可以被視為不會造成惡劣影響的不一致,因為用戶會提前知曉這種風險.對此,我們手動檢查了每個Depl 是否都有其官方網(wǎng)站或白皮書,但不幸的是,很少有Depl 描述不一致,這可能會導致安全隱患或造成經(jīng)濟損失.

6 行為不一致的原因

將誤報過濾后,總共有 2 819 組Depl 和代幣. 通過手動分析,本文確定了不一致的 10 個主要原因. 如表3 所示,這10 類主要原因的分類標準是根據(jù)獲利目標、受害對象、是否是金融策略、是否具有誤導性、故意實現(xiàn)或無意實現(xiàn),同時結合代碼的語義進行了人工判斷. “獲利目標”指當不一致發(fā)生時可能獲利的對象;“受害對象”指當不一致發(fā)生時可能受害的對象;“是否是金融策略”指該不一致的成因是否是金融策略導致的;“是否具有誤導性”指是否有誤導性的操作導致不一致或該不一致是否導致用戶的困惑;“故意實現(xiàn)或無意實現(xiàn)”指該不一致的成因是Depl代碼有意編寫所形成的還是無意形成的漏洞.

Table 3 Classification Criteria of Inconsist Causes表3 不一致成因的分類標準

不一致的原因概括展示在表4 中.

Table 4 Reasons of Inconsistency表4 不一致的原因

6.1 詐騙Depl

出現(xiàn)這種不一致原因的 Depl 數(shù)量為 4 種,共有68 筆交易產(chǎn)生不一致,導致 17 種因該原因造成的代幣損失. 在這類原因中,用戶存入Depl 的代幣的所有權不是自己的,而是管理員指定的地址. 這意味著用戶如果不是所有者,則只能將代幣存入Depl,而不能提取代幣. 我們懷疑Depl 是詐騙合約,因為用戶無法取回存入此 Depl 的代幣.

圖6 顯示了詐騙Depl. 合約所有者可以調用changeFounder來指定代幣記錄的地址. 當用戶調用depositToken并將其令牌轉移到 Depl 時,Depl 實際上記錄了該令牌屬于FounderAddress. 而如果用戶想要提取代幣,Depl 斷言,由于記錄中的代幣屬于FounderAddress,因此用戶無權將其取走.

Fig. 6 Cheat Depl圖6 詐騙Depl

6.2 未經(jīng)檢查的代幣

出現(xiàn)該不一致原因的 Depl 數(shù)量為 38 種,共有29 788筆交易產(chǎn)生不一致,導致415 種因該原因造成的代幣損失. 出現(xiàn)該類不一致的原因是Depl 默認代幣的行為與標準函數(shù)表達的含義相同,并且沒有對代幣進行安全檢查,從而導致不一致. 如圖7 所示,Depl 認為它接收到的代幣數(shù)量就是標準函數(shù)tokensToTransfer中參數(shù)的數(shù)量,但在該類原因中,代幣的行為與標準函數(shù)表達的含義并不一致. 這使得Depl 被代幣欺騙,造成用戶和Depl 的損失. 代幣的行為與標準函數(shù)表達的含義不一致的方式有很多,包括但不限于代幣收取手續(xù)費用、代幣不合規(guī)范的鑄造、代幣銷毀等.例如,代幣具有燃燒機制. Depl 認為令牌將value傳輸?shù)絫o. 但實際上to收到tokensToTransfer,它等于to減去tokensToBurnAndMint. 已經(jīng)有針對此類不一致的研究,因此不再在本文中詳細解釋它們.

Fig. 7 Unchecked burning mechanism圖7 未經(jīng)檢查的燃燒機制

6.3 重入漏洞

出現(xiàn)這種不一致原因的 Depl 數(shù)量為 1 種,共有548 筆交易不一致,導致 2 種因該原因造成的代幣損失. DEALS 可以檢測由于重入漏洞而導致的不一致.從不一致的角度來看,漏洞的發(fā)生導致黑客的代幣核心數(shù)據(jù)結構余額激增,但Depl 的核心數(shù)據(jù)結構余額僅小幅度下降. 該漏洞產(chǎn)生的原因是:1)Depl 沒有添加重入限制;2)ERC777 標準的代幣無法控制回調的合法性.

6.4 整數(shù)溢出

出現(xiàn)該不一致原因的 Depl 數(shù)量為 1,總共有 1筆交易不一致,導致 1 種因該原因造成的代幣損失.Depl 通常使用uint256 類型來存儲用戶的余額,這是最后存儲在 Depl 模式中并輸入到存儲中的類型.uint256 是一個長度為 256 b 的無符號數(shù),也是 EVM中最大的整數(shù)類型. 當計算結果大于2256,也就是uint256 可以存儲的最大值,可能造成正溢出,從而導致核心數(shù)據(jù)結構存儲一個比正常結果更小的值. 如果計算結果是小于0 的數(shù),即計算結果下溢,就會導致核心數(shù)據(jù)結構存儲一個非常大的正整數(shù). 如果一個 Depl 存在整數(shù)溢出漏洞,則其合約中可能不會包含或使用safemath庫,從而導致該合約中出現(xiàn)整數(shù)溢出現(xiàn)象. 該溢出漏洞可能導致核心數(shù)據(jù)結構記錄錯誤,對Depl 造成嚴重的財產(chǎn)損失.

6.5 尺度不一致

出現(xiàn)這種不一致原因的 Depl 數(shù)量為 25 個. 共有6 814 筆交易不一致,導致 26 種因該原因造成的代幣損失. Depl 和代幣各自賬本的規(guī)模不一致會導致記錄不一致. 由于沒有標準規(guī)定合同需要使用的規(guī)模,因此合同核算所使用的規(guī)模是不確定的. 如圖8 所示,atomValue=value.mul(atomsPerMole)才是實際的值而不是參數(shù)value. 這種尺度的不一致最終導致行為的不一致.

Fig. 8 Scale inconsistency圖8 尺度不一致

如果代幣設計者考慮到該種情況,則有可能避免財產(chǎn)損失,但是仍然會讓用戶感到相當困惑. 因為Depl 會自定義小數(shù)尺度,但對于被最廣泛使用的錢包MetaMask[36]來說,其代幣的小數(shù)尺度默認為0,這意味著用戶在與此類Depl 交互時,可能會發(fā)現(xiàn)錢包顯示轉入Depl 的金額與Depl 界面向用戶顯示的余額不同,造成用戶對于資金去向的恐慌.

更需要注意的是,如果該種不一致情況沒有被正確處理,部分合約實際使用中有可能導致財產(chǎn)損失. 例如,圖9 顯示了與總供應量相關的規(guī)模,即atomsPerMolecule是可以被人為控制的. 假設atomsPerMolecule一開始是 10,如果用戶在 Depl 中存入 100 個代幣,那么Depl 記錄了該用戶擁有的 100個代幣. 但是根據(jù)圖8 中的第 4 行和第 6 行, Depl 收到的代幣記錄為 1 000 個. 然后atomsPerMolecule更改為100. 用戶仍然可以合理地要求Depl 轉帳100 給自己,但實際上,這個操作需要Depl 在代幣中的記錄達到10 000 個. 一個危險的假設是,黑客在atomsPer-Molecule較低時向 Depl 存入大量代幣,然后惡意控制atomsPerMolecule變高. 這時黑客要求Depl 提取押金,Depl 不會認為這樣的操作是錯誤的,從而向黑客大量轉移代幣,造成Depl 的財產(chǎn)損失. 同時,因為這大大減少了代幣中Depl 的余額記錄,當其他用戶想要提現(xiàn)時,交易會因為 Depl 沒有足夠的余額而被還原. 這相當于竊取了其他用戶在Depl 的存款,導致Depl 和用戶的財產(chǎn)都受到重大威脅.

Fig. 9 Rebase圖9 重復基底

6.6 Depl 的收費政策

出現(xiàn)這種不一致原因的 Depl 數(shù)量為 32 個. 總共有 947 002 筆交易出現(xiàn)不一致,導致 2 265 種因該原因造成的代幣損失. Depl 的收費政策是指操作的Depl 對于用戶進行金融活動的行為收取手續(xù)費用.這些操作在智能合約層面來講是一些功能函數(shù)的調用,例如充值代幣、提現(xiàn)代幣、兌換代幣等. 對于充值代幣而言,Depl 可以通過減少 Depl 賬本中用戶存款的記錄來收取費用,這意味著實際用戶支付的代幣比賬本中的多. 對于提現(xiàn)代幣而言,Depl 可以通過轉移比用戶請求的金額更少的代幣來收取費用,這意味著如果 Depl 賬本顯示用戶有value金額的代幣存款,則用戶實際可以提款的金額少于value個代幣.對于兌換代幣而言,如果用戶想要將代幣A換成代幣B,Depl 可以選擇是取代幣A或代幣B作為費用.

只有2 個Depl 在它的官方網(wǎng)站、文檔或者白皮書中詳細解釋了收費和收費比例,5 個Depl 使用某些金融公式動態(tài)地計算收費的金額,其余25 個Depl則沒有相關的說明.

如圖10 所示,第7 行實際記錄的金額比用戶在存款操作中的少. 收取的比例可能因合約而異,但無論以何種方式收取多少比例的手續(xù)費,如果用戶不知道扣款操作,最終都會導致用戶的財產(chǎn)損失和困惑.

Fig. 10 Fee policy of Depl圖10 Depl 的收費政策

6.7 鎖幣規(guī)則不明確

出現(xiàn)該不一致原因的 Depl 數(shù)量為 1 個. 共有 3筆交易不一致,導致 2 種因該原因造成的代幣損失.這種類型的 Depl 會存儲一個代幣白名單. 只有當指定的代幣在白名單中時,用戶才可以交易該代幣,否則,所有存入Depl 的該類型代幣將被Depl 收集,并且無法再提現(xiàn). 如圖11 的第15 行,該函數(shù)指定了某一類代幣是否為active. 根據(jù)第3 行,只有active的代幣可以被交易. 并且根據(jù)第13 行,Agent可以隨時更改其狀態(tài),而無需對任何其他人員進行通知或者有任何其他限制,這將具有極大的風險.

Fig. 11 Activate mechanism at will圖11 任意的激活機制

由于active符號是由合約代理設置的,對普通用戶并不公開,并且這個Depl 沒有相關文檔對其進行解釋.除非用戶是專業(yè)的以太坊研究人員,并且可以直接訪問公鏈上的Depl,否則用戶很大概率會丟失代幣.

6.8 Depl 的獎勵政策

出現(xiàn)這種不一致原因的 Depl 數(shù)量為 4 個. 共有22 403 筆交易不一致,導致 15 種因該原因造成的代幣損失. 存在此類不一致的合約一般屬于投資或借貸合約. 此類合約的主要功能是向用戶提供貸款并收取還款利息. 貸款的代幣并不屬于 Depl 本身所有,而是由投資者投資. 當投資者希望提取資產(chǎn)時,他們可以獲得股息. 一般來說,股息實際上是從貸款利息中獲得的. 這些獎勵的金額是通過復雜的財務計算得來的,這與存款的時間和 Depl 的運作情況有關. 獎勵結算的方式可以是Depl 在賬本中記錄更多的余額,也可以自動向用戶轉移更多的代幣. 一般來說,雖然這種類型的合約會造成不一致,但對用戶來說是無害的.

6.9 Depl 的待辦機制

存在這種不一致的 Depl 數(shù)量為 3 個. DEALS 檢測到不一致的原因是此類 Depl 使用2 種數(shù)據(jù)結構而非1 種數(shù)據(jù)結構來存儲用戶余額. 這2 種數(shù)據(jù)結構是核心數(shù)據(jù)結構和“待辦”結構. 如圖12 所示,在存款操作中,本次存款的金額存儲在“待辦”結構中,而之前存款的金額則從“待辦”結構轉移到核心數(shù)據(jù)結構(第1 行). 所以用戶的總存款金額應該是核心數(shù)據(jù)結構和“待辦”結構的總和. 從用戶的角度來看,由于Depl 實現(xiàn)了2 種結構體的封裝,因此在查看余額和提款時,他們不會注意到這與正常操作有什么區(qū)別.與大多數(shù) Depl 的核心數(shù)據(jù)結構模式不同,因為這種操作以一種非常新穎的方式處理用戶余額. 我們將在以后的工作中將深入探討這種多種數(shù)據(jù)結構共同決定用戶余額的Depl.

Fig. 12 Pending mechanism of Depl圖12 Depl 的待辦機制

6.10 第三方投資

出現(xiàn)該不一致原因的 Depl 數(shù)量為 1. 共有 4 筆交易不一致,導致 2 種因該原因造成的代幣損失. Depl的記錄不是用戶存入的代幣數(shù)量,而是“ctoken”的數(shù)量. Ctoken 是Compound 中的一種資產(chǎn)憑證,在用戶向 Compound 中存入財產(chǎn)時自動生成. Compound 是一種借貸合同,向其中存入財產(chǎn)可以獲得利息. 此類Depl 實際上本身沒有金融架構,而是單純將用戶存入的代幣轉投進入Compound 合約中.

Ctoken 和代幣的交換并不是一對一的,而是視Compound 合約的具體協(xié)議而定,這導致Depl 記錄的數(shù)量和代幣記錄的數(shù)量不一致. 在圖13 的第 7 行中,Depl 接收用戶的存款代幣,并緊接著在第 8 行將代幣借給Compound 并接收 Ctoken. 由于匯率的原因,ctokenAmt不一定等于_amt. 所以在第 11 行,Depl 與代幣的記錄不同.

Fig. 13 Investment assets圖13 投資資產(chǎn)

這種情況非常有趣,因為該種Depl 其實是一個Depl空殼,它的存在嚴重依賴于底層Depl. 如果該類Depl有清晰的文檔說明,則不存在安全問題,但遺憾的是已經(jīng)無法再在互聯(lián)網(wǎng)上尋找到該Depl 任何可用或可訪問的信息,因此該類Depl 的實際情況也無從可知.

7 案例講解

1)地址為0xc71A①的存在下溢出漏洞的Depl. 在區(qū)塊高度為 8 117 422 處TXID 為0xa551 的交易受到了攻擊. 如圖14 所示,第4 行存在下溢漏洞. 當tokens[token][msg.sender]<amount時,就會發(fā)生下溢,核心數(shù)據(jù)結構實際上在Depl 的記錄中憑空存儲了大量的代幣. DEALS 通過比較其核心數(shù)據(jù)結構變化的不一致情況來檢測未報告的攻擊事件. DEALS 檢測結果顯示,Bn={0xc71A,0xd79e,1.157e+77} , 而Bm={0xc71A,0xd79e,5e+11}. 編號為0xa551 的交易由地址為0xd79e的用戶發(fā)送. 交易前,Depl 賬本顯示地址為0xd79e 的用戶的存款為0,但Depl 沒有檢測到余額大小,導致計算下溢.

Fig. 14 Overflow vulnerability圖14 溢出漏洞

2)地址為0xBDFB①0xBDFBa805cC6482070485dfDe1F9D6508F7709C35的詐騙Depl. 案例以一個不一致的交易來說明該詐騙Depl 是如何進行詐騙的.對于不一致交易0xce1f 而言,DEALS 檢測到Bn為{0xf2EA, 0xBDFB,0},而Bm為 {0xf2EA, 0xBDFB, 10e+19}.Bm表示用戶向0xBDFB 存入了數(shù)量為10e+19 的代幣0xf2EA,而Bn表示Depl(0xBDFB)并沒有認可該代幣的存入.

該交易的實際流程是用戶0xc419 確實將10e+19個代幣0xf2EA 轉移到0xBDFB. 但由于圖6 的第5 行,該Depl 惡意記錯賬本,將本應認可的代幣存入記錄記為他人存入,否定了用戶0xc419 的轉賬行為. 這種行為實際是利用管理員權限誘騙用戶存錢. 最后該0xBDFB 帶著贓款離開.

3)地址為0xEc3D②0xEc3D7968b0D3FFF0A074668E08EB56c5e6d38B21的鎖幣規(guī)則為不明確的Depl.該Depl 總共導致超過1 億枚代幣被罰而無法取出.案例以一個不一致的交易來說明該Depl 不明確的鎖幣規(guī)則詐騙. 對于交易0x6d8a 而言,DEALS 檢測到Bn={0xC132, 0xEc3D,0},而Bm={0xC132, 0xEc3D, 1.3e+8}.Bm表示用戶向0xEc3D 存入了 數(shù)量為1.3e+8 的代幣0xC132,而Bn表示0xEc3D 并沒有認可該代幣的存入.

該交易的詳細流程是用戶0x1289 向0xEc3D 存入了數(shù)量為1.3e+8 的代幣0xC132,但由于圖11 的第10行和第15 行,0xEc3D 將沒有被“激活”的代幣存入了feeAccount,從而否認了用戶0x1289 的存入行為,認為沒有收到記錄存入了 107的代幣0xC132. 最終導致用戶0x1289 將永遠無法提取存入0xEc3D 中的代幣.

8 結論與展望

Depl 與代幣的不一致會導致Depl 或用戶財產(chǎn)的損失或者用戶對Depl 的不信任. 本文提出DEALS,利用代幣的核心數(shù)據(jù)結構行為和Depl 的核心數(shù)據(jù)結構行為來檢測它們之間是否存在不一致. 通過檢測五百萬到一千二百萬個區(qū)塊上的所有交易,DEALS檢測到 1 012 749 筆不一致交易,涉及 2 876 對 Depl和代幣,涉及 110 個 Depl 和 2 571 個代幣. 通過手動分析,本文總結了 10 類不一致的原因.

由于功能的復雜性,DEPL 有時不能僅使用單個數(shù)據(jù)結構來表示分類帳記錄. 如果Depl 使用復雜的財務公式來實施復雜的交易,可能導致DEPL 不再使用單個數(shù)據(jù)結構來存儲用戶分類帳,而是使用多合同的關節(jié)存儲或多DATA 結構的關節(jié)存儲. 并且DEALS在獲得結果后需要人工分析并對不一致原因作出總結,這些工作的任務量是龐大和耗時的. 這些目標均具備一定的挑戰(zhàn)性,因此值得一篇新的文章來進行討論和解決. 未來我們將在這些目標中繼續(xù)跟進.

作者貢獻聲明:姜人楷提出了算法思路和實驗方案并撰寫論文;宋書瑋負責完成實驗和撰寫部分論文;羅夏樸和陳廳給出指導意見并修改論文;羅瑞杰、王炳森和喬翱負責完成部分實驗以及部分實驗結果的人工分析.

猜你喜歡
代幣數(shù)據(jù)結構合約
首次代幣發(fā)行監(jiān)管的行為經(jīng)濟學路徑
央行等七部門叫停各類代幣發(fā)行融資
世界知識(2017年18期)2017-12-28 22:00:38
央行等七部門叫停各類代幣發(fā)行融資
人民周刊(2017年17期)2017-10-23 09:06:00
央行等七部門叫停各類代幣發(fā)行融資
“翻轉課堂”教學模式的探討——以《數(shù)據(jù)結構》課程教學為例
高職高專數(shù)據(jù)結構教學改革探討
中國市場(2016年45期)2016-05-17 05:15:48
TRIZ理論在“數(shù)據(jù)結構”多媒體教學中的應用
《數(shù)據(jù)結構》教學方法創(chuàng)新探討
河南科技(2014年5期)2014-02-27 14:08:57
合約必守,誰能例外!——對“情勢變更”制度不可寄于過高期望
寻乌县| 望城县| 芜湖市| 安国市| 平谷区| 讷河市| 西吉县| 二连浩特市| 三明市| 基隆市| 恩平市| 离岛区| 许昌县| 永昌县| 任丘市| 新郑市| 康马县| 明星| 南陵县| 岑溪市| 壤塘县| 开江县| 新津县| 博白县| 宁武县| 土默特右旗| 屏山县| 杭州市| 梅州市| 锡林郭勒盟| 新邵县| 娄烦县| 铜鼓县| 涪陵区| 德钦县| 建平县| 玉门市| 望奎县| 芜湖市| 神池县| 阿瓦提县|