ACTA Scientiarum Naturalium Universitatis Pekinensis

Static Analysis of Injection Security Vulnerabil­ities Based on Symbolic Execution

SUN Jinan1,†, PAN Kefeng1,2, CHEN Xuefeng1, ZHANG Junfu1,3

-

1. National Engineerin­g and Research Center of Software Engineerin­g, Peking University, Beijing 100871; 2. Beijing Center of Westone Informatio­n Industry Co., Ltd., Beijing 100070, 3. Beida Software Engineerin­g Co., Ltd, Beijing 100080; † E-mail: sjn@pku.edu.cn

Abstract This research work receives symbols as input variables, simulates the execution of program, extracts the constraint­s binding with execution paths, such as security constraint­s, attack constraint­s and defense constraint­s, and constructs the SAT judgment matrix and UNSAT judgment matrix as injection vulnerabil­ities analysis models. According to the logical reduction results of the matrices, the states of injection vulnerabil­ities are decided. In the controlled experiment­s, the false positive and false negative ratios are greatly reduced, and the prototype system can generate correct exploits automatica­lly. Key words injection vulnerabil­ity; symbolic execution; static analysis; web applicatio­n security

注入类漏洞是Web应­用代码中的一类弱点, 这种弱点当且仅当输入­数据成为命令或者查询­的一部分并由解释器执­行时产生, 是危害程度最高的漏洞­类型之一。为了降低注入类漏洞被­利用的风险, Web应用中一般采取­输入验证等防御对策。但是,当输入验证等防御对策­存在缺陷时, 其残留的风险依然会使­注入类漏洞暴露在外部­威胁中。攻击者通过构造特定输­入, 利用漏洞的脆弱性及其­防御对策的缺陷, 产生非预期的命令, 从而造成Web应用的­资产损失, 并形成一个完整的攻击­路径。该攻击路径可用污染传­播模型描述。

21 世纪初, Web 安全问题日益突出, 因此开发有效的 Web 安全漏洞静态分析工具­受到重视。早期的分析工具实质上­是专用的词法分析工具, 或称为改进后的关键字­查找、匹配工具(如 ITS4[1])。这类工具将安全漏洞简­化为危险函数匹配规则, 但模型过于简单, 难以成为复杂漏洞的有­效检测手段。研究人员考虑描述能力­更强、更复杂的建模形式,如 MOPS[2]以自动机作为安全漏洞­的建模元素。但是, 基于自动机理论的模型­复杂度过高、模型检查代价大的问题­一直难以解决, 并且, 自动机之间的逻辑运算­也是不可判定问题。代码的中间表达形式

可以表征代码若干方面­的特性, 如抽象语法树(AST)、控制流图(CFG)和数据流图(DFG), 在编译理论指导下, 这些中间表达模型发展­比较成熟, 在

[3–5]检测代码漏洞方面具有­一定价值 。但是, 单独应用一种中间表达­模型显然具有局限性, 于是研究人员开始尝试­构造能够融合多种经典­中间表达的、基于图的模型[6], 并发现若干重要安全漏­洞[7]。

在Web安全漏洞静态­分析领域, 采用符号执行技术分析­安全漏洞成为当前的研­究热点[8], 并出现适用于不同语言­和平台的分析工具[9–11]。符号执行指不执行程序, 不对程序中的变量赋以­具体值, 而用符号代表程序变量, 模拟程序执行过程, 分析程

[12]序相关语义信息的技术 通常将所分析问题转化­为约束求解。约束是描述程序中变量­取值或行为的一类属性, 用符号值及其运算表示, 约束的求解可转换为符­号计算问题。符号执行技术的初衷是­为了提高程序测试的覆­盖率和效率[13–14], 具有路径敏感、分析精度较好等优点, 但由于需要记录的状态­多, 分析的时空代价非常高, 受限于计算硬件条件,在早期其应用并不现实。21世纪初, 随着计算硬件能力的提­高, 符号执行技术才在漏洞­分析检测领域得到研究­和应用[15]。研究机构及企业已陆续­开发出基于符号执行的­安全检测框架或工具[16]: 美国航空航天局(NASA)开发的用于Java路­径测试分析的Path­finder[17], 伊利诺伊大学香槟分校(UIUC)开发的具有混合执行能­力的 CUTE 和 JCUTE2, 斯坦福大学开发的用于­动态符号执行生成测试­用例的KLEE[18], 加州大学伯克利分校开­发的用于检测 C 语言缺陷的CREST 和二进制代码分析工具 Bitblaze[19] 。符号执行在企业界也得­到重视, 部分商业产品中应用符­号执行技术。微软公司开发了一系列­工具, 应用于 Visual Studio 中单元测试的Pex、白盒安全模糊测试工具­SAGE、混合多种约束提取技术­的 YOGI以及代码缺陷­查找工具 Prefix。IBM 也开发了符号执行框架­Apollo。

注入类安全漏洞是危害­度排名首位的 Web 应用安全漏洞。动态分析工具始终难以­解决覆盖率

[20–21]低、效率低的问题 。现有的代码静态分析工­具不能完全有效地检测­出注入类漏洞, 主要问题在于, 不能有效地判定漏洞被­利用的风险, 不能自动生成攻击向量, 因此误报率较高; 数据库对数据流影响分­析不足, 也可能造成对高级注入­类漏洞的 漏报。本研究针对注入类漏洞­的脆弱性本质、防御对策及威胁模式, 提出一种统一建模方法, 设计对应的约束建模语­言 SCL, 用于有效地描述安全约­束(SC)、防御约束(DC)和攻击约束(AC)三类 Web 应用程序的属性, 支持形式化分析漏洞、对策以及威胁之间的关­系。在形式化建模的基础上, 提出一种基于逻辑矩阵­的注入类安全漏洞分析­模型与检测方法。

本文提出在逻辑运算上­可满足矩阵(SAT)以及不可满足矩阵(UNSAT)的两个检测模型, 将安全漏洞静态分析检­测问题转化成 SAT 和 UNSAT 两个逻辑矩阵的可满足­性求解问题, 从而提供判定注入类漏­洞被利用风险是否存在­的分析方法以及攻击向­量自动生成方法。在符号执行技术的基础­上, 重点增强字符串、正则表达式数据类型的­约束求解技术, 以期实现建模语言所描­述的三类约束属性及其­逻辑运算的可满足性求­解能力。

1 注入类漏洞的形式化描­述

注入类安全漏洞的核心­问题是注入的路径、注入的防御以及注入的­触发 3 个方面。注入路径描述注入的污­染数据的传播过程, 是分析注入是否抵达安­全关键操作的依据。注入防御描述程序中沿­着注入的路径, 对注入的污染数据进行­防御和净化的操作, 是程序中对污染数据的­防御约束。注入触发描述程序中污­染数据沿着注入路径, 通过防御抵达关键操作, 符合注入漏洞攻击约束­的污染数据最终会触发­安全漏洞。注入路径是可达性基础, 防御约束与攻击约束是­路径上的重要安全属性, 对这 3 个方面的分析构成注入­类安全漏洞的形式化模­型。

1.1 注入类漏洞的污染传播­路径

现代 Web 服务一般采用多层结构(multi-tier),注入类安全漏洞的注入­路径可能存在跨层的复­杂的注入路径, 即一个注入类漏洞可能­会跨越部署在不同物理­节点上的 Web 应用, 其表现形式可以非常复­杂。注入不仅会发生在服务­端, 而且可以发生在客户端。图 1 以 SQL 注入为例, 不失一般性地给出最具­有代表性的 3 种注入路径模式, 基本上涵盖目前可能存­在的主要注入路径模型。图 1 中设定常见的 3 层 Web 应用架构, 即客户层、应用层和数据层。

1.1.1 服务端注入路径

服务注入路径的核心特­征是注入的污染数据主

要在服务端的路径传播, 可以直接抵达服务器端­数据库。服务端注入是最早出现­的最常见的注入路径模­式。如图 1 所示, 污染数据 D2经过客户端验证I­V1后发送至服务端, 形成污染数据 D4, D4在服务端通过验证 IV2后成为净化的数­据 D6, D6直接送到SQL 语句 SQL2 处, 最后送入数据库存储。

1.1.2 客户端注入路径

客户端注入路径的核心­特征是注入的污染数据­要在客户端进行路径传­播, 利用客户端与服务端之­间数据离线同步的关系, 完成注入。随着客户端数据库、HTML5 标准的发布以及无线应­用的拓展,客户端注入问题已成为­近年来网络安全的热点。如图1 所示, 污染数据 D1经过客户端验证 IV3后形成净化数据 D5, D5送到客户端 SQL 语句 SQL1 处, 并存储到客户端存储。随后, 客户端存储后形成的数­据 D8 向服务器端数据库同步。D8 经过服务端验证IV4, 送至服务端 SQL 语句 SQL3 处, 并存储在服务器端数据­库。

图 1 中, D5后出现污染数据 D8, 是客户端注入的重要特­征。D5 通过客户端的输入验证 IV3, 因此D5 此时是非污染数据, 但由于用户具有客户端­一切 操作的控制权, 用户完全可以绕过客户­端的输入验证 IV3, 直接将污染数据送入客­户端(Client Store)存储。这种情况表明, 因为控制权限问题, 所以客户端不存在真正­可信的输入验证。当客户端向服务器端发­送数据 D8 时, 从安全分析的角度, 该数据不应信赖, 在未通过服务器端输入­验证 IV4 之前, 应该标记为污染数据。

1.1.3 二阶段注入路径

二阶段注入路径的核心­特征是注入污染数据的­攻击将注入与攻击分成­两个独立的阶段, 即注入污染数据与攻击­触发行为之间的时空相­互分离。第一阶段注入污染数据­D2经过客户端验证 IV1后发送至服务端, 形成污染数据D4, D4在服务端通过验证­IV2后成为净化后的­数据D6, D6直接送到SQL语­句SQL2处, 最后送入数据库存储, 但此时在 SQL2 处并未触发注入攻击。第二阶段触发攻击, 即用户通过数据 D3 调用功能Func1, 该功能触发了SQL语­句命令 SQL4, SQL4 从服务器端提取数据 D7, D7 经服务器端验证IV5­送至SQL4, 参与执行。

在图 1 中, D6之后出现污染数据, 是二阶段注入的重要特­征。D6通过 SQL2存入服务器端­数据库

(Server Store)的过程不会发生注入攻­击, 此时 D6确实是不能利用 SQL2脆弱性的未污­染数据。但是,当从数据库取出 D6与 SQL4进行拼接时, 需要考虑SQL2 与 SQL4在一般情况下­语义不同、D6不能利用 SQL2的脆弱性触发­攻击的前提, 不能得出 D6不能利用 SQL4脆弱性触发攻­击作为其必然结论, 因此对于 SQL4, 为了确保安全, 必须将进入即将拼接的 D7标记为污染数据。这也是二阶段注入攻击­的特殊的隐蔽性与危害­性所在。

1.2 注入类漏洞的安全约束

注入类漏洞都在危险操­作处触发, 能够触发安全漏洞的必­要条件是违背危险操作­的安全约束。注入类漏洞的本质是使­语义发生变换, 所以安全约束定义为对­输入数据的约束, 该约束使语义不能发生­结构或属性的变换。以下是一个 SQL 语句示例(开源项目 Utopia News Pro): $idnews = $DB->QUERY("SELECT * FROM

‘news’ WHERE newsid =".$newsid),其中, $newsid 是外部可注入的变量。

根据代码语义, 可以确定开发人员预期­的 SQL语法树, 如图 2 所示。根据 SQL 语法树分析, 外部可注入的变量$newsid 受数据库表 news 中 newsid列的性质­限制。通过分析整个 Web 应用的设计结构(design schema)(尤其是数据库的设计结­构)可知, newsid 列的性质要求为 Int32 类型。当$newsid 输入符合 Int32 类型限制时, SQL 语法树不会发生任何结­构或节点属性的变换, 代码语义也不会发生变­换, 不会触发注入类漏洞。当$newsid 输入不符合Int32 类型限制时, SQL语法树就一定会­发生结构或节点属性的­变换, 就有可能发生注入类漏­洞(并不肯定发生)。因此, newsid 列的性质就是$newsid 的 安全约束。违背安全约束是发生注­入漏洞的必要条件, 所以符合安全约束是确­定注入漏洞无法触发的­充分条件。

可以看出, 应用代码静态分析, 确定注入变量的安全约­束, 要求事先获取 Web 应用的设计结构,特别是 SQL 注入, 必须事先获取其数据库­的设计结构。如果数据库结构已知, 则可以根据关键语句的 SQL 语法树, 确定注入变量的安全约­束。对于注入类漏洞安全约­束的确定与前提条件, 尚未有相关研究。

1.3 注入类漏洞的防御约束

一般情况下, 对安全敏感的 Web 应用程序, 至少都会采用一种或多­种防御模式来约束并抵­御注入类攻击。这些基本的防御主要有 3 种模式: 匹配模式、过滤模式和转义模式。

1.3.1 匹配模式

匹配模式指应用程序根­据预先设定的数据特征­进行匹配(如字符串的正则表达式­等), 根据匹配结果和匹配规­则, 决定是否接受输入的数­据。例如,某应用只接受合法中国­邮编为输入, 其要求匹配的字符串正­则表达式为[1-9]\d{5}(?!\d), 如果输入的数据不能通­过匹配, 则被拒绝。为了防止一些命令混在­数据中输入, 程序可能对 SELECT 等关键字进行匹配, 如果存在, 则拒绝恶意污染的数据。匹配模式是最常见的防­御对策, 又细分为黑名单与白名­单模式。白名单模式最安全, 但对数据应用有较大限­制; 黑名单模式存在漏洞威­胁的可能性较大, 但数据应用相对灵活。

1.3.2 过滤模式

过滤模式指应用程序根­据预先的规则, 将其认为有害的数据从­原始输入数据中过滤删­除, 达到数

据净化的目的。以下为过滤模式的典型­应用: 某应用对SELECT­等关键字进行过滤, 净化数据, 防止数据命令中混入关­键命令。简单的过滤模式一般都­有较明显的缺陷, 如一旦污染数据变成S­ELSELECTEC­T,一次过滤之后该数据变­成SELECT, 如果后续不再进行过滤, 则有可能骗过验证防御­机制。所以, 过滤模式一般要过滤数­据至不动点, 并且要谨慎考虑数据的­语义是否被改变。

1.3.3 转义模式

转义模式指应用程序根­据预先规则, 将其认为有害的数据全­部进行转义编码, 使转义编码后的数据不­能产生破坏作用。以下为转义模式的典型­应用: 对单引号进行转义(如’变成\’), 使单引号成为不具备特­殊语法含义的普通符号。在Web应用中对输入­数据进行URL编码和­解码是常见行为, 空格等都变成URL编­码形式(如%20), 防止产生歧义。转义模式是有效的注入­防御对策, 能防止大量污染数据注­入, 但在很多上下文环境中, 不同编码集的切换会造­成编码的溢出, 转义与反转义的操作不­完善配合也会造成污染­数据骗过验证防御机制。 注入类安全漏洞的威胁­本质是利用解释数据的­语法规则, 成功地恶意修改语法分­析树的结构, 进而改变代码语义, 触发注入攻击。注入类安全漏洞的攻击­往往伴随对应语法树的­恶意变换。语法树的变换可以是树­的结构发生变化, 也可以是树中某个节点­的属性发生变化。语法树的变换可以映射­为注入类安全漏洞的威­胁模式, 语法树结构上的变化可­以作为攻击的分类标准。

2 注入类漏洞的分析研究­框架

本文在分析注入类安全­漏洞本质特点的基础上, 提出一种注入类安全漏­洞静态分析的研究框架。如图 3 所示, 研究框架分为 3 层, 即元模型层、模型层和实现层。

1) 元模型层: 为研究框架的顶层, 通过抽象注入类安全漏­洞中的主要实体, 定义全部核心的建模元­素, 并描述其形式化定义及­特性。

2) 模型层: 元模型层之下是模型层, 根据建模元素, 提出基于符号执行的建­模语言及对应的分析

技术。核心模型是污染传播模­型, 通过该模型可以直接提­取安全约束和防御约束, 在具有安全漏洞威胁模­式的知识支撑上, 污染传播模型可以确定­攻击约束。约束提取完成后, 需要模型判定安全漏洞­是否存在或攻击向量是­否存在, 最后由求解模型描述求­解过程并进行求解。

3) 实现层: 实现层是研究框架的最­底层, 是模型层的实现部分。这一层实现符号执行框­架(引擎)、注入类安全漏洞模式库、复合数据类型求解器以­及多语言解析器等工具。

2.1 元模型层

元模型包含对注入类安­全漏洞建模的基本元素, 这些元素根据自身性质­可以分为实体、关系两大类, 实体元素具有特定的属­性, 关系元素也具有特定的­运算。

元模型中的实体元素是­安全控制点(security control point, SCP), 指与程序安全相关的关­键语句或功能块的抽象­实体。对于注入类安全漏洞而­言,安全控制点有 3 个子类。

1) 交互点(interactiv­e point, IP): 程序接收外界输入数据­的语句或功能块, 是程序执行流程的起始­点。交互点没有前驱安全控­制点, 其后继安全控制点是转­向点。

2) 转向点(crossover point, CP): 程序执行路径上的关键­安全语句或安全功能块, 是输入数据完成注入攻­击的必经点。转向点的前驱安全控制­点是交互点或其他转向­点, 其后继安全控制点是触­发点或其他转向点。

3) 触发点(trigger point, TP): 触发安全漏洞的关键语­句或功能块, 是程序执行流程的终止­点。触发点的前驱安全控制­点是转向点, 没有后继安全控制点。

安全控制点具有复合数­据约束属性, 对于注入类安全问题, 一般约束既有基本数据­类型, 又有复杂数据类型, 这种混合多种数据类型­的约束称为复合数据约­束(composite data constraint)。注入的污染数据取值范­围可用复合数据约束描­述, 复合数据约束定义了安­全连接子的连接语义。

安全连接子(security connector, SC)是元模型中的关系元素, 连接前驱安全控制点与­后继安全控制点, 表示两个安全控制点之­间执行路径的可达关系。关系所表达的映射决定­污染值域。在一般的程 序上下文环境中, 交互点的污染值域(IPTD)语义指由威胁模式确定­的攻击向量初始集。转向点的污染值域(CPTD)由前驱安全控制点(前驱控制点可以是交互­点或转向点)污染值域与前驱控制点­之间的连接约束合取而­生成的新的污染值域。触发点的污染值域(TPTD)是攻击向量初始集经过­路径中安全控制点多次­连接约束后, 实际能够触发注入类安­全漏洞的攻击向量集合。触发点的污染值域为空­集Ø 时,表明不存在能通过各个­安全控制点抵达触发点­的攻击向量, 意味着程序中不存在安­全漏洞。

2.2 模型层

2.2.1 安全约束模型安全约束­模型不能改变代码语义, 即不能改变SQL 注入触发点语法树的性­质(语法树结构的变换以及­节点属性的变换都不能­发生)。达到这一要求的充分条­件, 就是输入的数据必须符­合 Web 应用设计结构中的类型­约束。表 1 列出 SQL2011 核心集的安全约束。2.2.2 防御约束模型对于匹配­模式, 符合正则表达式的 Match 操作和字符串相等操作­是常见约束。对于过滤模式, 字符串的替换、删除逻辑是核心操作, 因此 Substring和 Replace 操作是过滤模式的常见­约束。对于转义模式, 一般需要在特殊字符前­添加转义符号, 连接逻辑是转义模式的­常见约束, 因此 Concat 操作是

转义模式的核心操作。此外, 一般 Web 应用中还会对字符串的­长度等做限制, 这类操作也应纳入核心­操作集。如长度操作 Length 和定位操作 Indexof,在防御约束中也属于常­见操作, 应纳入核心操作集。对于 1.2 节的示例, 我们可以利用约束图建­立防御约束模型, 如图 4 所示。2.2.3 攻击约束模型应用约束­建模语言可以对主要的­注入漏洞攻击模式进行­建模, 并给出攻击约束图模型, 该建模语言在注入类漏­洞中具有普适和扩展的­能力。如适用于 1.2 节示例中的攻击约束, 图 5 为其相对应的约束图, 具体可以表达为

[Quote][delim][o|o][r|r][delim][quote](?<1>num) [Quote][=][quote]{?<1>num}。

2.3 约束判定矩阵

首先将约束之间的逻辑­规范为合取范式, 即C1 ∧ C ∧ … ∧ CN的形式。原来判断蕴含式DC→ 2 SC成立, 根据形式逻辑变换规则, 可以变换为合取范式: ¬ SC∧DC = 。同样, DC → SC 不成立, 等价于

¬ SC∧DC ≠根据约束求解结果是否­存在解, 以 AC, DC, SC及其否定形式构建­为 SAT 约束判定矩阵和 UNSAT约束判定矩­阵, 其求解结果一一对应安­全漏洞的状态, 如图 6 所示。由于约束判定矩阵是对­称矩阵,所以只列成三角矩阵形­式即可; 并且对角线上的自反合­取并不产生新的含义, 因此对角线元素也不用­列出。符号 也就是UNSAT。经过考察, UNSAT 矩阵中有 3 个元素在代码分析上是­有安全语义的, 下面按重要性依次列出。

1) DC∧¬ SC= 。安全语义: 安全漏洞不存在被利用­的风险。

2) DC ∧ AC= 。安全语义: 现有威胁模式不可行。3) DC∧SC=。安全语义: 输入全是高风险值。类似地, 可以给出 SAT 约束判定矩阵, 如图 7所示。SAT 约束判定矩阵中符号 代表约束求解的结果不­是空集, 也就是 SAT。经过考察, SAT 矩阵

 ??  ?? 代表数据, 实心点代表污染数据, 空点代表未污染数据; IV 代表输入验证功能语句­或功能块, 是程序中防御注入的措­施(或者称为防御约束); SQL 代表注入的触发点, 这里以 SQL 注入为例; 实线有向弧代表污染数­据在执行路径中传播方­向, 虚线有向弧代表非污染­数据的执行方向, 有向弧上的数字编号为­路径发生顺序图 1注入类漏洞路径模式­Fig. 1 Path patterns of injection vulnerabil­ities
代表数据, 实心点代表污染数据, 空点代表未污染数据; IV 代表输入验证功能语句­或功能块, 是程序中防御注入的措­施(或者称为防御约束); SQL 代表注入的触发点, 这里以 SQL 注入为例; 实线有向弧代表污染数­据在执行路径中传播方­向, 虚线有向弧代表非污染­数据的执行方向, 有向弧上的数字编号为­路径发生顺序图 1注入类漏洞路径模式­Fig. 1 Path patterns of injection vulnerabil­ities
 ??  ?? 图 2注入类漏洞的安全约­束示例Fig. 2 Security constraint sample of injection vulnerabil­ities
图 2注入类漏洞的安全约­束示例Fig. 2 Security constraint sample of injection vulnerabil­ities
 ??  ?? 图 3注入类漏洞的分析框­架Fig. 3 Analysis framework of injection vulnerabil­ities
图 3注入类漏洞的分析框­架Fig. 3 Analysis framework of injection vulnerabil­ities
 ??  ??
 ??  ?? 图 4防御约束示例Fig. 4 Defense constraint sample of injection vulnerabil­ities
图 4防御约束示例Fig. 4 Defense constraint sample of injection vulnerabil­ities
 ??  ?? 图 5攻击约束示例Fig. 5 Attack constraint sample of injection vulnerabil­ities
图 5攻击约束示例Fig. 5 Attack constraint sample of injection vulnerabil­ities

Newspapers in Chinese (Simplified)

Newspapers from China