理解AST抽象语法树

在计算机科学中,抽象语法树(Abstract Syntax Tree,AST),或简称语法树(Syntax tree),是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。之所以说语法是“抽象”的,是因为这里的语法并不会表示出真实语法中出现的每个细节。比如,嵌套括号被隐含在树的结构中,并没有以节点的形式呈现;而类似于 if-condition-then 这样的条件跳转语句,可以使用带有三个分支的节点来表示。

抽象语法树是程序源代码结构的树状表示。程序源代码经过词法分析器(Lexer)得到各种不同种类的单词(Token),再由语法分析器(Parser)分析和语法检查后得到抽象语法树(AST)。抽象语法树的根节点表示整个程序,内部节点是抽象语法结构或者单词。AST的核心在于它能与输入源代码中的各个语法元素一一对应.

  • 通过调用语言的编译器或者解释器把前端的语言代码(如JAVA,C/C++源代码)转换成中间代码(IR,intermediaterepresentation),将其源代码之间的调用关系、执行环境、上下文等分析清楚。
  • 语义分析:分析程序中不安全的函数,方法的使用的安全问题。
  • 数据流分析:跟踪,记录并分析程序中的数据传递过程所产生的安全问题。
  • 控制流分析:分析程序特定时间,状态下执行操作指令的安全问题。
  • 配置分析:分析项目配置文件中的敏感信息和配置缺失的安全问题。
  • 结构分析:分析程序上下文环境,结构中的安全问题。
  • 结合2~6步的结果,匹配所有规则库中的漏洞特征,一旦发现漏洞就抓取出来。
    最后形成包含详细漏洞信息的漏洞检测报告,包括漏洞的具体代码行数以及漏洞修复的建议。

简单理解污点分析技术

当我们通过AST技术拿到了源码的抽象语法树,并将其数据格式化存储之后,需要一套高效的算法对漏洞模型进行匹配,在漏洞模型的建立上我们需要引入污点分析技术来对漏洞进行定义

污点分析定义

污点分析可以抽象成一个三元组<sources,sinks,sanitizers>的形式,其中,source 即污点源,代表直接引入不受信任的数据或者机密数据到系统中;sink即污点汇聚点,代表直接产生安全敏感操作(违反数据完整性)或者泄露隐私数据到外界(违反数据保密性);sanitizer即无害处理,代表通过数据加密或者移除危害操作等手段使数据传播不再对软件系统的信息安全产生危害.污点分析就是分析程序中由污点源引入的数据是否能够不经无害处理,而直接传播到污点汇聚点。如果不能,说明系统是信息流安全的;否则,说明系统产生了隐私数据泄露或危险数据操作等安全问题。
简单的说:污点分析是默认不信任本地/外部输入,将本地及外部输入的控制/数据流过程进行分析,如果没有经过无害化处理,即认为存在漏洞的漏洞模型。

污点传播分析
污点传播分析就是分析污点标记数据在程序中的传播途径.按照分析过程中关注的程序依赖关系的不同, 可以将污点传播分析分为显式流分析和隐式流分析。


通过上面的两段代码比较显式和隐式,还是能够很直观的看出两者的区别,显示流分析中污点标记直接被程序逻辑修改,而隐式流是在程序逻辑中被动的被修改而不是直接对污点标记的参数进行任何运算。

无害处理

输入验证(input validation)模块应当被识别成无害处理模块。
例如,为了防止代码注入漏洞,PHP 提供的 htmlentities 函数可以将特殊含义的 HTML 字符串转化成HTML实体。