主頁 > 區塊鏈 > 智能合約自動化安全檢測技術淺析

智能合約自動化安全檢測技術淺析

2020-09-15 01:26:29 區塊鏈



導讀:經過THEDAO事件、幣安被盜等等事件,智能合約的安全性越來越受到業內關注,筆者將從智能合約的發展現狀和目前智能合約自動化檢測方法兩個方面為大家淺析這一領域。

智能合約發展現狀
首先我們來一起看看現在智能合約發展的一個現狀:
在過去一個月當中,智能合約的數量每天還在以1317個的平均增長率高速穩定的增長著,這和我們所理解的“區塊鏈現在處于寒冬的時期”不太一樣,其實智能合約的增長率還是比較穩定的。
現在智能合約比較多的應用在一些基礎設施、商業零售、游戲以及社交媒體和通訊這些領域當中,這是一個智能合約大的一個現狀。 


智能合約安全現狀
從17年9月到18年6月,智能合約的漏洞在頻繁的爆發,每次漏洞爆發都帶來了大量的資金損失。


這使得一些區塊鏈開發者、智能合約的開發者或者一些用戶對智能合約安全性產生高度的質疑,這也阻礙了以太坊之后的一些發展。
除了基本的智能合作安全,現在DAPP的安全也是受到了極大的關注。
比如說風暴3D它在興起的時候,僅僅在第二天就出現了大量的山寨合約、山寨的風貌3D的游戲。

這種游戲當中,開發者的巧妙就是更改了它資金分配的邏輯,使得玩家在玩風暴3D游戲的程序當中,投入的資金其實大部分都是流向于這種山寨合約的開發者的,這對DAPP的發展有了極大的阻礙。
現在我們共同面臨著一個問題,就是我們如何有效地保證海量的智能合約的安全。

智能合約自動化審計方法
我們來回顧一下現在智能合約,截止到昨天中午12點,根據我們的統計,現在總共有193萬個智能合約,并且一直保持穩定的日增長率增加,現在的審計方法有人工的攻防審計,以及自動化的審計。


在這種海量的智能合約當中,最好的一種設想就是要降低人工審計的一些復雜度,從而更多的通過自動化審計來進行。

我們把自動化審計分為三個部分:
第一種就是特征代碼的匹配,第二類就是基于形態化驗證的自動化審計,以及最后一種,基于符號執行和符號抽象的自動化審計。


特征代碼匹配
我們首先看這一項,特定代碼匹配。大家從名字上來看應該就能理解到,其實它就是對惡意代碼進行一些提取抽象,就特別像我們之前做的代碼靜態檢測等,我們抽樣成一種語意匹配,然后再去匹配它的靜態源代碼。
這種審計的方法的優點是顯而易見的,比如說速度很快,因為它就是對原碼進行一個字串的匹配。第二是它能夠迅速的回應新的漏洞,因為這種審計方法大部分是以插件形式開發,比如出現了一個新的漏洞,那么我們就可以快速的提交一些新的匹配模式。 
那么它的缺點在哪里呢?我們所理解的現在的區塊鏈都應該是公開透明的,但實際情況并不是這樣,我們大概做了一個統計,目前代碼的開源率僅僅只占48.62%,
也就是在以太坊上其實有超過一半的智能合約是不開源的,只暴露它的一個OPCODE。
對于OPCODE的分析對于安全人員來說其實也是面臨著巨大的挑戰,有些人費了十分大的力氣,去逆向這個OPCODE,這就導致了這種方法它的適用范圍極為有限,
第二個就是它的漏報率高,因為它的一些靜態審計方法其實并不和傳統的靜態代碼審計方法一致,傳統的靜態審計方法,比如說APP檢測,我會呼叫庫里面,確定穩定的一些函式,來對它進行審計,但智能合約里面它的一些函式、它一些特征等等,還是變化性比較多的,所以說它的漏報率會比較高。


基于形式化驗證的自動化審計
第二個方法,我們來探討一下現在比較火的,基于形式化驗證的自動化審計。
形式化驗證來審計智能合約安全,最早是在16年,由Hirai提供的,當時拿那個Isabelle高階邏輯互動定理證明器,然后交EVM的一些OPCODE ,透通過它的一個lem language轉化成了一個形式化的model,然后通過形式化model的驗證來去判斷它代碼中的邏輯是否存在問題。

而基于這項作業,之后由兩個學家把形式化方法進行了進一步的改正,也就是說他們從放棄了lem language這種比較低效的一個轉換方式,采用了F-framework 和K-framework將DVM轉化為一個formal model,而F-framework就是NASA他們經常在航空航天領域當中做一些形式化漏洞驗證的框架,而K framework就是語意的一些整合框架。
如果想要更加深入的了解這兩個比較有代表性的技術研究的話,可以參考一下我后面列的一些論文。


基于符號執行、符號抽象的自動化審計
第三點,也是我今天想要著重跟大家交流的,以及現在最常用的方法,就是基于符號執行和符號抽象的一些自動化審計。
我們在分析一個智能合約的時候,我們首先要明確我們的分析物件是什么,也就像我們剛才在解釋的那個特征匹配代碼當中,我們知道其實作在EVM上,這個合約代碼大部分是不公開的。
我們就確認應該是一個EVM OPCODE,通過一些原始碼,編譯,可以形成一個OPCODE,然后輸入到我們自動化分析引擎。


在這種基于符號執行和符號抽象化的自動化審計框架里面,其實它有些共有的特性,就是它在OPCODE或者在輸到這個引擎之后,都會轉化成一個CFG,就是我們的一個Control flow graph,就是剛剛說的一個控制流程圖。 
CFG
可以簡單了解一下這個CFG是什么意思?CFG就是說他把合約代碼里面的邏輯包裝成每個塊,然后有邏輯有分叉的時候,比如說有IF等等這種判斷的時候,就把它分叉。
比如說左邊這個assertion這個合約,我們首先是將input與256進行一個比較,那么在出現一個If的判斷之后,我們需要對這個CFG進行一個分叉。


CFG Builder
CFG Builder主要是對OPCODE這種智能合約代碼,把它形成一個十分龐大完善的一個CFG,然后讓程式員更好的去了解它里面執行的一些邏輯。再有CFG生成了之后,就是這樣兩種分析方法。
第一類就是基于符號執行的驗證,這邊比較有代表性的,可能大家都比較熟知的像Mythril 、Oyente 、 Maian。還有一種就是,上個月他們剛剛公開的一個符號抽象分析的方法,也就是Securify。


今天主要分析一下Oyente以及Securify這兩種系統的一個具體的架構以及實作方法。

Oyente,符號執行驗證
首先Oyente,它的邏輯,是在CFG build形成之后,首先是一個EXPLORER,EXPLORER的意思就是說我會把代碼當中的每一個流程都去驗證一遍,進行一個之外的驗證。
我們的驗證就是是否有一個X,使得X不僅滿足C1、C2、C3三個條件,并且Z=X+2,那么這時候我們可以判斷他的狀態是no還是yes,然后以此來驗證整個邏輯的一個流程。


到了第二個code analysis,這一部分其實是這個Oyente它最為核心的一個部分,就是它將剛剛輸出的EXPLORSE這種路徑把它轉化,至始至終只包含Ether的一些路徑,進行一些漏洞驗證,而他只目前只提供比如說包括TOD、Timestamp dependence、Mishandled exceptions這三種驗證,最后系統為了保證誤報率和漏報率,它采用了微軟的Z3 Bit-Vector Solver 開源的驗證器,然后來進行整體架構的一個封裝。 

在剛剛我們講述的程序當中,其實大家也應該了解到,在CFG轉EXPLORER驗證的時候,我們需要對它的回圈的每次都進行一個驗證,所以說這種分析方法特別耗時,并且也不一定成功。
比如說像parity的那個錢包代碼,它的Oyente覆寫率僅僅達到20%,剩下80%的代碼,是沒有辦法去跟蹤的,所以這就是Oyente目前存在一個巨大的問題。

Securify,符號抽象分析
在這個問題的基礎上,像Securify他們就提供了另外一種方法,它們認為現在合約代碼其實是特別容易解耦合的,不像我們傳統的代碼一樣,它的耦合性特別高,但像合約代碼里面,就有transfer等等一些比較固定解耦合的一些結構和模塊,我們并不是需要對整個合約的邏輯進行的校驗,可能我們就是對合約解耦合的各個模塊進行校驗分析,因此可以提高它的自動化程度。 
這張圖也就是他們整個在驗證的一個流程:

它們把contract bytecode轉化成一種他們自定義的一種語意語言,然后通過自定義的語意語言,它們之后有一個驗證模塊,這個驗證模塊就特別像我們之前說的那種模式匹配,就是把一些漏洞轉化成一種它驗證語言的模式匹配的框架,然后去驗證它這個語意在此是否滿足他這個比較,最侄訓生成一個那個安全的報告。
這里也給出了一個parity的例子,通過自動化審計的方法,最終可以輸出錢包的owner其實是可以被修改的。 

再具體一點,它是怎么做語意分析的呢?Securify分析這種合約代碼,是從兩個維度,第一個是邏輯,第二個是資料,
在邏輯方向的話,它定義了兩種邏輯,第一個叫May Follow,第二叫MustFollow。MayFollow的意思是說L2是有一條路徑是跟在 L1后面的,而MustFollow是說L2每一條路徑都跟在L1后面。這兩種區別定了它整個邏輯的一個框架。
第二個就是它的一個資料,它怎么定義合約里面的資料變化?分了三種,第一種是MayDepOn,就是兩個因素,一個叫Y、一個叫T,T變Y可能變也可能不變。
第二個就是Eq,就是說Y是由T來決定的
第三個就是大家把就是DetBy和Y和T是一一對應的,只要T變Y就肯定要變了。
這里面就用更加形象的方法,我們想象一下,MayDepOn就是,變數是T,在一段時間當中Y可能是一個值,然后有的說T變Y可能不變,第三個DetBy就是說一對一的關系,就比如說我們知道哈希,哈希你T變,Y就肯定要變。


通過邏輯和資料這兩個維度進行了一些驗證,最終驗證模塊的話,現在提供了大概六七個那種智能合約漏洞的一些驗證性的語言,而且這種語言它都是以插件化的形式來寫的,其他的安全開發者可以在不斷去豐富這個漏洞的驗證語言,最終我們在對自動化審計進行一個評估的時候,我們其實是要從它的自動化程度,漏報率、誤報率來評估這件事情的。
像我們現在其實它這個我們現在知道一些資料就可以表明出來,其實像Mythril 跟Oyente,它里面存在大量的誤報,比如說它檢測出來的資料還是需要人工進行二次確認,這個作業其實是非常繁瑣,而Securify這種方法可能誤報率會降低。
這也是兩種比較現在比較流行的符號執行和抽象的自動化審計方法。

總結回顧
最后我們回顧一下,現在做的智能合約審計的話可能分為三種,:特征代碼匹配、形式化驗證以及符號抽象。
回顧整個解釋的程序當中,我們可以清楚地知道,現在自動化審計的方法其實是出于一個很不成熟的階段。
它們主要面臨三大問題,第一個就是誤報率高,其實它并不能做到完全自動化,它還需要人工的一些參與。
第二個就是它的自動化其實程度比較低,還需要不斷有feedback去去審計。
第三就是審計時間比較長,比如說像Mythril ,平均在60秒,Oyente大概在30秒,而Securify大概在20秒。 


回顧一下我們整個的一個分析,就是首先我們明確一下合約發展一些安全現狀,又解釋了一下現在自動化審計的一些方法。

轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/40296.html

標籤:區塊鏈技術

上一篇:一首RAP獻給幣圈的你們

下一篇:rippleAPI 交易報錯

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • JAVA使用 web3j 進行token轉賬

    最近新學習了下區塊鏈這方面的知識,所學不多,給大家分享下。 # 1. 關于web3j web3j是一個高度模塊化,反應性,型別安全的Java和Android庫,用于與智能合約配合并與以太坊網路上的客戶端(節點)集成。 # 2. 準備作業 jdk版本1.8 引入maven <dependency> < ......

    uj5u.com 2020-09-10 03:03:06 more
  • 以太坊智能合約開發框架Truffle

    前言 部署智能合約有多種方式,命令列的瀏覽器的渠道都有,但往往跟我們程式員的風格不太相符,因為我們習慣了在IDE里寫了代碼然后打包運行看效果。 雖然現在IDE中已經存在了Solidity插件,可以撰寫智能合約,但是部署智能合約卻要另走他路,沒辦法進行一個快捷的部署與測驗。 如果團隊管理的區塊節點多、 ......

    uj5u.com 2020-09-10 03:03:12 more
  • 谷歌二次驗證碼成為區塊鏈專用安全碼,你怎么看?

    前言 谷歌身份驗證器,前些年大家都比較陌生,但隨著國內互聯網安全的加強,它越來越多地出現在大家的視野中。 比較廣泛接觸的人群是國際3A游戲愛好者,游戲盜號現象嚴重+國外賬號安全應用廣泛,這類游戲一般都會要求用戶系結名為“兩步驗證”、“雙重驗證”等,平臺一般都推薦用谷歌身份驗證器。 后來區塊鏈業務風靡 ......

    uj5u.com 2020-09-10 03:03:17 more
  • 密碼學DAY1

    目錄 ##1.1 密碼學基本概念 密碼在我們的生活中有著重要的作用,那么密碼究竟來自何方,為何會產生呢? 密碼學是網路安全、資訊安全、區塊鏈等產品的基礎,常見的非對稱加密、對稱加密、散列函式等,都屬于密碼學范疇。 密碼學有數千年的歷史,從最開始的替換法到如今的非對稱加密演算法,經歷了古典密碼學,近代密 ......

    uj5u.com 2020-09-10 03:03:50 more
  • 密碼學DAY1_02

    目錄 ##1.1 ASCII編碼 ASCII(American Standard Code for Information Interchange,美國資訊交換標準代碼)是基于拉丁字母的一套電腦編碼系統,主要用于顯示現代英語和其他西歐語言。它是現今最通用的單位元組編碼系統,并等同于國際標準ISO/IE ......

    uj5u.com 2020-09-10 03:04:50 more
  • 密碼學DAY2

    ##1.1 加密模式 加密模式:https://docs.oracle.com/javase/8/docs/api/javax/crypto/Cipher.html ECB ECB : Electronic codebook, 電子密碼本. 需要加密的訊息按照塊密碼的塊大小被分為數個塊,并對每個塊進 ......

    uj5u.com 2020-09-10 03:05:42 more
  • NTP時鐘服務器的特點(京準電子)

    NTP時鐘服務器的特點(京準電子) NTP時鐘服務器的特點(京準電子) 京準電子官V——ahjzsz 首先對時間同步進行了背景介紹,然后討論了不同的時間同步網路技術,最后指出了建立全球或區域時間同步網存在的問題。 一、概 述 在通信領域,“同步”概念是指頻率的同步,即網路各個節點的時鐘頻率和相位同步 ......

    uj5u.com 2020-09-10 03:05:47 more
  • 標準化考場時鐘同步系統推進智能化校園建設

    標準化考場時鐘同步系統推進智能化校園建設 標準化考場時鐘同步系統推進智能化校園建設 安徽京準電子科技官微——ahjzsz 一、背景概述隨著教育事業的快速發展,學校建設如雨后春筍,隨之而來的學校教育、管理、安全方面的問題成了學校管理人員面臨的最大的挑戰,這些問題同時也是學生家長所擔心的。為了讓學生有更 ......

    uj5u.com 2020-09-10 03:05:51 more
  • 位元幣入門

    引言 位元幣基本結構 位元幣基礎知識 1)哈希演算法 2)非對稱加密技術 3)數字簽名 4)MerkleTree 5)哪有位元幣,有的是UTXO 6)位元幣挖礦與共識 7)區塊驗證(共識) 總結 引言 上一篇我們已經知道了什么是區塊鏈,此篇說一下區塊鏈的第一個應用——位元幣。其實先有位元幣,后有的區塊 ......

    uj5u.com 2020-09-10 03:06:15 more
  • 北斗對時服務器(北斗對時設備)電力系統應用

    北斗對時服務器(北斗對時設備)電力系統應用 北斗對時服務器(北斗對時設備)電力系統應用 京準電子科技官微(ahjzsz) 中國北斗衛星導航系統(英文名稱:BeiDou Navigation Satellite System,簡稱BDS),因為是目前世界范圍內唯一可以大面積提供免費定位服務的系統,所以 ......

    uj5u.com 2020-09-10 03:06:20 more
最新发布
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:46:47 more
  • Hyperledger Fabric 使用 CouchDB 和復雜智能合約開發

    在上個實驗中,我們已經實作了簡單智能合約實作及客戶端開發,但該實驗中智能合約只有基礎的增刪改查功能,且其中的資料管理功能與傳統 MySQL 比相差甚遠。本文將在前面實驗的基礎上,將 Hyperledger Fabric 的默認資料庫支持 LevelDB 改為 CouchDB 模式,以實作更復雜的資料... ......

    uj5u.com 2023-04-16 07:28:31 more
  • .NET Core 波場鏈離線簽名、廣播交易(發送 TRX和USDT)筆記

    Get Started NuGet You can run the following command to install the Tron.Wallet.Net in your project. PM> Install-Package Tron.Wallet.Net 配置 public reco ......

    uj5u.com 2023-04-14 08:08:00 more
  • DKP 黑客分析——不正確的代幣對比率計算

    概述: 2023 年 2 月 8 日,針對 DKP 協議的閃電貸攻擊導致該協議的用戶損失了 8 萬美元,因為 execute() 函式取決于 USDT-DKP 對中兩種代幣的余額比率。 智能合約黑客概述: 攻擊者的交易:0x0c850f,0x2d31 攻擊者地址:0xF38 利用合同:0xf34ad ......

    uj5u.com 2023-04-07 07:46:09 more
  • Defi開發簡介

    Defi開發簡介 介紹 Defi是去中心化金融的縮寫, 是一項旨在利用區塊鏈技術和智能合約創建更加開放,可訪問和透明的金融體系的運動. 這與傳統金融形成鮮明對比,傳統金融通常由少數大型銀行和金融機構控制 在Defi的世界里,用戶可以直接從他們的電腦或移動設備上訪問廣泛的金融服務,而不需要像銀行或者信 ......

    uj5u.com 2023-04-05 08:01:34 more
  • solidity簡單的ERC20代幣實作

    // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0 <0.9.0; import "hardhat/console.sol"; //ERC20 同質化代幣,每個代幣的本質或性質都是相同 //ETH 是原生代幣,它不是ERC20代幣, ......

    uj5u.com 2023-03-21 07:56:29 more
  • solidity 參考型別修飾符memory、calldata與storage 常量修飾符C

    在solidity語言中 參考型別修飾符(參考型別為存盤空間不固定的數值型別) memory、calldata與storage,它們只能修飾參考型別變數,比如字串、陣列、位元組等... memory 適用于方法傳參、返參或在方法體內使用,使用完就會清除掉,釋放記憶體 calldata 僅適用于方法傳參 ......

    uj5u.com 2023-03-08 07:57:54 more
  • solidity注解標簽

    在solidity語言中 注釋符為// 注解符為/* 內容*/ 或者 是 ///內容 注解中含有這幾個標簽給予我們使用 @title 一個應該描述合約/介面的標題 contract, library, interface @author 作者的名字 contract, library, interf ......

    uj5u.com 2023-03-08 07:57:49 more
  • 評價指標:相似度、GAS消耗

    【代碼注釋自動生成方法綜述】 這些評測指標主要來自機器翻譯和文本總結等研究領域,可以評估候選文本(即基于代碼注釋自動方法而生成)和參考文本(即基于手工方式而生成)的相似度. BLEU指標^[^?88^^?^]^:其全稱是bilingual evaluation understudy.該指標是最早用于 ......

    uj5u.com 2023-02-23 07:27:39 more
  • 基于NOSTR協議的“公有制”版本的Twitter,去中心化社交軟體Damus

    最近,一個幽靈,Web3的幽靈,在網路游蕩,它叫Damus,這玩意詮釋了什么叫做病毒式營銷,滑稽的是,一個Web3產品卻在Web2的產品鏈上瘋狂傳銷,各方大佬紛紛為其背書,到底發生了什么?Damus的葫蘆里,賣的是什么藥? 注冊和簡單實用 很少有什么產品在用戶注冊環節會有什么噱頭,但Damus確實出 ......

    uj5u.com 2023-02-05 06:48:39 more