首页 专利交易 科技果 科技人才 科技服务 商标交易 会员权益 IP管家助手 需求市场 关于龙图腾
 /  免费注册
到顶部 到底部
清空 搜索

【发明公布】一种智能合约升级漏洞的检测方法_广东启链科技有限公司_202311802367.0 

申请/专利权人:广东启链科技有限公司

申请日:2023-12-26

公开(公告)日:2024-04-30

公开(公告)号:CN117951711A

主分类号:G06F21/57

分类号:G06F21/57;G06F8/41;G06F8/53;G06F8/65

优先权:

专利状态码:在审-实质审查的生效

法律状态:2024.05.17#实质审查的生效;2024.04.30#公开

摘要:本发明属于合约漏洞检测领域,尤其是一种智能合约升级漏洞的检测方法,针对现有的智能合约无法检测内存冲突和变形智能合约的访问控制问题问题,现提出如下方案,其包括以下步骤:S1:获取合约,S2:生成抽象语法树,获取槽映射关系;S3:编译源代码获得字节码,再反汇编得到操作码特征;S4:根据上述获得的槽映射关系与操作码特征,通过符号执行动态的构建控制流图;本发明能够检测可升级智能合约特有的内存冲突漏洞,也关注到了使用率较低的create2模式下创建的合约的自毁函数权限访问控制漏洞,能够填补这方面漏洞检测的空白,构建出精度更高的控制流图,从而提高漏洞检测的精度。

主权项:1.一种智能合约升级漏洞的检测方法,其特征在于,包括以下步骤:S1:获取合约;分别输入UUPS代理合约或create2工厂合约、旧版本合约、新版本合约;S2:生成抽象语法树,获取槽映射关系;首先通过语法分析器解析源代码,并根据解析结果生成源代码对应的抽象语法树,可以使用Solidity官方依据c++语言编写的编译器solc或者ANTLR4来生成抽象语法树,抽象语法树中含有合约定义结点以及合约定义结点下的函数声明子结点,每个树结点都表征了智能合约中的一个函数代码的定义信息;智能合约中的数据可以存储在插槽、内存或calldata中,插槽用于永久数据,而内存用于合约执行期间的临时使用,智能合约中的每个可变的状态变量在编译过程中都会被分配一个槽ID,表示其存储空间,这些槽ID有助于合约在执行期间确定状态变量的确切存储位置;通过分析抽象语法树,可以静态地获取合约中状态变量的槽ID,并记录它们的名称和数据类型,形成槽映射关系,这有助于在之后符号执行的过程中更方便的监控这些变量的操作码,同时抽象语法树可检查函数声明,通过检查函数关键字,比如“upgradeable”和“proxy”,可以识别出是UUPS模式的代理合约还是create2模式的代理合约;S3:编译源代码获得字节码,再反汇编得到操作码特征;S3.1:智能合约编译后的字节码以二进制的形式表示,其中包括了部署代码、runtime代码、auxdata三个部分,而智能合约部署后在链上执行的时runtime代码,我们要提取的操作码特征就在runtime代码中,操作码由以太坊定义,目前已定义了142种操作码,包括算术运算、位运算、存储操作、跳转操作码;字节码将通过反汇编模块获取汇编代码,再进一步提取操作码;S3.2:需要特别关注的操作码;CREATE2操作码:使用create2方式部署合约的代理合约中,不论是自定义的创建方法还是官方提供的创建方法都要涉及到CREATE2操作码;调用外部合约操作码CALLCODE:代理合约调用逻辑合约的方式一;委托调用操作码DELEGATECALL:代理合约调用逻辑合约的方式二;存储操作码,包括但不限于MSTORE、MLOAD、SSTORE:逻辑合约在执行过程中需要检查并调用用户数据,会对状态变量进行读取、存储、更新操作,这涉及到存储相关的操作码;堆栈操作码,包括但不限于PUSH、DUP、SWAP:许多逻辑合约都要管理各自的虚拟资产,因此会有代币授权、转账操作,这涉及到堆栈相关的操作码;SELFDESTRUCT操作码:要利用create2向同一地址部署合约,则被部署的合约必须存在自毁函数,该函数会涉及到SELFDESTRUCT操作码;S4:根据上述获得的槽映射关系与操作码特征,通过符号执行动态的构建控制流图;S4.1:符号执行技术指的是通过程序分析的方法,确定哪些输入向量会导致程序的对应执行结果向量的方法,它的关键思想是把程序的输入值变为符号值,那么经过代码计算后的输出值就会是一个符号输入值的函数;S4.2:控制流图是程序代码的一种表征形式,是一个过程或程序的抽象数据结构,代表了一个程序在执行过程中所有会被执行的路径,控制流图是以基本块为节点的有向图G=N,E,其中N是节点集合,表示程序中的基本块;E是基本块之间边的集合,每个控制流图都存在至少两个指定的块:输入块和输出块;在控制流图构造的过程中,通常会遭遇到间接地址跳转的问题,间接跳转地址是指目标地址存放在内存或寄存器中的跳转地址,这类值通常无法通过直接的静态分析得到,如果使用近似值的模块对控制流进行扩充,会导致结果相对不够精确,同时会引入不该存在的控制流路径;在可升级智能合约中,由于逻辑合约与代理合约部署在不同地址,同时对用户数据有大量的调用更新,因此在合约执行的过程中会遇到许多计算变量地址值的情况,相应的也会有存在间接地址跳转的问题,因此在构建可升级智能合约控制流图的过程中,当遇到间接地址跳转问题时,使用符号执行进行辅助可以生成更加精确的控制流图节点;S4.3:下面是控制流图的基本构建流程:构建控制流图基本块,基本块指的是程序顺序执行的语句序列,对一个基本块来说,执行时只从其入口进入,从其出口退出,遇到第一条指令,结束当前基本块,并将该指令作为一个新块的第一条指令;遇到跳转、分支、循环指令,将该指令作为当前块的最后一条指令,并结束当前块,如果遇到的跳转指令计算的地址值为间接地址,则使用符号执行计算路径条件,得到更加精确的下一目标地址值,遇到其他语句直接将其加入到当前基本块;构建控制流图有向边,有向边能够显示智能合约内各基本块之间的相互关系、动态执行状态,如果从基本块A的出口转向基本块B,则从基本块A到B有一条有向边表示从A到B存在一条可执行路径,即在执行完基本块A中的程序后,有可能顺序执行基本块B中的程序;S4.4:检测漏洞类别;内存冲突:新合约的存储变量与代理合约的变量是否存在覆盖情况、新合约能否正常继承旧合约的变量;自毁函数访问控制漏洞:自毁函数是否有Onlyowner修饰符。

全文数据:

权利要求:

百度查询: 广东启链科技有限公司 一种智能合约升级漏洞的检测方法

免责声明
1、本报告根据公开、合法渠道获得相关数据和信息,力求客观、公正,但并不保证数据的最终完整性和准确性。
2、报告中的分析和结论仅反映本公司于发布本报告当日的职业理解,仅供参考使用,不能作为本公司承担任何法律责任的依据或者凭证。