CN112100054A - 一种面向数据管控的程序静态分析方法和系统 - Google Patents

一种面向数据管控的程序静态分析方法和系统 Download PDF

Info

Publication number
CN112100054A
CN112100054A CN202010809497.7A CN202010809497A CN112100054A CN 112100054 A CN112100054 A CN 112100054A CN 202010809497 A CN202010809497 A CN 202010809497A CN 112100054 A CN112100054 A CN 112100054A
Authority
CN
China
Prior art keywords
analysis
control flow
bytecode
flow graph
analysis result
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.)
Granted
Application number
CN202010809497.7A
Other languages
English (en)
Other versions
CN112100054B (zh
Inventor
黄罡
蔡华谦
黄家梅
姜海鸥
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Peking University
Original Assignee
Peking University
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Peking University filed Critical Peking University
Priority to CN202010809497.7A priority Critical patent/CN112100054B/zh
Publication of CN112100054A publication Critical patent/CN112100054A/zh
Priority to US17/154,003 priority patent/US11036614B1/en
Application granted granted Critical
Publication of CN112100054B publication Critical patent/CN112100054B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/75Structural analysis for program understanding
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3604Software analysis for verifying properties of programs
    • G06F11/3608Software analysis for verifying properties of programs using formal methods, e.g. model checking, abstract interpretation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • G06F8/425Lexical analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/433Dependency analysis; Data or control flow analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/436Semantic checking
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45504Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
    • G06F9/45508Runtime interpretation or emulation, e g. emulator loops, bytecode interpretation
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L9/00Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
    • H04L9/32Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols including means for verifying the identity or authority of a user of the system or for message authentication, e.g. authorization, entity authentication, data integrity or data verification, non-repudiation, key authentication or verification of credentials
    • H04L9/3236Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols including means for verifying the identity or authority of a user of the system or for message authentication, e.g. authorization, entity authentication, data integrity or data verification, non-repudiation, key authentication or verification of credentials using cryptographic hash functions
    • H04L9/3239Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols including means for verifying the identity or authority of a user of the system or for message authentication, e.g. authorization, entity authentication, data integrity or data verification, non-repudiation, key authentication or verification of credentials using cryptographic hash functions involving non-keyed hash functions, e.g. modification detection codes [MDCs], MD5, SHA or RIPEMD
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L9/00Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
    • H04L9/50Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols using hash chains, e.g. blockchains or hash trees

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • General Physics & Mathematics (AREA)
  • Physics & Mathematics (AREA)
  • Quality & Reliability (AREA)
  • Computer Hardware Design (AREA)
  • Computer Security & Cryptography (AREA)
  • Signal Processing (AREA)
  • Computer Networks & Wireless Communication (AREA)
  • Computational Linguistics (AREA)
  • Stored Programmes (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

本发明实施例提供了一种面向数据管控的程序静态分析方法和系统,所述方法和系统生成智能合约代码的字节码;解析所述字节码,构建并打印控制流图;将所述智能合约中的污点源,添加到所述控制流图的起始块的分析结果中,遍历所述控制流图,基于污点分析技术进行数据依赖分析,持续更新所述控制流图中的基本块的分析结果,返回最终分析结果;生成并返回分析报告。本发明实施例提供的方法和系统,针对面向数据的管控需求的智能合约,实现了基于污点分析技术的静态分析算法,能基于不同的数据管控策略来定义数据约束并进行静态分析,保障面向数据管控的区块链平台上智能合约的准确运行和数据管控。

Description

一种面向数据管控的程序静态分析方法和系统
技术领域
本发明涉及通信技术领域,特别是涉及一种面向数据管控的程序静态分析方法和一种面向数据管控的程序静态分析系统。
背景技术
智能合约是部署在区块链上的可执行代码,区块链为智能合约提供了可信执行的环境,除传统的以以太坊为例的智能合约在加密货币领域的应用以外,现如今智能合约还广泛应用于金融、投票、供应链、电子商务等领域。智能合约一旦上链执行是不可逆的,需在其执行前就发现潜在的漏洞。
程序静态分析是在程序执行前发现其漏洞的主要手段。智能合约作为一种特殊的程序,不同领域下的智能合约则需要进行面向领域特定目标的静态分析,以保障智能合约的准确运行。而目前已有的对智能合约进行静态分析的方法仅适用于加密货币领域,如:整型溢出、Fallback检测等等。
随着区块链在不同领域的广泛使用,出现了面向数据全生命周期管控的区块链平台,该平台为了保障数据所有者的权益,原始数据并不是像加密货币的交易数据一样被记录在账本上被所有参与者共享,而是数据使用者通过提供智能合约的方式向数据所有者发起请求,数据所有者需要审计智能合约是否合理合法地使用其数据,然后使用者才能使用数据。目前,面向数据管控的区块链平台中,由于仍然缺乏相应的智能合约的静态分析方法,完全由数据使用者来人工审计智能合约的做法,效率低下、成本高昂。
发明内容
鉴于上述问题,提出了本发明实施例提供一种克服上述问题或者至少部分地解决上述问题的一种面向数据管控的程序静态分析方法和一种面向数据管控的程序静态分析系统。
为了解决上述问题,本发明实施例提供了一种面向数据管控的程序静态分析方法,所述方法包括:通过合约语言转换器、合约语言编译器和字节码提取器,对智能合约代码进行编译解释,生成所述智能合约代码的字节码;通过字节码操纵框架,解析所述字节码的指令之间的控制流关系,进而根据所述控制流关系,构建并打印控制流图;将所述智能合约中的污点源,添加到所述控制流图的起始块的分析结果中,遍历所述控制流图,基于污点分析技术进行数据依赖分析,持续更新所述控制流图中的基本块的分析结果,完成对所述智能合约的静态分析;针对所述静态分析,预先定义分析结果的表现形式、与所述分析结果相关的基本操作,根据所述定义,控制所述分析结果的更新,并返回最终分析结果;根据所述最终分析结果,生成并返回分析报告。
可选地,通过合约语言转换器、合约语言编译器和字节码提取器,对智能合约代码进行编译解释,生成所述智能合约代码的字节码,包括:使用所述合约语言转换器,将符号(token)分组成符号类(token class),将合约语言用户自定义的语法翻译成词法分析;使用合约语言编译器,根据词法分析构建出抽象语法树,完成编译过程;使用字节码提取器,对所述抽象语法树进一步处理,完成所述编译过程余下的语义分析和代码生成步骤,最后生成字节码。
可选地,通过字节码操纵框架,解析所述字节码的指令之间的控制流关系,进而根据所述控制流关系,构建并打印控制流图,包括:通过字节码操纵框架ASM,提取和解析字节码文件的字节码指令序列;根据预先设定的所述控制流图的基本块建立标准,将相应的字节码指令序列添加到所述控制流图的基本块中,即,建立所述控制流图的基本块;根据所述基本块之间执行流向的判断标准,构建所述基本块之间的执行流向;构建并打印所述控制流图。
可选地,通过字节码操纵框架ASM,提取和解析字节码文件的字节码指令序列,包括:
所述字节码操纵框架ASM通过Core API,提供基于事件的字节码操纵模型;以及,所述字节码操纵框架ASM通过Tree API,提供基于对象的字节码操纵模型;
可选地,通过字节码操纵框架ASM,提取和解析字节码文件的字节码指令序列,包括:所述基于事件的字节码操纵模型,利用访问者Visitor及其各种实现类,将对象化的类文件重构成一个二进制格式的字节码文件,进而提取和解析所述字节码文件的字节码指令序列;以及,所述基于对象的字节码操纵模型,使用对象树结构来解析每一个字节码文件,利用节点Node及其各种实现类,重构新的字节码文件,进而提取和解析所述字节码文件的字节码指令序列;其中,所述字节码文件是类文件,所提供的信息包括:类名称、类属性、字节码指令集。
可选地,将所述智能合约中的污点源,添加到所述控制流图的起始块的分析结果中,遍历所述控制流图,基于污点分析技术进行数据依赖分析,持续更新所述控制流图中的基本块的分析结果,完成对所述智能合约的静态分析,包括:针对所述智能合约中的普通变量,添加污点标记,成为污点变量,完成污点源的识别;对所述污点变量进行无害处理,所述污点变量经过无害处理后与其他普通变量之间进行各种依赖关系的传播,最终汇聚到污点汇聚点,完成污点传播分析。
可选地,针对所述静态分析,预先定义分析结果的表现形式,包括:
针对设计模拟所述字节码在虚拟机中的执行过程,预先定义一个栈帧结构,用于模拟所述污点源随着程序的局部变量在局部变量表中的传递过程;针对全局变量,预先定义一个堆对象,用于表示全局变量中的实例对象,对于被标记的实例对象的引用也可在所述局部变量表中进行传递。
可选地,针对所述静态分析,预先定义与所述分析结果相关的基本操作,包括:
预先定义合并多条指令执行的分析结果的操作,用于针对所述控制流图中基本块内部多条指令的执行后,合并所述多条指令执行后的分析结果;预先定义判断两个分析结果是否存在包含关系的操作,用于针对所述控制流图中基本块执行前后分析结果的变化,判断所述基本块执行前的分析结果是否包含在所述基本块执行后的分析结果中;预先定义合并基本块的分析结果的操作,用于针对所述控制流图中基本块执行前后分析结果的变化,将执行前的分析结果合并到执行后的分析结果中;预先定义分析结果的克隆操作,用于实现所述分析结果的合并;预先定义打印分析结果的操作,用于针对所述栈帧结构模拟程序污点源随着程序变量在程序中的传递过程,打印分析结果,以便于直观地查看污点传播过程。
可选地,根据所述最终分析结果,生成并返回分析报告,包括:基于图的广度优先遍历算法(BFS),采用分层遍历的方式,把所述控制流图中当前基本块的所有后续基本块的分析结果进行分析整合,放入所述最终分析结果的集合,根据所述最终分析结果的集合,生成并返回分析报告。
本发明实施例还提供了一种面向数据管控的程序静态分析系统,所述系统具体包括:
字节码重构模块,用于通过合约语言转换器、合约语言编译器和字节码提取器,对智能合约代码进行编译解释,生成所述智能合约代码的字节码;
控制流图构建模块,用于通过字节码操纵框架,解析所述字节码的指令之间的控制流关系,进而根据所述控制流关系,构建并打印控制流图;
静态分析模块,用于将所述智能合约中的污点源,添加到所述控制流图的起始块的分析结果中,遍历所述控制流图,基于污点分析技术进行数据依赖分析,持续更新所述控制流图中的基本块的分析结果,完成对所述智能合约的静态分析;
分析结果控制模块,用于针对所述静态分析,预先定义分析结果的表现形式、与所述分析结果相关的基本操作,根据所述定义,控制所述分析结果的更新,并返回最终分析结果;
分析报告导出模块,用于根据所述最终分析结果,生成并返回分析报告。
从上述技术方案可以看出,本发明实施例提供了一种面向数据管控的程序静态分析方法和系统,从智能合约分析工具的功能实现的层面出发,面向数据使用的管控需求,通过对智能合约代码进行编译解释,重构字节码,基于对所述字节码的分析,建立并打印控制流图,通过对字节码级别的控制流图进行遍历,基于污点分析技术对污点源进行数据依赖分析,获取最终分析结果,能够基于不同的数据管控策略来定义数据约束并进行静态分析,满足对面向数据管控的智能合约的自动化审计需求,保障面向数据管控的区块链平台上智能合约的准确运行和数据管控。
附图说明
图1是一种面向数据管控的区块链平台的技术架构图;
图2是一种基于智能合约的数据隐私保护策略示例图;
图3是本发明提供的一种面向数据管控的程序静态分析方法的步骤流程图;
图4是本发明实施例提供的一种YJS语言智能合约静态分析架构示意图;
图5是本发明实施例提供的一种基于字节码构建并打印控制流图的流程图;
图6是本发明实施例提供的一种基于事件的字节码操纵模型的字节码处理流程图;
图7是本发明实施例提供的一种建立基本块的流程图;
图8是本发明实施例提供的一种建立基本块之间执行流向的流程图;
图9是本发明实施例提供的一种打印控制流图的流程图;
图10是本发明实施例提供的一种污点分析处理过程示意图;
图11是本发明实施例提供的一种BFS遍历流程图;
图12是本发明提供的一种面向数据管控的程序静态分析系统的结构框图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
图1示出了一种面向数据管控的区块链平台的技术架构图,其可信计算层围绕智能合约语言,提供了合约开发环境、运行环境和其他编程语言的第三方库调用模块。实现随机多节点相互校验的可信计算,并支持调用可信存储出层的接口将合约执行的过程信息存储到可信存储层。
图2示出了一种基于智能合约的数据隐私保护策略示例图,参照图2所示,所述示例通过两种合约:由数据使用者编写的算法合约和由所述算法合约调用的数据合约,来统计男女性别数量。如图所示,由于该算法合约具有数据隐私保护的敏感策略,允许返回人员列表根据性别统计后的返回结果,不允许返回包含姓名和性别的数据列表,即该合约只允许返回男女性别比的统计结果,而非包含姓名和性别一一对应的原始数据列表。因此,基于此敏感策略,数据所有者需审核算法合约,判断其是否满足该敏感策略。对于数据所有者来说,完全依赖人工去判断一个智能合约是否合理合法地使用数据(即审核智能合约是否符合数据隐私保护策略)效率低、成本高。
一方面,由于当下面向数据管控的区块链平台的智能合约语言并非C、C++、Java或者JavaScript这类主流的编程语言,而是自主定制的类JavaScript语言;另一方面,现有的代码静态分析框架应用于代码风格、语法错误等潜在漏洞的检查,而针对面向数据管控的区块链平台的智能合约,是需要静态分析工具基于特定数据管控策略来定义数据约束并进行静态分析。因此,现有的代码静态分析框架不可用于面向数据管控的区块链平台的智能合约的静态分析。
实施例一
图3是本发明提供的一种面向数据管控的程序静态分析方法的步骤流程图。如图3所示,本发明提供的方法可以应用于面向数据管控的区块链平台,具体包括如下步骤:
步骤S101,通过合约语言转换器、合约语言编译器和字节码提取器,对智能合约代码进行编译解释,生成所述智能合约代码的字节码。
在本发明提供的一种优选实施例中,使用所述合约语言转换器,将符号(token)分组成符号类(token class),将合约语言用户自定义的语法翻译成词法分析;使用合约语言编译器,根据词法分析构建出抽象语法树,完成编译过程;使用字节码提取器,对所述抽象语法树进一步处理,完成所述编译过程余下的语义分析和代码生成步骤,最后生成字节码,供静态分析框架使用。
在本发明实施例中,所述合约语言转换器和合约语言编译器根据所述智能合约的编程语言进行选择。
图4示出了本发明实施例提供的一种YJS语言智能合约静态分析架构示意图。参照图4所示,以类JavaScript的YJS语言为例,合约语言转换器和合约语言编译器的功能可由一个编译转化模块ANTLR4(Another Tool for Language Recognition)来实现,先将由YJS语言编写的智能合约合约源代码进行词法分析和语法分析,构建抽象语法树(AbstractSyntax Tree,AST);同时将YJS语言转换为JavaScript语言。ANTLR可从语法上来生成一个可以构建和遍历解析树的解析器,支持领域特定语言(Domain Specific Language,DSL)的编译工作。ANTLR由两部分组成,分别是词法分析程序和解析程序。词法分析程序LEXER负责将用户自定义的语法翻译成词法分析器,即将符号(token)分组成符号类(token class);解析程序PARSER负责根据词法构建出抽象语法树,完成编译的工作。
参照图4,在本发明实施例中,以YJS语言智能合约静态分析的字节提取器选用Nashorn引擎和Eclipse编译器ECJ(Eclipse Compiler for Java)组成的Java字节码提取模块。其中,Nashorn扩展了Java在JVM上运行动态JavaScript脚本的能力,可以实现Java和JavaScript间的相互调用。而Eclipse编译器ECJ对生成的抽象语法树进一步处理,完成编译过程余下的语义分析和代码生成步骤,最后生成Java字节码,供静态分析模块使用。所述Eclipse编译器ECJ相较于传统的Sun JDK附带的Javac编译器,允许运行没有正确编译的代码,使得整个程序即便有错误的代码块仍能保证程序良好运行。
步骤S102,通过字节码操纵框架,解析所述字节码的指令之间的控制流关系,进而根据所述控制流关系,构建并打印控制流图。
控制流图CFG(Control Flow Graph)也叫程序控制流程图,是一个过程或者程序的抽象表现,代表了一个程序执行过程中会遍历到的所有路径,是编译器优化和程序静态分析的重要工具。控制流图由两个部分组成:基本块和执行流向。其中,基本块是一个程序内可以连续执行的最大单位或对程序控制的最小单位,它的特点是单入口,单出口,中间没有分支;执行流向则代表两个基本块之间的连线。
基于源代码的分析构造控制流图,属于正向程序分析。是通过构造再遍历抽象语法树AST(Abstract Syntax Tree),分析其中的控制流,来构造控制流图。对于一个有结构化编程特性的编程语言来说,时常会有分支、循环、异常处理等语法结构,隐含了不连续的控制流。因此,我们无法直接从AST里获取这些隐含的控制流信息,需先将AST转换成一种更细粒度的、把隐含的控制流显示暴露的中间表示IR(Intermediate Representation)。所以基于源代码分析构建的控制流图需要三个步骤:构建抽象语法树、生成中间表示以及控制流图构造。
而基于字节码的分析构造控制流图,属于逆向程序分析,相较于基于源代码的分析构造控制流图,能够更好的支撑污点分析技术的工作。
图5示出了本发明实施例提供的一种基于字节码构建并打印控制流图的流程图。参照图5所示,在本发明提供的一种优选实施例中,第一步,通过字节码操纵框架ASM,提取和解析字节码文件的字节码指令序列;第二步,根据预先设定的所述控制流图的基本块的建立标准,将相应的字节码指令序列添加到所述控制流图的基本块中,即,建立所述控制流图的基本块;第三步,根据所述基本块之间执行流向的判断标准,构建所述基本块之间的执行流向;第四步,构建并打印所述控制流图。
本发明实施例中,可选的字节码操纵框架包括:Soot、ASM和BCEL。其中,ASM(Assembly)是一个Java字节码操纵框架,可用于动态生成类或增强已有类的功能。ASM可在类加载到JVM之前通过读取、转换、写入等操作动态修改类的行为,以达到增强类的目的,甚至可直接生成新的类。
在本发明实施例中,所述字节码操纵框架ASM通过Core API,提供基于事件的字节码操纵模型;以及,所述字节码操纵框架ASM通过Tree API,提供基于对象的字节码操纵模型;
表1示出了基于事件的字节码操纵模型和基于对象的字节码操纵模型的属性对比。
表1
Figure BDA0002630410680000091
参照表1所示,基于事件的字节码操纵模型处理速度快、占内存少,但是类转换实现难;基于对象的字节码操纵模型类转换实现容易,但是速度慢,占内存多,性能相对低下。因此,本发明选用这两种字节码操纵模型可以实现互补,例如,在给类添加包含内容数字签名的注解时,Core API需要通过两次ClassReader读取字节码,因为计算数字签名在CoreAPI中需访问完所有类的内容之后进行,此时无法添加注解,需再使用ClassReader读取一次字节码来实现;而Tree API在这种情况下可直接添加。
图6示出了本发明实施例提供的一种基于事件的字节码操纵模型的字节码处理流程图。
参照图6所示,在本发明实施例中,所述基于事件的字节码操纵模型,利用访问者Visitor及其各种实现类,将对象化的类文件重构成一个二进制格式的字节码文件,进而提取和解析所述字节码文件的字节码指令序列。具体包括:第一步,ClassReader类读取字节码;同时输出原字节码文件;第二步,Visitor类处理读取出的字节码;第三步,Classwriter类生成新的字节码,并输出新的字节码文件;第四步,结束字节码处理。
在本发明实施例中,所述基于对象的字节码操纵模型的字节码处理流程与基于事件的字节码操纵模型相似,差别在于基于对象的字节码操纵模型是使用对象树结构来解析每一个字节码文件,利用节点Node及其各种实现类,重构新的字节码文件,进而提取和解析所述字节码文件的字节码指令序列。
所述字节码文件是类文件,所提供的信息包括:类名称、类属性、字节码指令集。
表2示出了本发明实施例提供的字节码操纵框架ASM的部分类。
表2
Figure BDA0002630410680000101
Figure BDA0002630410680000111
参照表2所示,本发明实施例结合ASM框架的Core API和Tree API,读取字节码文件,提取并解析字节码指令,用于程序控制流图的构建。其中ClassReader和AbstractInsnNode都充当类解析器的角色,解析类的成员、方法、注解等类的相关内容,接收ClassVistor对象,调用ClassVisitor类的访问方法并返回响应的访问者对象。而MethodVisitor和MethodNode则充当访问者的角色,定义了直接访问类方法中的字节码指令的方法,利用类解析器返回的访问者对象,直接访问类方法中的字节码指令。
所述控制流图中的基本块,是指程序中由多个连续的语句构成,只有一个入口和一个出口的语句序列。其中,语句序列的第一个语句即为入口,最后一个即为出口,且基本块的执行只能从入口开始,出口结束。具体而言,只有一个入口代表程序中不会有其他任何地方的语句能通过跳转类指令进入到此基本块中;只有一个出口代表程序中只有最后一条指令能导致进入到其他基本块去执行。因此,基本块的一个典型特点是:只要基本块的第一条指令被执行了,那么基本块内的其他所有指令都将按顺序执行,且仅执行一次。
本发明实施例构建的控制流图中的基本块由字节码指令序列构成的,而非传统的程序语句序列。在提取和解析字节码指令序列后,需根据设定的基本块建立标准将相应的字节码指令序列添加到基本块中,建立基本块。本发明实施例预先对所述字节码的指令进行了分类,以确定基本块建立的标准。
表3示出了本发明实施例提供的一种以JAVA字节码指令为例的分类。
表3
Figure BDA0002630410680000121
参照表3所示,本发明实施例将Java字节码指令分为了五种类型,分别是分支指令kInstrCanBranch、普通算数指令kInstrCanContinue、异常抛出指令kInstrCanThrow、返回指令kInstrCanReturn、函数调用指令kInstrInvoke。根据基本块单入口单出口的定义可知,基本块的最后一条指令能导致进入到其他基本块去执行。以分支指令为例,程序执行到分支指令时会跳转到不同的指令分支,因此当程序执行到分支指令时应划分一个基本块。返回、异常抛出、函数调用指令同理,由此,本发明实施例根据基本块的定义设定了一种基本块建立的标准。
表4示出了本发明实施例提供的一种基本块建立的标准。
表4
起始指令类型 结束指令类型 对应程序语句
kInstrCanContinue/null kInstrCanReturn return
kInstrCanContinue kInstrCanThrow throw
kInstrCanContinue kInstrCanBranch if、switch、for、while
kInstrCanContinue kInstrInvoke 合约调用、对象取值等
参照表4示出的基本块建立的标准,起始指令类型和结束指令类型满足其中标准的,则可加入基本块中建立基本块,即,当起始指令为普通算数指令,结束指令为返回return、异常抛出throw、分支、函数调用指令时,可以划分基本块。其中起始指令可以为顺序跳到下一条指令的普通算数指令,也可以为空,即,返回语句return可以单独作为一个基本块。
图7示出了本发明实施例提供的一种建立基本块的流程图,根据预先定义的基本块的建立标准,建立基本块。参照图7所示,本发明实施例在建立基本块的方法中,定义了两个访问者对象visitor1和visitor2,分别是InsnPass1Visitor和InsnPass2Visitor类型。InsnPass1Visitor和InsnPass2Visitor类都继承自MethodVisitor类,分别用于普通算数指令(kInstrCanContinue)的访问和可跳转指令(kInstrCanReturn、kInstrCanThrow、kInstrCanBranch、kInstrInvoke)的访问。具体包括:第一步,构建InsnPass1Visitor对象visitor1,并将起始块添加到基本块列表中;第二步,visitor1遍历并访问起始块的字节码指令集;第三步,将结束块添加到基本块列表中;第四步,去除基本块列表中不包含指令集的基本块;第五步,构建InsnPass2Visitor对象visitor2,并通过将异常捕捉块添加到该对象的异常捕获块列表中,设定其异常捕捉块;第六步,遍历基本块列表,visitor2遍历基本块的指令集;第七步,visitor2判断指令集的第一个指令是否是标签节点LabelNode,若是则进入第八步,若否则回退第6步;第8步,将跳转指令的标签Label添加到visitor2对象的preLabel中,即标记了前续块可跳转到当前块,实现基本块的划分;第九步,结束基本块的建立。
表5示出了发明实施例提供的一种基本块之间执行流向的构建标准。
表5
前置基本块 后置基本快
以kInstrCanBranch类型指令结尾的 前置基本块的所有后续块
以kInstrInvoke类型指令结尾的 前置基本块的后续块
以kInstrCanThrow类型指令结尾的 前置基本块的所有后续块
以kInstrCanReturn类型指令结尾的 结束块
参照表5所示,在基本块建立之后,应确定基本块之间的执行流向,本发明实施例预先设定了各基本块间执行流向的构建标准。如表5所示,当两个基本块满足该标准时,可在前置基本块和后置基本块之间构建执行流向,例如:若前置基本块是以kInstrCanBranch类型指令结尾的,则表示改基本块可跳转到多个分支块,则可在该基本块和该基本块的所有后续块之间建立执行流向。
确定基本块间执行流向的构建标准后,则可建立基本块间的执行流向,图8示出了本发明实施例提供的一种建立基本块之间执行流向的流程图。如图8所示,第一步,获取后置基本块的所有前序块;第二步,将前置基本块添加到该前续块集合中;第三步,获取前置基本块的所有后续块;第四步,将后置基本快添加到该后续块集合中,即可建立前置基本块和后置基本快之间的执行流向;第五步,结束基本块之间执行流向的建立。
当基本块和基本块间的执行流向建立后,则可在控制台打印控制流图,直观地展示字节码层面的程序执行过程。由于程序的执行以方法(函数)为单位,因此打印的控制流图除基本块和基本块间的执行流向信息,还应包括方法名、方法描述等信息。
图9示出了本发明实施例提供的一种打印控制流图的流程图,如图9所示,本发明实施例中,第一步,定义一个InsnPrinter类型的对象printer并设置指令标签labelOrder,InsnPrinter类继承自MethodVisitor类,定义了字节码指令打印的访问者对象,labelOrder为CFGraph类的成员变量,定义了指令的标签;第二步,打印方法名、方法描述等信息;第三步,遍历基本块列表,获取基本块的所有后续块,若当前基本块的后续块列表不为空,则进入第四步,否则继续遍历;第四步,遍历后续块列表,并打印基本块和后续块之间的执行流向;第五步,遍历基本块中的字节码指令序列,利用printer访问者对象打印字节码指令;第六步,结束控制流图的打印。
步骤S103,将所述智能合约中的污点源,添加到所述控制流图的起始块的分析结果中,遍历所述控制流图,基于污点分析技术进行数据依赖分析,持续更新所述控制流图中的基本块的分析结果,完成对所述智能合约的静态分析。
污点分析技术是一项分析程序污点源(sources)是否能够不经过无害处理(sanitizers)传播到污点汇聚点(sinks)的静态分析技术。
图10示出了本发明实施例提供的一种污点分析处理过程示意图。参照图10所示,污点分析可抽象成一个三元组<sources,sinks,sanitizers>,具体分为三个阶段:识别污点源和污点汇聚点、无害处理以及污点传播分析。
首先是污点源的识别,将普通变量添加污点标记形成污点变量;然后进行污点传播分析,污点变量经过无害处理后和普通变量间进行值传递依赖关系传播,最终汇聚到污点汇聚点。
在本发明实施例中,基于所述控制流图,可以选择多种静态分析算法,对所述智能合约中的污点源进行静态分析。
在本发明实施例中,所述程序控制流图将所述分析结果可视化,以更直观地展示数据的流向和依赖关系。
步骤S104,针对所述静态分析,预先定义分析结果的表现形式、与所述分析结果相关的基本操作,根据所述定义,返回最终分析结果。
基于污点分析技术的静态分析算法是分析污点源如何通过依赖关系在程序变量中进行传播。在Java环境中,编译好的Java字节码在Java虚拟机JVM中执行时,JVM会为每个方法创建一个栈帧,每个栈帧存储局部变量表、操作数栈、动态链接、返回地址等信息。因此程序中的局部变量是存储在栈帧的局部变量表中,而对于程序中的全局变量,其中常量和用static修饰的静态成员变量存储在方法区中,实例变量存储在方法区中,实例变量的引用存储在栈帧的局部变量中。
因此,在本发明实施例中,针对所述静态分析,预先定义分析结果的表现形式,包括:针对设计模拟所述字节码在虚拟机中的执行过程,预先定义一个栈帧结构,用于模拟所述污点源随着程序的局部变量在局部变量表中的传递过程;针对全局变量,预先定义一个堆对象,用于表示全局变量中的实例对象,对于被标记的实例对象的引用也可在所述局部变量表中进行传递。
在本发明实施例中,由于需要遍历所述控制流图和持续更新所述控制流图中的基本块的分析结果,完成对所述智能合约的静态分析,因此,针对所述静态分析,需要预先定义与所述分析结果相关的基本操作,包括:
预先定义合并多条指令执行的分析结果的操作,用于针对所述控制流图中基本块内部多条指令的执行后,合并所述多条指令执行后的分析结果;
预先定义判断两个分析结果是否存在包含关系的操作,用于针对所述控制流图中基本块执行前后分析结果的变化,判断所述基本块执行前的分析结果是否包含在所述基本块执行后的分析结果中;
预先定义合并基本块的分析结果的操作,用于针对所述控制流图中基本块执行前后分析结果的变化,将执行前的分析结果合并到执行后的分析结果中;
预先定义分析结果的克隆操作,用于实现所述分析结果的合并;
预先定义打印分析结果的操作,用于针对所述栈帧结构模拟程序污点源随着程序变量在程序中的传递过程,打印分析结果,以便于直观地查看污点传播过程。
在本发明实施例中,通过对分析结果的操作抽象类AnalysisResult进行设计,定义所述与所述分析结果相关的基本操作,用于所述控制流图的遍历。
本发明实施例通过定义TaintResult类以及其中的成员变量,定义分析结果在静态分析中的表现形式,用于数据依赖分析过程的实现。
表6示出了所述TaintResult类的成员变量及其含义。
表6
变量名 变量类型 含义
frame Frame<TaintValue>
ret TaintValue 被污点源标记后的分析结果
nLocals int 局部变量表的大小
nStack int 栈的大小
pnnter InsnPrinter 字节码指令访问器
interpreter TaintInterpreter 字节码指令解释器
如表6所示,成员变量中的frame和ret代表了分析结果在静态分析算法中的表现形式。Frame类由ASM框架的Tree API提供,定义一个栈帧结构,用于模拟被污点源标记的分析结果随程序的局部变量在局部变量表中的传递过程。TaintValue类将分析结果定义为一个长整型的数,将该整数转换为字符串后每个字符用“1/0”表示是否被污点源污染。
TaintResult类还依赖于类InsnPrinter、TaintInterpreter。其中,InsnPrinter类由ASM框架的Core API提供,用于字节码指令的访问。TaintInterpreter类继承自Interpreter抽象类并重写其抽象方法,用于字节码指令的解释。
在本发明实施例中,由于所述控制流图一个基本块内部包含多条字节码指令序列,因此基本块执行后需合并多条指令执行后的分析结果,因此本发明实施例在AnalysisResult类中定义了合并指令集分析结果的操作,并在TaintResult类中实现。首先利用本发明实施例实现的字节码解释器TaintInterpreter获取当前分析结果;然后利用字节码指令访问器InsnPrinter依次访问该基本块的字节码指令;最后将当前分析结果和字节码指令传入ASM Tree API提供的Frame类中的execute函数中进行分析,最终获得该基本块的分析结果。
表7示出了指令集分析结果的合并代码。
表7
Figure BDA0002630410680000181
如表7所示,在execute函数中,不同字节码指令的操作码对应不同分析结果的变化。如前文所提到的,分析结果定义在栈帧Frame类中,而局部变量表nLocals和栈nStack用于构建栈帧,数据依赖分析即将污点源放入局部变量表中,通过字节码指令执行的方式,分析污点源在局部变量表中的传递情况。同时,本发明实施例定义了TaintValue类用于表示污点源。则execute函数定义了TaintValue根据不同的字节码指令的操作码在局部变量表nLocals和栈nStack中的变化。
步骤S105,根据所述最终分析结果,生成并返回分析报告。
表8示出了本发明实施例中所述分析报告的内容具体信息。
表8
内容分类 内容具体信息
分析参数 数据源
分析结果 数据依赖信息、是否通过静态分析
合约代码 合约代码
程序控制流图 程序控制流图
如表8所示,所述分析报告包含分析参数、分析结果、合约代码和程序控制流图,其中,分析参数和分析结果是分析报告的主体部分。
所述分析报告可以导出为文件,如PDF格式的文档。
在控制流图的遍历中,由于参与静态分析的当前基本块可能同其他基本块一起作为某一基本块的后续块,因此,需要在一次遍历中整合所有后续区块的分析结果纳入最后的分析结果。
图11示出了本发明实施例提供的一种BFS遍历流程图,用于在一次遍历中整合所有后续区块的分析结果纳入最后的分析结果。
参照图11所示,在本发明提供的一种优选实施例中,基于图的广度优先遍历算法(BFS),采用分层遍历的方式,把所述控制流图中当前基本块的所有后续基本块的分析结果进行分析整合,放入所述最终分析结果的集合。具体流程如下:
表9示出了本发明实施例提供的一种BFS遍历代码。
表9
Figure BDA0002630410680000191
参照图11和表9所示,本发明实施例提供了一种BFS遍历流程,具体流程包括:第一步,新建一个空的分析集列表toAnalysis,将起始块B0添加到分析集中;第二步,判断当前分析集是否为空或遍历是否结束,若当前分析集为空或遍历结束,则返回遍历结果,结束遍历,若当前分析集不为空且遍历未结束,则进入第三步;第三步,遍历分析集toAnalysis,获取分析集中的当前块current,并将当前块移出未分析列表;第四步,获取当前块的前续分析结果preResult和后续分析结果sucResult,所述前续分析结果和后续分析结果分别指某个基本块执行前后的整个算法的分析结果;第五步,若前续分析结果为空,或者前续分析结果没有包含后续分析结果,则将后续分析结果放入当前块的执行结果result<B0,sucResult>中,否则回到第三步;第六步,获取当前块的所有后续基本块sucBlocks,若sucBlocks为空,或者遍历结束,则返回第二步,若sucBlocks不为空且遍历未结束,则进入第七步;第七步,遍历后续基本块sucBlocks;第八步,判断某个后续基本块sucBlocks未在未分析列表中,若是则进入第九步,若否则返回第六步;第九步,将该后续基本块添加到未分析列表中,同时添加到分析集中,返回第六步。
本发明实施例提供的BFS遍历流程中,维护了一个“未分析列表”,当分析某基本块后,需将它移出未分析列表。接着判断前续分析结果是否为空,以及前续分析结果有无包含后续分析结果,若前续分析结果为空或前续分析结果集小于后续分析结果集,则说明应以基本块执行后的分析结果为准,将其作为整个算法的分析结果。当前基本块分析完后,则应按照BFS遍历的步骤分析当前基本块的所有后续基本块,将未被分析过的后续基本块添加到分析集列表和未分析列表中,再通过遍历依次分析。
此外,本发明实施例还可以根据所述最终分析结果的集合,生成并返回分析报告。
可以看出,本发明提供的上述方法实施例,提供了一种面向数据管控的程序静态分析方法和系统,从智能合约分析工具的功能实现的层面出发,面向数据使用的管控需求,通过对智能合约代码进行编译解释,重构字节码,基于对所述字节码的分析,建立并打印控制流图,通过对字节码级别的控制流图进行遍历,基于污点分析技术对污点源进行数据依赖分析,获取最终分析结果,能够实现基于不同的数据管控策略来定义数据约束并进行静态分析,满足对面向数据管控的智能合约的自动化审计需求,保障面向数据管控的区块链平台上智能合约的准确运行和数据管控。
实施例二
图12是本发明提供的一种面向数据管控的程序静态分析系统的结构框图。如图12所示,本发明提供的系统实施例可以应用于面向数据管控的区块链平台,具体的系统包括:
字节码重构模块201,用于通过合约语言转换器、合约语言编译器和字节码提取器,对智能合约代码进行编译解释,生成所述智能合约代码的字节码;
控制流图构建模块202,用于通过字节码操纵框架,解析所述字节码的指令之间的控制流关系,进而根据所述控制流关系,构建并打印控制流图;
静态分析模块203,用于将所述智能合约中的污点源,添加到所述控制流图的起始块的分析结果中,遍历所述控制流图,基于污点分析技术进行数据依赖分析,持续更新所述控制流图中的基本块的分析结果,完成对所述智能合约的静态分析;
分析结果控制模块204,用于针对所述静态分析,预先定义分析结果的表现形式、与所述分析结果相关的基本操作,根据所述定义,控制所述分析结果的更新,并返回最终分析结果;
分析报告导出模块205,用于根据所述最终分析结果,生成并返回分析报告。
本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
本领域内的技术人员应明白,本发明实施例的实施例可提供为方法、装置、或计算机程序产品。因此,本发明实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明实施例是参照根据本发明实施例的方法、终端设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理终端设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理终端设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理终端设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理终端设备上,使得在计算机或其他可编程终端设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程终端设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明实施例的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明实施例范围的所有变更和修改。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者终端设备中还存在另外的相同要素。
以上对本发明所提供的一种面向数据管控的程序静态分析方法和一种面向数据管控的程序静态分析系统,进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。

Claims (10)

1.一种面向数据管控的程序静态分析方法,其特征在于,所述方法包括:
通过合约语言转换器、合约语言编译器和字节码提取器,对智能合约代码进行编译解释,生成所述智能合约代码的字节码;
通过字节码操纵框架,解析所述字节码的指令之间的控制流关系,进而根据所述控制流关系,构建并打印控制流图;
将所述智能合约中的污点源,添加到所述控制流图的起始块的分析结果中,遍历所述控制流图,基于污点分析技术进行数据依赖分析,持续更新所述控制流图中的基本块的分析结果,完成对所述智能合约的静态分析;
针对所述静态分析,预先定义分析结果的表现形式、与所述分析结果相关的基本操作,根据所述定义,控制所述分析结果的更新,并返回最终分析结果;
根据所述最终分析结果,生成并返回分析报告。
2.根据权利要求1所述的方法,其特征在于,通过合约语言转换器、合约语言编译器和字节码提取器,对智能合约代码进行编译解释,生成所述智能合约代码的字节码,包括:
使用所述合约语言转换器,将符号(token)分组成符号类(token class),将合约语言用户自定义的语法翻译成词法分析;使用合约语言编译器,根据词法分析构建出抽象语法树,完成编译过程;使用字节码提取器,对所述抽象语法树进一步处理,完成所述编译过程余下的语义分析和代码生成步骤,最后生成字节码。
3.根据权利要求1所述的方法,其特征在于,通过字节码操纵框架,解析所述字节码的指令之间的控制流关系,进而根据所述控制流关系,构建并打印控制流图,包括:
通过字节码操纵框架ASM,提取和解析字节码文件的字节码指令序列;根据预先设定的所述控制流图的基本块建立标准,将相应的字节码指令序列添加到所述控制流图的基本块中,即,建立所述控制流图的基本块;根据所述基本块之间执行流向的判断标准,构建所述基本块之间的执行流向;构建并打印所述控制流图。
4.根据权利要求3所述的方法,其特征在于,通过字节码操纵框架ASM,提取和解析字节码文件的字节码指令序列,包括:
所述字节码操纵框架ASM通过Core API,提供基于事件的字节码操纵模型;以及,所述字节码操纵框架ASM通过Tree API,提供基于对象的字节码操纵模型。
5.根据权利要求3或4所述的方法,其特征在于,通过字节码操纵框架ASM,提取和解析字节码文件的字节码指令序列,包括:
所述基于事件的字节码操纵模型,利用访问者Visitor及其各种实现类,将对象化的类文件重构成一个二进制格式的字节码文件,进而提取和解析所述字节码文件的字节码指令序列;以及,所述基于对象的字节码操纵模型,使用对象树结构来解析每一个字节码文件,利用节点Node及其各种实现类,重构新的字节码文件,进而提取和解析所述字节码文件的字节码指令序列;其中,所述字节码文件是类文件,所提供的信息包括:类名称、类属性、字节码指令集。
6.根据权利要求1所述的方法,其特征在于,将所述智能合约中的污点源,添加到所述控制流图的起始块的分析结果中,遍历所述控制流图,基于污点分析技术进行数据依赖分析,持续更新所述控制流图中的基本块的分析结果,,完成对所述智能合约的静态分析,包括:
针对所述智能合约中的普通变量,添加污点标记,成为污点变量,完成污点源的识别;对所述污点变量进行无害处理,所述污点变量经过无害处理后与其他普通变量之间进行各种依赖关系的传播,最终汇聚到污点汇聚点,完成污点传播分析。
7.根据权利要求1所述的方法,其特征在于,针对所述静态分析,预先定义分析结果的表现形式,包括:
针对设计模拟所述字节码在虚拟机中的执行过程,预先定义一个栈帧结构,用于模拟所述污点源随着程序的局部变量在局部变量表中的传递过程;针对全局变量,预先定义一个堆对象,用于表示全局变量中的实例对象,对于被标记的实例对象的引用也可在所述局部变量表中进行传递。
8.根据权利要求7所述的方法,其特征在于,针对所述静态分析,预先定义与所述分析结果相关的基本操作,包括:
预先定义合并多条指令执行的分析结果的操作,用于针对所述控制流图中基本块内部多条指令的执行后,合并所述多条指令执行后的分析结果;
预先定义判断两个分析结果是否存在包含关系的操作,用于针对所述控制流图中基本块执行前后分析结果的变化,判断所述基本块执行前的分析结果是否包含在所述基本块执行后的分析结果中;
预先定义合并基本块的分析结果的操作,用于针对所述控制流图中基本块执行前后分析结果的变化,将执行前的分析结果合并到执行后的分析结果中;
预先定义分析结果的克隆操作,用于实现所述分析结果的合并;
预先定义打印分析结果的操作,用于针对所述栈帧结构模拟程序污点源随着程序变量在程序中的传递过程,打印分析结果,以便于直观地查看污点传播过程。
9.根据权利要求1所述的方法,其特征在于,根据所述最终分析结果,生成并返回分析报告,包括:
基于图的广度优先遍历算法(BFS),采用分层遍历的方式,把所述控制流图中当前基本块的所有后续基本块的分析结果进行分析整合,放入所述最终分析结果的集合,根据所述最终分析结果的集合,生成并返回分析报告。
10.一种面向数据管控的程序静态分析系统,其特征在于,所述系统包括:
字节码重构模块,用于通过合约语言转换器、合约语言编译器和字节码提取器,对智能合约代码进行编译解释,生成所述智能合约代码的字节码;
控制流图构建模块,用于通过字节码操纵框架,解析所述字节码的指令之间的控制流关系,进而根据所述控制流关系,构建并打印控制流图;
静态分析模块,用于将所述智能合约中的污点源,添加到所述控制流图的起始块的分析结果中,遍历所述控制流图,基于污点分析技术进行数据依赖分析,持续更新所述控制流图中的基本块的分析结果,完成对所述智能合约的静态分析;
分析结果控制模块,用于针对所述静态分析,预先定义分析结果的表现形式、与所述分析结果相关的基本操作,根据所述定义,控制所述分析结果的更新,并返回最终分析结果;
分析报告导出模块,用于根据所述最终分析结果,生成并返回分析报告。
CN202010809497.7A 2020-08-12 2020-08-12 一种面向数据管控的程序静态分析方法和系统 Active CN112100054B (zh)

Priority Applications (2)

Application Number Priority Date Filing Date Title
CN202010809497.7A CN112100054B (zh) 2020-08-12 2020-08-12 一种面向数据管控的程序静态分析方法和系统
US17/154,003 US11036614B1 (en) 2020-08-12 2021-01-21 Data control-oriented smart contract static analysis method and system

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010809497.7A CN112100054B (zh) 2020-08-12 2020-08-12 一种面向数据管控的程序静态分析方法和系统

Publications (2)

Publication Number Publication Date
CN112100054A true CN112100054A (zh) 2020-12-18
CN112100054B CN112100054B (zh) 2021-07-20

Family

ID=73754497

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010809497.7A Active CN112100054B (zh) 2020-08-12 2020-08-12 一种面向数据管控的程序静态分析方法和系统

Country Status (2)

Country Link
US (1) US11036614B1 (zh)
CN (1) CN112100054B (zh)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112015396A (zh) * 2020-08-28 2020-12-01 平安国际智慧城市科技股份有限公司 基于dsl的智能合约代码生成方法、装置、设备及存储介质
CN113609481A (zh) * 2021-06-02 2021-11-05 西安四叶草信息技术有限公司 基于字节码的php污点分析方法及装置
CN114996128A (zh) * 2022-05-19 2022-09-02 青矩技术股份有限公司 基于asm框架的脚本处理方法、装置、设备及存储介质
CN116820405A (zh) * 2023-08-31 2023-09-29 浙江大学 一种基于复用分析的evm字节码控制流图构建方法

Families Citing this family (15)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111770205B (zh) * 2020-08-31 2020-12-04 支付宝(杭州)信息技术有限公司 一种执行智能合约的方法、区块链节点、系统和存储介质
CN111815310B (zh) * 2020-08-31 2021-08-17 支付宝(杭州)信息技术有限公司 一种执行智能合约的方法、区块链节点和存储介质
CN113486357B (zh) * 2021-07-07 2024-02-13 东北大学 一种基于静态分析和深度学习的智能合约安全检测方法
CN113312268A (zh) * 2021-07-29 2021-08-27 北京航空航天大学 一种智能合约代码相似检测方法
CN113722218B (zh) * 2021-08-23 2022-06-03 南京审计大学 一种基于编译器中间表示的软件缺陷预测模型构建方法
CN114389978B (zh) * 2021-12-21 2024-04-02 中国人民解放军32802部队 一种基于静态污点分析的网络协议侧信道检测方法和系统
CN115037512B (zh) * 2022-04-27 2023-06-20 中国科学院信息工程研究所 面向以太坊公有链智能合约的形式化静态分析方法及装置
US20230367566A1 (en) * 2022-05-10 2023-11-16 The Pairwyse Foundation Smart contract compiler
CN115022026A (zh) * 2022-05-31 2022-09-06 电子科技大学 一种区块链智能合约威胁检测装置及方法
CN115037648B (zh) * 2022-06-07 2023-11-10 河海大学 基于数据流约简的智能合约测试用例生成方法及系统
CN117632244A (zh) * 2022-08-18 2024-03-01 华为技术有限公司 建立模型的方法、装置以及设备
CN115879868B (zh) * 2022-09-09 2023-07-21 南京审计大学 一种专家系统与深度学习相融合的智能合约安全审计方法
CN116186144B (zh) * 2023-03-14 2023-10-27 中国自然资源航空物探遥感中心 矿山遥感监测数据的格式化自动处理方法及系统
CN116702157B (zh) * 2023-06-21 2023-12-26 烟台大学 一种基于神经网络的智能合约漏洞检测方法
CN117555811B (zh) * 2024-01-11 2024-03-19 北京邮电大学 基于静态符号执行的嵌入式软件分析方法、装置及存储介质

Citations (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101673214A (zh) * 2009-10-26 2010-03-17 上海交通大学 剖分信息收集系统及其收集方法
CN101968766A (zh) * 2010-10-21 2011-02-09 上海交通大学 计算机程序实际运行时触发软件漏洞的检测系统
CN104834859A (zh) * 2015-04-24 2015-08-12 南京邮电大学 一种Android应用中恶意行为的动态检测方法
EP3012763A1 (en) * 2014-10-24 2016-04-27 Thomson Licensing Control flow graph flattening device and method
US20160300060A1 (en) * 2012-10-23 2016-10-13 Galois, Inc. Software security via control flow integrity checking
CN106709356A (zh) * 2016-12-07 2017-05-24 西安电子科技大学 基于静态污点分析和符号执行的安卓应用漏洞挖掘方法
CN108694320A (zh) * 2018-05-15 2018-10-23 中国科学院信息工程研究所 一种多安全环境下敏感应用动态度量的方法及系统
CN108762752A (zh) * 2018-04-02 2018-11-06 北京大学 一种结合动态和静态代码分析技术的安卓应用程序功能类图生成方法和装置
CN109344612A (zh) * 2018-09-25 2019-02-15 郑州昂视信息科技有限公司 针对程序代码静态分析逆向攻击的主动防御方法及系统
CN110059006A (zh) * 2019-03-29 2019-07-26 北京创鑫旅程网络技术有限公司 代码审计方法及装置
CN110309660A (zh) * 2019-07-09 2019-10-08 佛山市伏宸区块链科技有限公司 一种智能合约代码的自动化审计系统及方法
CN111026601A (zh) * 2019-09-23 2020-04-17 拉扎斯网络科技(上海)有限公司 Java应用系统的监控方法、装置、电子设备及存储介质
CN111259395A (zh) * 2020-01-16 2020-06-09 图灵人工智能研究院(南京)有限公司 智能合约的利用程序获取方法、装置及存储介质

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8528095B2 (en) * 2010-06-28 2013-09-03 International Business Machines Corporation Injection context based static analysis of computer software applications
US11237943B2 (en) * 2019-03-08 2022-02-01 Fujitsu Limited Generating inputs for computer-program testing

Patent Citations (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101673214A (zh) * 2009-10-26 2010-03-17 上海交通大学 剖分信息收集系统及其收集方法
CN101968766A (zh) * 2010-10-21 2011-02-09 上海交通大学 计算机程序实际运行时触发软件漏洞的检测系统
US20160300060A1 (en) * 2012-10-23 2016-10-13 Galois, Inc. Software security via control flow integrity checking
EP3012763A1 (en) * 2014-10-24 2016-04-27 Thomson Licensing Control flow graph flattening device and method
CN104834859A (zh) * 2015-04-24 2015-08-12 南京邮电大学 一种Android应用中恶意行为的动态检测方法
CN106709356A (zh) * 2016-12-07 2017-05-24 西安电子科技大学 基于静态污点分析和符号执行的安卓应用漏洞挖掘方法
CN108762752A (zh) * 2018-04-02 2018-11-06 北京大学 一种结合动态和静态代码分析技术的安卓应用程序功能类图生成方法和装置
CN108694320A (zh) * 2018-05-15 2018-10-23 中国科学院信息工程研究所 一种多安全环境下敏感应用动态度量的方法及系统
CN109344612A (zh) * 2018-09-25 2019-02-15 郑州昂视信息科技有限公司 针对程序代码静态分析逆向攻击的主动防御方法及系统
CN110059006A (zh) * 2019-03-29 2019-07-26 北京创鑫旅程网络技术有限公司 代码审计方法及装置
CN110309660A (zh) * 2019-07-09 2019-10-08 佛山市伏宸区块链科技有限公司 一种智能合约代码的自动化审计系统及方法
CN111026601A (zh) * 2019-09-23 2020-04-17 拉扎斯网络科技(上海)有限公司 Java应用系统的监控方法、装置、电子设备及存储介质
CN111259395A (zh) * 2020-01-16 2020-06-09 图灵人工智能研究院(南京)有限公司 智能合约的利用程序获取方法、装置及存储介质

Non-Patent Citations (4)

* Cited by examiner, † Cited by third party
Title
WXAM: "【入门篇】反汇编和构建控制流图", 《HTTPS://ZHUANLAN.ZHIHU.COM/P/21330930》 *
古涛铭: "面向智能合约的安全检测系统研究与设计", 《中国优秀硕士学位论文全文数据库 信息科技辑》 *
张立勇: "软件源代码安全分析研究", 《中国博士学位论文全文数据库 信息科技辑》 *
李留义等: "一种基于Java字节码的软件设计信息提取方法", 《南通大学学报(自然科学版)》 *

Cited By (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112015396A (zh) * 2020-08-28 2020-12-01 平安国际智慧城市科技股份有限公司 基于dsl的智能合约代码生成方法、装置、设备及存储介质
CN112015396B (zh) * 2020-08-28 2024-02-13 深圳赛安特技术服务有限公司 基于dsl的智能合约代码生成方法、装置、设备及存储介质
CN113609481A (zh) * 2021-06-02 2021-11-05 西安四叶草信息技术有限公司 基于字节码的php污点分析方法及装置
CN113609481B (zh) * 2021-06-02 2024-01-30 西安四叶草信息技术有限公司 基于字节码的php污点分析方法及装置
CN114996128A (zh) * 2022-05-19 2022-09-02 青矩技术股份有限公司 基于asm框架的脚本处理方法、装置、设备及存储介质
CN114996128B (zh) * 2022-05-19 2023-03-14 青矩技术股份有限公司 基于asm框架的脚本处理方法、装置、设备及存储介质
CN116820405A (zh) * 2023-08-31 2023-09-29 浙江大学 一种基于复用分析的evm字节码控制流图构建方法
CN116820405B (zh) * 2023-08-31 2023-12-01 浙江大学 一种基于复用分析的evm字节码控制流图构建方法

Also Published As

Publication number Publication date
CN112100054B (zh) 2021-07-20
US11036614B1 (en) 2021-06-15

Similar Documents

Publication Publication Date Title
CN112100054B (zh) 一种面向数据管控的程序静态分析方法和系统
EP3631618B1 (en) Automated dependency analyzer for heterogeneously programmed data processing system
US11868745B2 (en) System and method for compiling high-level language code into a script executable on a blockchain platform
Leroy A formally verified compiler back-end
Leino This is boogie 2
CN110673852B (zh) 一种基于编译器前端实现控制流平坦的方法、系统及设备
CN112115472A (zh) 一种面向数据管控的智能合约代码检查方法和系统
CN115639980A (zh) 一种低代码平台可拖拽的前端逻辑编排方法及装置
Plump From imperative to rule-based graph programs
CN110096264A (zh) 一种代码运行方法及装置
CN112256271A (zh) 一种基于静态分析的区块链智能合约安全检测系统
CN110162474B (zh) 一种基于抽象语法树的智能合约重入漏洞检测方法
Ko et al. Weakly sensitive analysis for JavaScript object‐manipulating programs
Zhao et al. Pattern-based design evolution using graph transformation
US20070044080A1 (en) Structure initializers and complex assignment
Schrans et al. Flint for safer smart contracts
Fritzson et al. Metamodelica–a symbolic-numeric modelica language and comparison to julia
Marin et al. Towards a framework for generating program dependence graphs from source code
Nakamaru et al. Generating fluent embedded domain-specific languages with subchaining
Visser Understanding software through linguistic abstraction
Ramsey Beyond relooper: recursive translation of unstructured control flow to structured control flow (functional pearl)
Blewitt Hedgehog: automatic verification of design patterns in Java
Drago Quality driven model transformations for feedback provisioning
Schöne et al. Incremental causal connection for self-adaptive systems based on relational reference attribute grammars
Ameedeen A model driven approach to analysis and synthesis of sequence diagrams

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