CN112990941B - 一种针对智能合约中庞氏骗局的漏洞检测方法及系统 - Google Patents
一种针对智能合约中庞氏骗局的漏洞检测方法及系统 Download PDFInfo
- Publication number
- CN112990941B CN112990941B CN202110260243.9A CN202110260243A CN112990941B CN 112990941 B CN112990941 B CN 112990941B CN 202110260243 A CN202110260243 A CN 202110260243A CN 112990941 B CN112990941 B CN 112990941B
- Authority
- CN
- China
- Prior art keywords
- state
- module
- contract
- execution
- instruction
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06Q—INFORMATION AND COMMUNICATION TECHNOLOGY [ICT] SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES; SYSTEMS OR METHODS SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES, NOT OTHERWISE PROVIDED FOR
- G06Q30/00—Commerce
- G06Q30/018—Certifying business or products
- G06Q30/0185—Product, service or business identity fraud
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/52—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow
- G06F21/53—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow by executing in a restricted environment, e.g. sandbox or secure virtual machine
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/57—Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
- G06F21/577—Assessing vulnerabilities and evaluating computer system security
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2221/00—Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F2221/03—Indexing scheme relating to G06F21/50, monitoring users, programs or devices to maintain the integrity of platforms
- G06F2221/033—Test or assess software
Landscapes
- Engineering & Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Computer Hardware Design (AREA)
- Business, Economics & Management (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Entrepreneurship & Innovation (AREA)
- Computing Systems (AREA)
- Accounting & Taxation (AREA)
- Development Economics (AREA)
- Economics (AREA)
- Finance (AREA)
- Marketing (AREA)
- Strategic Management (AREA)
- General Business, Economics & Management (AREA)
- Storage Device Security (AREA)
Abstract
本发明公开了一种针对智能合约中庞氏骗局的漏洞检测方法及系统,本发明首先根据目标智能合约的字节码,提取它的控制流图和数据流图。然后结合庞氏骗局的特点,其在智能合约中的代码表现包括资金注入、合约转账、分红等操作,在字节码中指令中主要涉及CALL和CALLVALUE指令等,以此总结庞氏骗局合约特征,然后以此构造数据流和控制流约束,最后利用约束求解器对其求解,判断目标合约是否具有庞氏骗局特征,以警醒后续用户调用合约,避免该合约对后续调用者造成金融损失。
Description
技术领域
本发明属于区块链信息安全技术领域,设计一种智能合约的漏洞检测方法及系统,具体涉及一种针对智能合约中庞氏骗局的漏洞检测方法及系统。
背景技术
区块链是一种通过分布式共识机制维护的不断增长的点对点网络价值转移交易记录清单。作为比特币的重要组成部分,区块链技术具有匿名性和不可否认性,这使得不依赖权威的第三方的情况下,匿名参与者之间的价值转移成为可能。作为学术界和产业界的热点,区块链技术通常被称为下一代互联网。智能合约是区块链技术的一种应用,是相互不信任的参与者之间的计算机协议,当满足预设条件时会自动在区块链上强制执行。支持智能合约的区块链平台被认为是第二代区块链。
任何新技术都容易被诈骗利用。区块链作为一项新兴技术,由于缺乏监管,能够保证所有数据公开透明且不可更改,引来不少骗局,其中较为著名的就是庞氏骗局,据统计庞氏骗局。庞氏骗局是一种源于100年前的臭名昭著的以欺诈者命名的经典投资欺诈行为。操作者以新投资者支付的资金而非合法的商业活动或金融交易的收入作为老投资者的回报。许多参与者,尤其是后参与的,注定要损失大部分投资资金。在区块链领域,庞氏骗局的获利目标是那些想参与区块链技术但不了解其工作原理的人群。据统计,2019年区块链中庞氏骗局获利资金高达39亿美元,在中国地区获利至少20亿美元,其中以太坊庞氏智能合约庞氏骗局的占比不可忽视。检测并识别以太坊中的智能合约庞氏骗局具有社会意义。
智能合约是一套旨在验证和执行合同的计算机协议,本质上是运行在以太坊平台上的一段程序。它一旦被部署上链之后,具有不可篡改性和账户匿名性。由于它的这两大特性,导致其中存在不少金融安全威胁,其中较为著名的就是庞氏骗局。庞氏骗局是一种金融欺诈,它以高回报率吸引投资者,以靠后投资者的投资资金来回报之前投资者的盈利。现实中的庞氏骗局的发布者也需要承担骗局败露的风险,但是智能合约的账户匿名性为他们提供了更好的机会。如今,许多庞氏骗局隐藏在智能合约的外表下。因此,针对智能合约中庞氏骗局的漏洞检测工作显得尤为重要。
庞氏骗局是对金融领域投资诈骗的称呼,是金字塔骗局的始祖。操作者向一个事实上子虚乌有的企业投资,许诺投资者将在三个月内得到40%的利润回报,然后,将新加入的投资者的资金作为快速盈利付给最初投资的人,营造成确有其事的假象,以诱使更多的人上当。而智能合约中庞氏骗局之所以能造成更大金融风险,根据智能合约的特性,可以归纳为以下两个原因:
(1)智能合约的匿名性让庞氏骗局的始作俑者以匿名的身份创建合约并提取资金,而无需透露任何社会身份信息。这让监管部门难以追查庞氏骗局的源头。
(2)智能合约具有不可篡改性。合约代码一经部署,就不可更改。如果智能合约中隐藏了庞氏骗局而不被用户察觉的话,一旦触发漏洞,则不可避免地会造成金融损失。
因此,在智能合约中,亟需一种更为完善的针对智能合约中庞氏骗局的漏洞检测方案,保护普通用户的资金财产安全。
目前检测庞氏骗局的方法主要是基于深度神经网络的漏洞检测方案。
2017年Bartoletti等人系统分析了当时以太坊中的大部分智能合约。他们建立了一套判断庞氏骗局的标准,总结了如下的四个条件:
(1)合约根据某种逻辑分配回报给投资者,即骗局从新投资者投入的资金中向现有投资者支付所谓的回报;
(2)合约收入只来自于投资者,即现有投资者的回报只可能来自于新投资者;
(3)投资者盈利的前提是有新的资金注入,即骗局需要持续资金流动才能继续;
(4)越晚参与的投资者承受的风险越大,即当难以骗取新的投资者的时候,骗局不可避免地会暴露。
只要智能合约同时满足以上四个条件,就判定该合约为庞氏骗局。同时,他们根据重新分配资金的方式不同,手动将庞氏骗局分为如下四类:
(1)树型:新用户投资的资金用于分给祖先节点,投资用户越接近祖先节点的用户分红越多;
(2)链型:是树型方案的一个特例,每个节点只有一个子节点,即用户等排列顺序是线性的,合约创建者保留一部分投资,然后将剩余的资金按照先后顺序发送给投资者直到资金用完;
(3)瀑布型:分红方式和链式不同,合约创建者保留一部分投资后,剩余的资金按照先后顺序按照投资比例发送给投资者,要求后续的投资者必须投资足够的资金,否则难以支撑合约运行;
(4)交接型:要求新投资者的投资全部交给前一个投资者,要求后续投资者投入的资金必须高于前一个投资者。
2018年Chen等从机器学习的角度出发,用随机森林方法来检测合约中的庞氏骗局。首先从以太坊智能合约的用户账户和字节码中提取特征,然后建立分类模型来检测庞氏骗局。而在2020年张艳梅等人同样从机器学习的角度,采用深度神经网络的方法进行建模,实现对庞氏骗局的识别。
这两种方案都是基于深度学习对智能合约进行漏洞检测,但是它们的方案中模型需要通过不断学习“训练集”以预测新内容,具有滞后性,然而区块链和智能合约具有更新频率快、数据量多等特性,这意味着训练集难以做到与时俱进,而出现检测误报率较高的情况。
发明内容
为了解决上述问题,本发明提出一种基于符号执行的针对智能合约中庞氏骗局的漏洞检测方法及系统。
本发明的方法所采用的技术方案是:一种针对智能合约中庞氏骗局的漏洞检测方法,包括以下步骤:
步骤1:获取智能合约的源码,如果源码为字节码,则将其反汇编为字节码Opcode;如果源码为Solidity,则在remix IDE中进行编译产生字节码,再将字节码反汇编生成字节码Opcode;
步骤2:采用以太坊虚拟机EVM将字节码进行拆分,在第一次出现CODECOPY、PUSH10、RETURN和STOP操作指令处拆分得到creation Opcode 和runtime Opcode部分,只取后者runtime Opcode进行符号执行对象的构建;
步骤3:利用LASER SVM构建一个符号执行虚拟环境;
使用LASER SVM 构建符号执行虚拟环境,用于获得符号执行过程中,每个状态下的执行环境,包括当前指令、栈环境、内存环境和合约函数;对于程序流图中的每一个状态state,使用state.accounts指令获得程序的全部账户信息,使用state.mstate.stack指令获得当前state 的栈中参数,使用state.environment指令获得世界状态变量,使用state.accounts.storage指令获取storage 内存中的全部信息;
所述符号执行虚拟环境,在LASER执行的过程中会返回一个对象,该对象包含以图表形式组织的智能合约的状态空间;图中的每个节点代表正在执行的基本代码块,并包含全局状态列表-每个程序计数器位置的一个状态;每个节点还具有一组关联的约束;还提供了节点之间的边缘列表以及每个边缘上的约束;
步骤4:传入字节码构造符号执行对象;
步骤5:符号执行对象生成合约的控制流程图CFG;
步骤6:以符号执行的方式遍历程序,获取到智能合约执行过程所经的所有节点和状态;
步骤7:根据庞氏骗局的特征,制定庞氏骗局的执行模式;包括控制流执行模式和数据流执行模式;
具体包括以下子步骤:
步骤7.1:遍历符号执行的状态和节点,构造具有ISZERO+PUSH+JUMPI,和CALL指令代码块的路径约束表达式,对应于源码的ifthis.balance>payouts[payoutIndex],address.send(payout)部分逻辑,并进行约束求解;
步骤7.2:若步骤7.1未能得到路径约束的解,则执行步骤11,否则执行步骤7.3;
步骤7.3:继续遍历符号执行的状态和节点,寻找GT+ISZERO指令块的节点,对应this.balance>payouts[payoutIndex]判断语句,该节点状态为α;
步骤7.4:在步骤7.3的路径约束基础上,进行balance值来源的判断,方法是遍历程序节点找到包含PUSH10+SLOAD、CALLVALUE+ADD、ADD+SSTORE的指令段节点,对应的源码逻辑为从EVMSTORAGE取出balance的值,balance+=callvalue,将balance重新存入STORAGE,此节点状态为β;
步骤7.5:找到指令块中包含PUSH10+SLOAD和 SUB的部分,该部分对应于一般庞氏骗局的this.balance-=payout[payoutIndex],此节点状态为γ;
步骤8:构造路径约束表达式α∩β∩γ,进行约束求解;
步骤9:如果步骤8的约束求解失败,则执行步骤11,否则执行步骤10;
步骤10:判断该合约存在庞氏骗局,结束步骤;
步骤11:判断该合约不存在庞氏骗局,结束步骤。
本发明的系统所采用的技术方案是:一种针对智能合约中庞氏骗局的漏洞检测系统,包括以下模块:
模块1,用于获取智能合约的源码,如果源码为字节码,则将其反汇编为字节码Opcode;如果源码为Solidity,则在remix IDE中进行编译产生字节码,再将字节码反汇编生成字节码Opcode;
模块2,采用以太坊虚拟机EVM将字节码进行拆分,在第一次出现CODECOPY、PUSH10、RETURN和STOP操作指令处拆分得到creation Opcode 和runtime Opcode部分,只取后者runtime Opcode进行符号执行对象的构建;
模块3,用于利用LASER SVM构建一个符号执行虚拟环境;
使用LASER SVM 构建符号执行虚拟环境,用于获得符号执行过程中,每个状态下的执行环境,包括当前指令、栈环境、内存环境和合约函数;对于程序流图中的每一个状态state,使用state.accounts指令获得程序的全部账户信息,使用state.mstate.stack指令获得当前state 的栈中参数,使用state.environment指令获得世界状态变量,使用state.accounts.storage指令获取storage 内存中的全部信息;
所述符号执行虚拟环境,在LASER执行的过程中会返回一个对象,该对象包含以图表形式组织的智能合约的状态空间;图中的每个节点代表正在执行的基本代码块,并包含全局状态列表-每个程序计数器位置的一个状态;每个节点还具有一组关联的约束;还提供了节点之间的边缘列表以及每个边缘上的约束;
模块4,用于传入字节码构造符号执行对象;
模块5,用于符号执行对象生成合约的控制流程图CFG;
模块6,用于以符号执行的方式遍历程序,获取到智能合约执行过程所经的所有节点和状态;
模块7,用于根据庞氏骗局的特征,制定庞氏骗局的执行模式;包括控制流执行模式和数据流执行模式;
模块8,用于遍历符号执行的状态和节点,构造具有ISZERO+PUSH+JUMPI,和CALL指令代码块的路径约束表达式,对应于源码的ifthis.balance>payouts[payoutIndex],address.send(payout)部分逻辑,并进行约束求解;
模块9,若模块8未能得到路径约束的解,则运行模块16,否则运行模块10;
模块10,用于继续遍历符号执行的状态和节点,寻找GT+ISZERO指令块的节点,对应this.balance>payouts[payoutIndex]判断语句,该节点状态为α;
模块11,用于在模块10的路径约束基础上,进行balance值来源的判断,方法是遍历程序节点找到包含PUSH10+SLOAD、CALLVALUE+ADD和PUSH10+SLOAD的指令段节点,对应的源码逻辑为从EVMSTORAGE取出balance的值,balance+=callvalue,将balance重新存入STORAGE,此节点状态为β;
模块12,用于找到指令块中包含PUSH10+SLOAD和 SUB的部分,该部分对应于一般庞氏骗局的this.balance-=payout[payoutIndex],此节点状态为γ;
模块13,用于构造路径约束表达式α∩β∩γ,进行约束求解;
模块14,如果模块13的约束求解失败,则运行模块16,否则运行模块15;
模块15,用于判断该合约存在庞氏骗局;
模块16,用于判断该合约不存在庞氏骗局。
本发明相比现有技术,其优点和积极效果主要体现在以下几个方面:
1.本发明仅利用合约字节码进行庞氏骗局漏洞检测工作。以太坊上已部署的智能合约中绝大部分都没有公开源代码,而现有技术大部分漏洞检测工作都是基于合约源代码进行的,所以检测样本不足,进而导致检测精确度不足。
2.本发明针对庞氏骗局的检测效率、检测准确率以及时效性均相较于现有方案更优。现有针对智能合约中庞氏骗局的漏洞检测工作,基本是利用深度学习技术,它们的方案中模型需要通过不断学习“训练集”以预测新内容,具有滞后性,然而区块链和智能合约具有更新频率快、数据量多等特性,这意味着训练集难以做到与时俱进,而出现检测误报率较高的情况。
附图说明
图1为本发明实施例的方法流程图;
图2为发明实施例中关键字节码(CALLVALUE+LT/CALLVALUE+GT的代码块)约束位置;
图3为发明实施例中关键字节码(CALLVALUE+MUL+DIV的代码块)约束位置;
图4为发明实施例中关键字节码(SLOAD+LT+ISZERO的代码块)约束位置;
图5为发明实施例中关键字节码(SSTORE的代码块)约束位置;
图6为发明实施例中关键字节码(CALL的代码块)约束位置。
具体实施方式
为了使本发明实现的技术手段及作用效能便于本领域普通技术人员理解和实施,下面结合实施例及附图对本发明作进一步的详细描述。应当理解,此处所描述的实施例仅用于说明和解释本发明,并不用于限定本发明。
请见图1,本发明提供的一种针对智能合约中庞氏骗局的漏洞检测方法,包括以下步骤:
步骤1:获取智能合约的源码,如果源码为字节码,则将其反汇编为字节码Opcode;如果源码为Solidity,则在remix IDE中进行编译产生字节码,再将字节码反汇编生成字节码Opcode;
步骤2:采用以太坊虚拟机EVM将字节码进行拆分,在第一次出现CODECOPY、PUSH10、RETURN和STOP操作指令处拆分得到creation Opcode 和runtime Opcode部分,只取后者runtime Opcode进行符号执行对象的构建;
本实施例中,creation Opcode是智能合约在链上第一次部署时需要运行的指令集合,runtime Opcode是调用智能合约过程中需要运行的指令集合。拆分只会得到两块代码段,creation Opcode在头部,剩下的就是runtime Opcode。拆分技术:从头遍历指令代码,在第一次出现CODECOPY+PUSH10+RETURN+STOP组合的指令处,以STOP指令为界,以上是creation Opcode,以下是runtime Opcode。
步骤3:利用LASER SVM构建一个符号执行虚拟环境;
使用LASER SVM 构建符号执行虚拟环境,用于获得符号执行过程中,每个状态下的执行环境,包括当前指令、栈环境、内存环境和合约函数;对于程序流图中的每一个状态state,使用state.accounts指令获得程序的全部账户信息,使用state.mstate.stack指令获得当前state 的栈中参数,使用state.environment指令获得世界状态变量,使用state.accounts.storage指令获取storage 内存中的全部信息;
符号执行虚拟环境,在LASER执行的过程中会返回一个对象,该对象包含以图表形式组织的智能合约的状态空间;图中的每个节点代表正在执行的基本代码块,并包含全局状态列表-每个程序计数器位置的一个状态;每个节点还具有一组关联的约束(此处的约束指符号执行中的路径约束,即程序的运行满足特定约束条件就会来到特定的代码段);还提供了节点之间的边缘列表以及每个边缘上的约束(此处的约束指符号执行中的路径约束,即程序的运行满足特定约束条件就会来到特定的代码段);
步骤4:传入字节码构造符号执行对象;
步骤5:符号执行对象生成合约的控制流程图CFG;
步骤6:以符号执行的方式遍历程序,获取到智能合约执行过程所经的所有节点和状态;
步骤7:根据庞氏骗局的特征,制定庞氏骗局的执行模式;包括控制流执行模式和数据流执行模式;
庞氏骗局的数据流特征表现为:首先需要有用户资金的流入,即用户对合约有转账操作,然后合约账户收到资金之后,进行循环分红部份,利用while等循环结构进行相应的分红操作,分红结束之后,合约中的资金减少,最终部分用户收到合约分红,达到庞氏骗局的目的。
具体包括以下子步骤:
步骤7.1:遍历符号执行的状态和节点,构造具有ISZERO+PUSH+JUMPI,和CALL指令代码块的路径约束表达式,对应于源码的ifthis.balance>payouts[payoutIndex],address.send(payout)部分逻辑,并进行约束求解;
步骤7.2:若步骤7.1未能得到路径约束的解,则执行步骤11,否则执行步骤7.3;
步骤7.3:继续遍历符号执行的状态和节点,寻找GT+ISZERO指令块的节点,对应this.balance>payouts[payoutIndex]判断语句,该节点状态为α;
步骤7.4:在步骤7.3的路径约束基础上,进行balance值来源的判断,方法是遍历程序节点找到包含PUSH10+SLOAD、CALLVALUE+ADD、ADD+SSTORE的指令段节点,对应的源码逻辑为从EVMSTORAGE取出balance的值,balance+=callvalue,将balance重新存入STORAGE,此节点状态为β;
步骤7.5:找到指令块中包含PUSH10+SLOAD和 SUB的部分,该部分对应于一般庞氏骗局的this.balance-=payout[payoutIndex],此节点状态为γ;
步骤8:构造路径约束表达式α∩β∩γ,进行约束求解;
本实施例中,约束求解是对符号执行中收集的约束条件集合进行计算,求解出满足约束集合中所有条件的符号赋值。一般约束求解的工作都是使用现有的高性能求解器进行求解。
本实施例根据以上规则构造的约束表达式,通过约束求解器(如Z3)求解。根据合约中的约束集合映射到求解器的路径,调用约束求解器进行求解,记录求解结果。
步骤9:如果步骤8的约束求解失败,则执行步骤11,否则执行步骤10;
步骤10:判断该合约存在庞氏骗局,结束步骤;
步骤11:判断该合约不存在庞氏骗局,结束步骤。
以下通过具体实施例对本发明做进一步阐述。
本实施例中的ZeroPonzi是一个典型的庞氏骗局,在以太坊上已经有超过600笔交易。它属于链状方案,每个节点只有一个子节点(因此,用户之间引起的排序是线性的)。此类别中的方案通常将投资乘以预定义的常数因子,该因子对所有用户都是相等的。该计划开始按照到达顺序一次一个地回馈用户,并且全部:收集所有新投资,直到获得到期金额。要加入该方案,用户将msg.valuewei发送到合同,从而触发ZeroPonzi的fallback函数。合同要求最低费用MIN_VALUE = 0.1 ETH,最大费用是MAX_VALUE = 10 ETH:如果msg.value低于此最小值或者高于最大值,则拒绝用户。否则,他的地址被添加到payouts[payoutIndex]数组,并且数组长度递增。合同所有的资金将按照125%的回报率偿还给以前的用户。如果余额足以支付索引支付的用户,则直接支付相应报酬。之后,合同会尝试向下一个用户付款,依此类推,直到余额不足以支付下一个获偿用户。
首先获取到Zeroponzi的Solidity源码在Remix IDE中进行编译得到字节码,反汇编得到Opcode传入LASER SVM生成初始的符号执行模块,进行程序遍历。
在遍历的节点中,发现从0x8F开始,出现了CALLVALUE+LT/CALLVALUE+GT的代码块,如图2所示。CALLVALUE获取用户传入的ETH,对应ZeroPonzi中的变量msg.value,可以判断此处进行对比传入的资金是否符合合约最大最小值的要求,对应Solidity源码的if((msg.value< MIN_VALUE)) || (msg.calue> MAX_VALUE))部分。在0x194位置,检测到CALLVALUE+MUL+DIV,对应源码部分为payouts[entryIndex].yield = (msg.value * RET_MUL) / RET_DIV。计算当前用户的分红。如图3所示。在Opcode的0x1e7处,检测到SLOAD+LT+ISZERO,见图4。SLOAD从EVM STORAGE中读取合同余额,SLOAD所取的值即合约中的变量this.balance,然后指令LT比较大小,若成立则继续进行程序,否则跳转至0x2位置程序停止运行。此Opcode对应源码逻辑的while(payouts[payoutIndex].yield <this.balance)。
继续遍历过程,检测到指令ADD+SSTORE,ADD负责更新分红总额,SSTORE则将分红总额存入STORAGE。如图5所示。即payoutTotal += payouts[payoutIndex].yield。最后在0x37处检测到关键代码CALL,见图6。而对应的参数是此前计算的分红数额,即payouts[entryIndex].yield,对应源码的payouts[payoutIndex].addr.send(payouts[payoutIndex].yield),说明该功能是转账对投资者进行分红。随后的代码0x307 JUMP跳转到0x1c2位置,继续进行余额与用户分红大小的比较,说明该程序在循环对投资者进行转账分红操作。
至此,符号分析验证了该程序符合庞氏骗局的控制流和数据流特征,认定该合约存在庞氏骗局。
本发明还提供了一种针对智能合约中庞氏骗局的漏洞检测系统,包括以下模块:
模块1,用于获取智能合约的源码,如果源码为字节码,则将其反汇编为字节码Opcode;如果源码为Solidity,则在remix IDE中进行编译产生字节码,再将字节码反汇编生成字节码Opcode;
模块2,采用以太坊虚拟机EVM将字节码进行拆分,在第一次出现CODECOPY、PUSH10、RETURN和STOP操作指令处拆分得到creation Opcode 和runtime Opcode部分,只取后者runtime Opcode进行符号执行对象的构建;
模块3,用于利用LASER SVM构建一个符号执行虚拟环境;
使用LASER SVM 构建符号执行虚拟环境,用于获得符号执行过程中,每个状态下的执行环境,包括当前指令、栈环境、内存环境和合约函数;对于程序流图中的每一个状态state,使用state.accounts指令获得程序的全部账户信息,使用state.mstate.stack指令获得当前state 的栈中参数,使用state.environment指令获得世界状态变量,使用state.accounts.storage指令获取storage 内存中的全部信息;
所述符号执行虚拟环境,在LASER执行的过程中会返回一个对象,该对象包含以图表形式组织的智能合约的状态空间;图中的每个节点代表正在执行的基本代码块,并包含全局状态列表-每个程序计数器位置的一个状态;每个节点还具有一组关联的约束;还提供了节点之间的边缘列表以及每个边缘上的约束;
模块4,用于传入字节码构造符号执行对象;
模块5,用于符号执行对象生成合约的控制流程图CFG;
模块6,用于以符号执行的方式遍历程序,获取到智能合约执行过程所经的所有节点和状态;
模块7,用于根据庞氏骗局的特征,制定庞氏骗局的执行模式;包括控制流执行模式和数据流执行模式;
模块8,用于遍历符号执行的状态和节点,构造具有ISZERO+PUSH+JUMPI,和CALL指令代码块的路径约束表达式,对应于源码的ifthis.balance>payouts[payoutIndex],address.send(payout)部分逻辑,并进行约束求解;
模块9,若模块8未能得到路径约束的解,则运行模块16,否则运行模块10;
模块10,用于继续遍历符号执行的状态和节点,寻找GT+ISZERO指令块的节点,对应this.balance>payouts[payoutIndex]判断语句,该节点状态为α;
模块11,用于在模块10的路径约束基础上,进行balance值来源的判断,方法是遍历程序节点找到包含PUSH10+SLOAD、CALLVALUE+ADD和PUSH10+SLOAD的指令段节点,对应的源码逻辑为从EVMSTORAGE取出balance的值,balance+=callvalue,将balance重新存入STORAGE,此节点状态为β;
模块12,用于找到指令块中包含PUSH10+SLOAD和 SUB的部分,该部分对应于一般庞氏骗局的this.balance-=payout[payoutIndex],此节点状态为γ;
模块13,用于构造路径约束表达式α∩β∩γ,进行约束求解;
模块14,如果模块13的约束求解失败,则运行模块16,否则运行模块15;
模块15,用于判断该合约存在庞氏骗局;
模块16,用于判断该合约不存在庞氏骗局。
本发明首先根据目标智能合约的字节码,提取它的控制流图和数据流图。然后结合庞氏骗局的特点,其在智能合约中的代码表现包括资金注入、合约转账、分红等操作,在字节码中指令中主要涉及CALL和CALLVALUE指令等,以此总结庞氏骗局合约特征,然后以此构造数据流和控制流约束,最后利用约束求解器对其求解,判断目标合约是否具有庞氏骗局特征,以警醒后续用户调用合约,避免该合约对后续调用者造成金融损失。
应当理解的是,上述针对较佳实施例的描述较为详细,并不能因此而认为是对本发明专利保护范围的限制,本领域的普通技术人员在本发明的启示下,在不脱离本发明权利要求所保护的范围情况下,还可以做出替换或变形,均落入本发明的保护范围之内,本发明的请求保护范围应以所附权利要求为准。
Claims (2)
1.一种针对智能合约中庞氏骗局的漏洞检测方法,其特征在于,包括以下步骤:
步骤1:获取智能合约的源码,如果源码为字节码,则将其反汇编为字节码Opcode;如果源码为Solidity,则在remix IDE中进行编译产生字节码,再将字节码反汇编生成字节码Opcode;
步骤2:采用以太坊虚拟机EVM将字节码进行拆分,在第一次出现CODECOPY、PUSH10、RETURN和STOP操作指令处拆分得到creation Opcode 和runtime Opcode部分,只取后者runtime Opcode进行符号执行对象的构建;
步骤3:利用LASER SVM构建一个符号执行虚拟环境;
使用LASER SVM 构建符号执行虚拟环境,用于获得符号执行过程中,每个状态下的执行环境,包括当前指令、栈环境、内存环境和合约函数;对于程序流图中的每一个状态state,使用state.accounts指令获得程序的全部账户信息,使用state.mstate.stack指令获得当前state 的栈中参数,使用state.environment指令获得世界状态变量,使用state.accounts.storage指令获取storage 内存中的全部信息;
所述符号执行虚拟环境,在LASER执行的过程中会返回一个对象,该对象包含以图表形式组织的智能合约的状态空间;图中的每个节点代表正在执行的基本代码块,并包含全局状态列表-每个程序计数器位置的一个状态;每个节点还具有一组关联的约束;还提供了节点之间的边缘列表以及每个边缘上的约束;
步骤4:传入字节码构造符号执行对象;
步骤5:符号执行对象生成合约的控制流程图CFG;
步骤6:以符号执行的方式遍历程序,获取到智能合约执行过程所经的所有节点和状态;
步骤7:根据庞氏骗局的特征,制定庞氏骗局的执行模式;包括控制流执行模式和数据流执行模式;
具体包括以下子步骤:
步骤7.1:遍历符号执行的状态和节点,构造具有ISZERO+PUSH+JUMPI,和CALL指令代码块的路径约束表达式,对应于源码中合约余额大于投资者队列的待支付金额的判断语句,向投资者支付对应的报酬,并进行约束求解;
步骤7.2:若步骤7.1未能得到路径约束的解,则执行步骤11,否则执行步骤7.3;
步骤7.3:继续遍历符号执行的状态和节点,寻找GT+ISZERO指令块的节点,对应合约余额大于投资者队列的待支付金额的判断语句,该节点状态为α;
步骤7.4:在步骤7.3的路径约束基础上,进行balance值来源的判断,方法是遍历程序节点找到包含PUSH10+SLOAD、CALLVALUE+ADD、ADD+SSTORE的指令段节点,对应的源码逻辑为从EVMSTORAGE取出balance的值,在投资行为后对合约余额进行更新操作,将balance重新存入STORAGE,此节点状态为β;
步骤7.5:找到指令块中包含PUSH10+SLOAD和 SUB的部分,该部分对应于一般庞氏骗局的在支付投资者报酬后对合约余额进行更新的逻辑操作,此节点状态为γ;
步骤8:构造路径约束表达式α∩β∩γ,进行约束求解;
步骤9:如果步骤8的约束求解失败,则执行步骤11,否则执行步骤10;
步骤10:判断该合约存在庞氏骗局,结束步骤;
步骤11:判断该合约不存在庞氏骗局,结束步骤。
2.一种针对智能合约中庞氏骗局的漏洞检测系统,其特征在于,包括以下模块:
模块1,用于获取智能合约的源码,如果源码为字节码,则将其反汇编为字节码Opcode;如果源码为Solidity,则在remix IDE中进行编译产生字节码,再将字节码反汇编生成字节码Opcode;
模块2,采用以太坊虚拟机EVM将字节码进行拆分,在第一次出现CODECOPY、PUSH10、RETURN和STOP操作指令处拆分得到creation Opcode 和runtime Opcode部分,只取后者runtime Opcode进行符号执行对象的构建;
模块3,用于利用LASER SVM构建一个符号执行虚拟环境;
使用LASER SVM 构建符号执行虚拟环境,用于获得符号执行过程中,每个状态下的执行环境,包括当前指令、栈环境、内存环境和合约函数;对于程序流图中的每一个状态state,使用state.accounts指令获得程序的全部账户信息,使用state.mstate.stack指令获得当前state 的栈中参数,使用state.environment指令获得世界状态变量,使用state.accounts.storage指令获取storage 内存中的全部信息;
所述符号执行虚拟环境,在LASER执行的过程中会返回一个对象,该对象包含以图表形式组织的智能合约的状态空间;图中的每个节点代表正在执行的基本代码块,并包含全局状态列表-每个程序计数器位置的一个状态;每个节点还具有一组关联的约束;还提供了节点之间的边缘列表以及每个边缘上的约束;
模块4,用于传入字节码构造符号执行对象;
模块5,用于符号执行对象生成合约的控制流程图CFG;
模块6,用于以符号执行的方式遍历程序,获取到智能合约执行过程所经的所有节点和状态;
模块7,用于根据庞氏骗局的特征,制定庞氏骗局的执行模式;包括控制流执行模式和数据流执行模式;
具体包括以下子模块:
模块7.1,用于遍历符号执行的状态和节点,构造具有ISZERO+PUSH+JUMPI,和CALL指令代码块的路径约束表达式,对应于源码中合约余额大于投资者队列的待支付金额的判断语句,向投资者支付对应的报酬,并进行约束求解;
模块7.2,用于若模块7.1未能得到路径约束的解,则执行模块11,否则执行模块7.3;
模块7.3,用于继续遍历符号执行的状态和节点,寻找GT+ISZERO指令块的节点,对应合约余额大于投资者队列的待支付金额的判断语句,该节点状态为α;
模块7.4,用于在模块7.3的路径约束基础上,进行balance值来源的判断,方法是遍历程序节点找到包含PUSH10+SLOAD、CALLVALUE+ADD、ADD+SSTORE的指令段节点,对应的源码逻辑为从EVMSTORAGE取出balance的值,在投资行为后对合约余额进行更新操作,将balance重新存入STORAGE,此节点状态为β;
模块7.5,用于找到指令块中包含PUSH10+SLOAD和 SUB的部分,该部分对应于一般庞氏骗局的在支付投资者报酬后对合约余额进行更新的逻辑操作,此节点状态为γ;
模块8,用于构造路径约束表达式α∩β∩γ,进行约束求解;
模块9,如果若模块8的约束求解失败,则执行模块11,否则执行模块10;
模块10,用于判断该合约存在庞氏骗局;
模块11,用于判断该合约不存在庞氏骗局。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110260243.9A CN112990941B (zh) | 2021-03-10 | 2021-03-10 | 一种针对智能合约中庞氏骗局的漏洞检测方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110260243.9A CN112990941B (zh) | 2021-03-10 | 2021-03-10 | 一种针对智能合约中庞氏骗局的漏洞检测方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112990941A CN112990941A (zh) | 2021-06-18 |
CN112990941B true CN112990941B (zh) | 2022-06-07 |
Family
ID=76336310
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110260243.9A Active CN112990941B (zh) | 2021-03-10 | 2021-03-10 | 一种针对智能合约中庞氏骗局的漏洞检测方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112990941B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113904844B (zh) * | 2021-10-08 | 2023-09-12 | 浙江工商大学 | 基于跨模态教师-学生网络的智能合约漏洞检测方法 |
CN114510723B (zh) * | 2022-02-18 | 2024-04-16 | 北京大学 | 一种智能合约权限管理漏洞检测方法及装置 |
CN116361810A (zh) * | 2023-03-29 | 2023-06-30 | 中国石油大学(华东) | 一种基于符号执行的智能合约漏洞检测方法 |
CN116820405B (zh) * | 2023-08-31 | 2023-12-01 | 浙江大学 | 一种基于复用分析的evm字节码控制流图构建方法 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105550875A (zh) * | 2014-10-22 | 2016-05-04 | 卡巴斯基实验室股份制公司 | 用于保护电子货币交易的系统和方法 |
KR101947760B1 (ko) * | 2018-09-04 | 2019-02-13 | 김종현 | 스마트콘트랙트의 보안 인증 서버 |
CN110751554A (zh) * | 2019-09-20 | 2020-02-04 | 暨南大学 | 区块链中数字货币的智能监测方法及系统 |
CN112419820A (zh) * | 2020-11-04 | 2021-02-26 | 武汉大学 | 一种区块链攻防虚拟仿真实验教学系统及方法 |
CN112434742A (zh) * | 2020-11-26 | 2021-03-02 | 西安交通大学 | 一种识别以太坊上庞氏骗局的方法、系统及设备 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111127207B (zh) * | 2019-12-28 | 2023-06-09 | 哈尔滨工业大学 | 一种基于区块链的药品销售欺诈行为的监管系统及其监管方法 |
CN111695887A (zh) * | 2020-04-24 | 2020-09-22 | 江苏荣泽信息科技股份有限公司 | 基于区块链的安全支付交互系统 |
-
2021
- 2021-03-10 CN CN202110260243.9A patent/CN112990941B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105550875A (zh) * | 2014-10-22 | 2016-05-04 | 卡巴斯基实验室股份制公司 | 用于保护电子货币交易的系统和方法 |
KR101947760B1 (ko) * | 2018-09-04 | 2019-02-13 | 김종현 | 스마트콘트랙트의 보안 인증 서버 |
CN110751554A (zh) * | 2019-09-20 | 2020-02-04 | 暨南大学 | 区块链中数字货币的智能监测方法及系统 |
CN112419820A (zh) * | 2020-11-04 | 2021-02-26 | 武汉大学 | 一种区块链攻防虚拟仿真实验教学系统及方法 |
CN112434742A (zh) * | 2020-11-26 | 2021-03-02 | 西安交通大学 | 一种识别以太坊上庞氏骗局的方法、系统及设备 |
Non-Patent Citations (5)
Title |
---|
Exploiting blockchain data to detect smart ponzi schemes on ethereum;W Chen;《IEEE Access》;20191231;全文 * |
以太坊庞氏骗局的类型分析与识别方法;喻文强;《重庆大学学报》;20201215;第43卷(第11期);全文 * |
基于深度神经网络的庞氏骗局合约检测方法;张艳梅;《计算机科学》;20210202;第48卷(第1期);全文 * |
移动云环境下的安全关键技术研究;何琨;《中国博士学位论文全文数据库 信息科技辑》;20190115;全文 * |
网络安全学院实验教学平台的研究与设计;陈波;《实验室科学》;20210228;全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN112990941A (zh) | 2021-06-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112990941B (zh) | 一种针对智能合约中庞氏骗局的漏洞检测方法及系统 | |
Chatterjee et al. | Quantitative analysis of smart contracts | |
Xu et al. | Sok: Decentralized exchanges (dex) with automated market maker (amm) protocols | |
Kalra et al. | Zeus: analyzing safety of smart contracts. | |
Buterin | Ethereum white paper | |
CN109472596B (zh) | 基于交易评估的联盟链共识方法及系统 | |
US11188977B2 (en) | Method for creating commodity assets from unrefined commodity reserves utilizing blockchain and distributed ledger technology | |
CN110148017B (zh) | 基于区块链的权益发放方法及装置、电子设备、存储介质 | |
CN110147990B (zh) | 基于区块链的缴费代扣签约方法及装置、电子设备 | |
CN110163590B (zh) | 基于区块链的缴费代扣方法及装置、电子设备、存储介质 | |
Cohney et al. | Transactional scripts in contract stacks | |
WO2020107919A1 (zh) | 基于创新性的信誉证明共识协议的分布式网络及生态系统 | |
Haque et al. | Blockchain development and fiduciary duty | |
CN111475513B (zh) | 表单生成方法、装置、电子设备及介质 | |
US20220036350A1 (en) | Cross-border resource transfer authenticity verification method, device and electronic equipment | |
CN104866484A (zh) | 一种数据处理方法和装置 | |
Demir et al. | Security smells in smart contracts | |
Atzei et al. | Developing secure Bitcoin contracts with BitML | |
CN110188112A (zh) | 一种区块链智能合约的变更记录的追溯方法及装置 | |
US20190362241A1 (en) | Systems and methods for configuring an online decision engine | |
CN113537960A (zh) | 一种异常资源转移链路的确定方法、装置和设备 | |
Ko et al. | Survey on blockchain‐based non‐fungible tokens: History, technologies, standards, and open challenges | |
Uriawan | SWOT Analysis of lending platform from blockchain technology perspectives | |
CN112990780B (zh) | 一种工作流的构建方法、装置和设备 | |
Zhu et al. | Making smart contract classification easier and more effective |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |