[发明专利]一种针对以太坊智能合约的静态代码审计系统及方法有效
申请号: | 201811404851.7 | 申请日: | 2018-11-23 |
公开(公告)号: | CN109684838B | 公开(公告)日: | 2020-03-27 |
发明(设计)人: | 李洪伟;谈辰;刘森;成艺;龚丽;杨浩淼;任彦之 | 申请(专利权)人: | 电子科技大学 |
主分类号: | G06F21/56 | 分类号: | G06F21/56 |
代理公司: | 电子科技大学专利中心 51203 | 代理人: | 李明光 |
地址: | 611731 四川省成*** | 国省代码: | 四川;51 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 针对 以太 智能 合约 静态 代码 审计 系统 方法 | ||
1.一种在区块链的以太坊平台上针对智能合约的静态代码审计方法,其特征在于,包括以下步骤:
步骤1.系统预处理:
系统对用户的输入进行合法性检测,然后将项目整体复制到临时工作目录中,并将其中的Solidity文件中的注释部分删除;
步骤1-1.用户输入待审计的智能合约项目目录或者单个代码文件的路径PATH,系统检测首先检测PATH是否合法,如果PATH非法则警告提示,如果PATH合法则进入步骤1-2;
步骤1-2.系统定位到PATH所在位置,将整个目录或文件全部复制到临时工作目录WORK中;
步骤1-3.遍历工作目录WORK,找到以sol为后缀名的Solidity代码文件,把文件中的注释部分全部删除;
步骤2.语法树生成:
针对每一个Solidity代码文件,首先处理其引用文件,将引用的部分内容复制到当前文件中,然后进行词法分析,把每一个合法的词汇都提取出来,接着对词汇进行再处理操作,将其中的变量和常量封装成对应的结构类型,最后进行语法分析,通过下推自动机等技术将代码表达式转化成语法树的形式;
步骤2-1.系统维护一个待解析文件列表Lista和一个已解析文件列表Listb,最初将所有的Solidity代码文件全部放入Lista中,Listb置空;
步骤2-2.检查Lista中是否有文件,若有则依次将其取出并对其进行步骤2-3的操作,否则进入步骤2-8;
步骤2-3.对于任一Solidity代码文件,系统首先检查Solidity代码文件是否在已解析文件列表中,若在则进入步骤2-2,否则进入步骤2-4;
步骤2-4.检查文件是否存在“import”关键词,若存在则确定Solidity代码文件有引用文件,系统通过“import”关键词后的路径来定位得到引用文件的路径,将引用关系记录下来,然后针对引用文件进入步骤2-3操作;如果不存在引用文件则进入步骤2-5;
步骤2-5.系统利用有限自动机技术,对代码内容进行词法分析:
对于一个字符Ci,下标i为字符在代码内容中的位置,如果它是“(”、“)”、“{”、“}”界限制词,则将其单独提取出来;
如果字符Ci是双引号或者单引号,则依次判断它之后的字符,直到也为对应的双引号或者单引号,k1为正整数,然后将作为一个字符串常量单词提取出来;
如果字符Ci是下划线“_”或者字母,则依次判断它之后的字符,直到构成的单词不满足Solidity的变量命名规则,然后将作为一个标识符单词提取出来,k2为正整数;
如果字符Ci是数字,则依次判断它之后的字符,直到不能再表示为数字,然后将作为一个数字单词提取出来,k3为正整数;
如果字符Ci是“+”、“-”、“*”等运算、赋值或比较符号,则依次判断它之后的字符,直到不能再构成一个合法的运算、赋值或比较符号,然后将作为一个符号单词提取出来,k4为正整数;
系统将提取出来的单词以名称name的形式保存,系统在判断过程中同时也通过检测换行符来确定每个单词所在的行号,最终生成单词结构word,它由word的名称namew和行号nw的二元组(namew,nw)表示;
步骤2-6.系统对词法分析生成的二元组结构word进行再处理操作:
对于一个二元组wordt,下标t表示第t个二元组,首选判断其单词名称namew是否为Solidity语言的基本类型,如果是则继续判断之后的word结构,使其中的namew值的排列能够满足solidity的变量声明结构,直到wotdt-wordt+j无法再构成一个合法的变量声明,j为正整数,然后将wotdt-wordt+j-1封装成一个由基本类型typev、限制关键词restrictionv、变量名称namev和行号nv组成的四元组变量var,其表达式为(typev,restrictionv,namev,nv),同时将原来的单词结构wordt替换为var,并删除从wordt+1到wordt+j-1的单词结构;如果wordt中的名称namew为字符串或数字常量,则将其直接封装为一个由类型typec、内容contentc和行号nc组成的三元组结构constant,其表达式为(typec,contentc,nc),然后将原wordt替换为constant;对于其他的namew值则保持不变;
步骤2-7.系统对生成的word、var和constant结构进行语法分析:
系统首先找到“contract”、“library”和“interface”关键词,然后创建相应的类型结构:
对于一个二元组wordt,如果其名称namew为contract、library或interface,则创建mainBlock结构,然后根据后续的word、var和constant结构依次确定其类型typemb、名称namemb和继承关系basemb,直到出现一个wordkk,kk为正整数,其中的名称namew为界符“{”;
然后以界符“{”和“}”为边界,对其中的内容继续解析,在此阶段主要的结构为StateVariables、Functions、Function Modifiers、Events、Struct Types和Enum Types;
系统采用下推自动机的技术,根据Solidity语言制定的规约规则将变量、常量和运算、赋值或比较符号规约成变量表达式;
对于函数类型,系统将根据Solidity的函数定义规则,依次检测其名称namef、参数paramf、限制词restrictionf和返回值returnf,然后再以界符“{”和“}”为边界,对其中的表达式内容进行解析,解析过程同变量表达式,最后得到表达式集合expListf,并将其添加到函数结构中;如果函数声明后的内容不是界符“{”而是分号“;”,则该函数为抽象函数,函数解析结束;函数解析结束后,将生成的函数结构添加到mainBlock中;
对于函数调节器,系统将根据Solidity的函数调节器定义规则,依次检测其名称namem和参数paramm,然后再以界符“{”和“}”为边界,对其中的表达式内容进行解析,解析过程同变量表达式,最后得到表达式集合expListm,然后将其添加到函数调节器结构中;函数调节器解析结束后,将生成的函数调节器结构添加到mainBlock中;
对于事件类型,系统将根据Solidity的事件定义规则依次检测其名称namee和参数parame,并将生成的事件结构添加到mainBlock中;
对于结构类型,系统将根据Solidity的结构定义规则将依次检测其名称names和其中的变量values,并将生成的结构添加到mainBlock中;
对于枚举结构,系统将将根据Solidity的枚举定义规则依次检测其名称nameenum和其中枚举的对象valueenum,并将生成的枚举结构添加到mainBlock中;
通过上述解析操作,系统将会生成一个或若干个语法树,此时该代码文件已解析完成,将其放入已解析文件列表Listb中,同时在未解析文件列表Lista中将Solidity代码文件删除,返回步骤2-2;
步骤2-8.所有的代码文件已经全部解析为语法树的形式,系统将进入静态特征匹配阶段;
步骤3.静态特征匹配:
系统将对每一个代码文件对应的语法树进行特征匹配,通过遍历语法树的每一个分支,与预先制定的逻辑规则相匹配,如果匹配成功,则可以定位到具体的表达式上;
步骤4.检测报告生成:
系统将匹配得到的结果首先按照文件进行分类,在每个文件中再按照威胁的类型对结果再分类,对于每个发现的威胁给出具体的代码位置、危害和解决方式;最终,系统汇总所有的结果并生成一个整体的报告。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于电子科技大学,未经电子科技大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201811404851.7/1.html,转载请声明来源钻瓜专利网。