999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

DEALS——追蹤代幣轉(zhuǎn)賬信息不一致

2024-02-20 08:21:42姜人楷宋書瑋羅夏樸羅瑞杰王炳森
關(guān)鍵詞:用戶

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

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

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

(202121080527@std.uestc.edu.cn)

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

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

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

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

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

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

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

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

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

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

本文的主要貢獻(xiàn)包括4 個(gè)方面:

1) 據(jù)我們所知,本文工作是第1 個(gè)檢測 Depl 和代幣之間不一致行為的工作. 研究了Depl 的核心功能和核心數(shù)據(jù)結(jié)構(gòu),發(fā)現(xiàn)了造成財(cái)產(chǎn)損失或?qū)е掠脩裘曰蟮?0 個(gè)不一致的原因.

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

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

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

1 相關(guān)工作

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

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

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

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

2 背景知識(shí)

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

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

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

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

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

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

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

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

3 探索Depl

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

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

3.1 分析范圍

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

3.2 核心功能分析

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

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

值得注意的是,自然語言處理領(lǐng)域在最近幾年有顯著的進(jìn)步,但不會(huì)對該工作的分析結(jié)果造成影響,因?yàn)閷μ幚斫Y(jié)果都進(jìn)行了人工核驗(yàn)和補(bǔ)全. 相反,自然語言處理的進(jìn)步會(huì)對核心功能分析的自動(dòng)化提供更優(yōu)越的輔助.

3.3 核心函數(shù)、核心事件、核心數(shù)據(jù)結(jié)構(gòu)分析

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

通過簡單腳本的編寫,重點(diǎn)尋找既與核心功能在定義上較為相似的函數(shù)或者事件(即在命名或參數(shù)上相似),又會(huì)在函數(shù)內(nèi)部中調(diào)用代幣傳輸接口的Depl 外部函數(shù)(因?yàn)楹诵墓δ鼙厝簧婕暗酱鷰诺霓D(zhuǎn)移). 這樣做的目的是篩選那些可能實(shí)現(xiàn)核心功能的函數(shù)或標(biāo)志核心功能被觸發(fā)的事件.

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

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

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

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

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

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

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

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

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

3.4 模式分析

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

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

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

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

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

在以太坊的結(jié)構(gòu)體實(shí)現(xiàn)中,結(jié)構(gòu)體占用一個(gè)連續(xù)的存儲(chǔ)空間,該空間被結(jié)構(gòu)體項(xiàng)一一緊密地填滿.存放余額的變量可能處于結(jié)構(gòu)體的任意一處. 因?yàn)锳DD 操作被用來更正偏移量,操作的結(jié)果即是余額最終的Storage 位置.

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

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

4 DEALS

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

4.1 概 述

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

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

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

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

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

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

4.2 階段1:定位核心數(shù)據(jù)結(jié)構(gòu)

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

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

4.2.1 獲取Depl 數(shù)據(jù)結(jié)構(gòu)ID

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

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

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

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

4.2.2 過濾Depl 核心數(shù)據(jù)結(jié)構(gòu)

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

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

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

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

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

算法1.Depl 核心數(shù)據(jù)結(jié)構(gòu)過濾算法.

算法1 展示了通過函數(shù)簽名字典過濾核心數(shù)據(jù)結(jié)構(gòu)的過程. DEALS 按順序過濾核心數(shù)據(jù)結(jié)構(gòu)操作碼. 當(dāng)遍歷到PUSH4 操作碼并且該操作碼的參數(shù)在函數(shù)簽名字典中(行②)時(shí),說明此時(shí)DEALS 即將進(jìn)入核心函數(shù). 因?yàn)橹悄芎霞s操作碼采用了將函數(shù)簽名壓入棧的方式(即PUSH4 函數(shù)簽名)來標(biāo)記函數(shù)的入口. 在核心函數(shù)內(nèi)部,符合Depl 模式的數(shù)據(jù)結(jié)構(gòu)就是核心數(shù)據(jù)結(jié)構(gòu).

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

4.3 階段2:識(shí)別行為

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

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

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

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

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

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

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

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

污點(diǎn)傳播有2 類情況.

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

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

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

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

4.4 階段3:檢測不一致

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

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

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

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

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

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

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

5 實(shí) 驗(yàn)

5.1 實(shí)驗(yàn)結(jié)果

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

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

所有結(jié)果在表2 中展示.

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

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

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

5.2 DEALS 的精準(zhǔn)度

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

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

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

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

6 行為不一致的原因

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

Table 3 Classification Criteria of Inconsist Causes表3 不一致成因的分類標(biāo)準(zhǔn)

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

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

6.1 詐騙Depl

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

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

Fig. 6 Cheat Depl圖6 詐騙Depl

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

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

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

6.3 重入漏洞

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

6.4 整數(shù)溢出

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

6.5 尺度不一致

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

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

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

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

Fig. 9 Rebase圖9 重復(fù)基底

6.6 Depl 的收費(fèi)政策

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

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

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

Fig. 10 Fee policy of Depl圖10 Depl 的收費(fèi)政策

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

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

Fig. 11 Activate mechanism at will圖11 任意的激活機(jī)制

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

6.8 Depl 的獎(jiǎng)勵(lì)政策

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

6.9 Depl 的待辦機(jī)制

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

Fig. 12 Pending mechanism of Depl圖12 Depl 的待辦機(jī)制

6.10 第三方投資

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

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

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

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

7 案例講解

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

Fig. 14 Overflow vulnerability圖14 溢出漏洞

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

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

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

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

8 結(jié)論與展望

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

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

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

猜你喜歡
用戶
雅閣國內(nèi)用戶交付突破300萬輛
車主之友(2022年4期)2022-08-27 00:58:26
您撥打的用戶已戀愛,請稍后再哭
關(guān)注用戶
商用汽車(2016年11期)2016-12-19 01:20:16
關(guān)注用戶
商用汽車(2016年5期)2016-11-28 09:55:15
兩新黨建新媒體用戶與全網(wǎng)新媒體用戶之間有何差別
關(guān)注用戶
商用汽車(2016年6期)2016-06-29 09:18:54
關(guān)注用戶
商用汽車(2016年4期)2016-05-09 01:23:12
挖掘用戶需求尖端科技應(yīng)用
Camera360:拍出5億用戶
100萬用戶
主站蜘蛛池模板: 毛片网站观看| 久久窝窝国产精品午夜看片| 亚洲第一视频网| 亚洲中文在线看视频一区| www.日韩三级| 欧美精品不卡| 日本高清成本人视频一区| 欧美不卡在线视频| 亚洲第一中文字幕| 亚洲色图狠狠干| 一区二区三区在线不卡免费| 国产电话自拍伊人| 免费看美女自慰的网站| 一本无码在线观看| 最新加勒比隔壁人妻| 亚洲综合婷婷激情| 男女性午夜福利网站| 成人福利一区二区视频在线| 国产男女XX00免费观看| 国产精品乱偷免费视频| 国产农村1级毛片| 九九九国产| 无码中文字幕乱码免费2| 亚洲三级片在线看| 婷婷中文在线| 99er这里只有精品| 国产成人永久免费视频| 另类专区亚洲| 亚洲人成网7777777国产| 中文字幕欧美日韩高清| 国产欧美精品午夜在线播放| 萌白酱国产一区二区| 日韩东京热无码人妻| 怡春院欧美一区二区三区免费| 国产第一页亚洲| 无套av在线| 亚洲码一区二区三区| 97成人在线观看| 亚洲美女一区二区三区| 日韩在线欧美在线| 玖玖免费视频在线观看| 又爽又黄又无遮挡网站| 亚洲无码一区在线观看| 大香伊人久久| 特级毛片免费视频| 人与鲁专区| 国产激情国语对白普通话| 97青青青国产在线播放| 91九色视频网| 97视频在线精品国自产拍| 国产在线观看一区二区三区| 日本妇乱子伦视频| 亚洲人成网站色7777| 亚洲欧洲日产无码AV| 国产性爱网站| 欧美综合激情| 欧美一区中文字幕| 中文字幕无码电影| 日本欧美成人免费| 中文无码毛片又爽又刺激| 综合亚洲网| 亚洲一级毛片在线观播放| 欧美啪啪一区| 欧美成人午夜影院| 97人人做人人爽香蕉精品| 欧美在线综合视频| 69综合网| 精品综合久久久久久97超人| 精品国产成人国产在线| 欧美日韩一区二区三区在线视频| 国产成人永久免费视频| 国产成人综合日韩精品无码不卡| 亚洲男人天堂久久| 波多野结衣中文字幕一区二区| 自拍偷拍一区| av午夜福利一片免费看| 乱系列中文字幕在线视频| 日本午夜影院| 精品视频一区二区观看| 黄网站欧美内射| 亚洲日韩Av中文字幕无码| 亚洲人成成无码网WWW|