万志远,周 波
(浙江大学 计算机科学与技术学院,浙江 杭州310027)
随着互联网在全球范围内的普及与发展,Web应用程序已经成为各种类型的服务供应商和客户之间最重要的交流渠道.然而,由Web应用程序的安全漏洞遭攻击而引发的经济财产损失逐年递增.其中,输入验证漏洞是Web应用程序中最普遍且威胁最大的漏洞类型之一.输入验证漏洞是指由恶意的外部输入所引起的程序中的安全问题,常见的输入验证漏洞有跨站脚本和SQL 注入.为了有效地进行针对漏洞检测的代码审计工作[1],近年来静态分析技术得到广泛研究,即在Web应用程序部署前,不运行程序,从程序的内部结构和特性出发,运用程序分析技术检测程序中的潜在漏洞.其中,静态信息流跟踪技术是一个研究热点.该技术静态地跟踪由不可信的源头引入的污点数据流,判断污点数据流是否被恰当清洁,若污点数据流未被恰当清洁并且到达敏感函数,则认为存在潜在的安全风险.
高误报率是基于静态分析的漏洞检测技术面临的主要挑战.本文旨在提出一种检测输入验证漏洞的静态分析方法,在降低漏洞检测误报率的同时,保证不明显降低方法的性能.
信息流(information flow)是指信息从一个对象流向另一个对象的有效路径[2].静态信息流跟踪技术[3-6],也称静态污点分析(static taint analysis),是通过对不可信的源头(source)引入的数据进行污点标记,静态地跟踪被标记的污点数据在程序中的传播路径,并检查传播路径中的污点数据是否在未经过清洁函数(sanitizer)恰当清洁的情况下,被敏感函数(sink)所使用.若发生这样的情况,则表明存在安全漏洞.通过对污点数据传播路径的识别,可以完整地提供安全漏洞被利用时的攻击过程.
一般而言,不可信的源头包括网络、文件和输入设备,应用程序可以通过调用特定的接口获得不可信源头的数据.在Web应用程序中,不可信的源头包括HTTP请求参数、HTTP请求头部、表单隐藏域和Cookie信息等.对于Java Web应用程序而言,通过调用Java EE 的相关API可以获得不可信源头的输入数据.清洁函数是指对带有污点标记的数据进行检查,使得输出数据中不带有污点标记的方法.敏感函数可以表示为对组(m,P),其中m 表示进行安全相关敏感操作的方法.方法m 中存在一些敏感参数P,当这些参数传入污点数据时,表示存在安全攻击的风险.
输入验证漏洞产生的根本原因在于外部输入(不可信的源头)引入的污点数据通过数据流和(或)控制流进行传播.在传播过程中,污点数据流未经过清洁函数恰当地清洁,最终到达敏感函数.在开放式Web应用程序安全项目(OWASP)公布的十大安全风险列表[7]中,常见的输入验证漏洞类型如下.
1)注入漏洞(injection flaws).注入漏洞是指Web应用程序将接收的用户输入数据直接作为命令或查询语句发送至解释器.利用注入漏洞,攻击者能够令解释器执行任意的命令或查询语句,从而导致数据丢失、问责缺失或拒绝服务.常见的注入漏洞有SQL注入漏洞.SQL注入漏洞被利用时,未经验证的用户输入直接传入后端数据库解释器,并且作为数据库命令被执行.
2)跨站脚本(cross-site scripting,XSS).跨站脚本漏洞是指Web应用程序直接使用未经恰当验证的用户输入数据动态生成页面,并发送至受害者的浏览器端显示.通常,攻击者利用跨站脚本漏洞注入恶意数据,例如JavaScript、VBScript、ActiveX、HTML或Flash片段.当恶意数据在受害者浏览器端被执行时,可能引发用户信息劫持、用户设置篡改或Cookie窃取等后果.
3)未经验证的重定向和请求转发.未经验证的重定向和请求转发漏洞是指Web应用程序使用用户提供的数据来确定重定向或请求转发的目标Web站点.利用该类型漏洞,攻击者可以通过操纵输入来控制受害者访问的目标站点,从而对受害者实施钓鱼攻击或利用受害者的信息访问未经授权的Web页面.
数据流分析是指通过分析程序中数据流在基本块(basic block)之间的传递和修改,收集程序在不同点的数据流信息.对于程序中的任意基本块B,基本块之前与之后的数据流信息分别用IN[B]和OUT[B]表示,IN[B]和OUT[B]之间的约束关系由基本块B 中语句的语义决定.该约束关系使用转移函数(transfer function)进行描述.Kildall[8]提出一种统一的数据流分析框架来描述不同的数据流分析问题.数据流分析框架的核心理论基础是格理论,应用格理论中的半格作为数据流分析的工具.
定义1 代数格[9]L 是由值集合和2个二元运算(交运算∩、并运算∪)组成,并满足以下性质.
1)封闭律:对于所有的x、y∈L,存在唯一的u、v∈L,使得x∩y=u并且x∪y=v.
2)交换律:对于所有的x、y∈L,满足
x∩y=y∩x 并且x∪y=y∪x.
3)结合律:对于所有的x、y∈L,满足(x∩y)∩z=x∩(y∩z)并且(x∪y)∪z=x∪(y∪z).
4)L 中存在唯一的顶元素(top)┬和底元素(bottom)┴,对于所有的x∈L,满足x∩┴=┴并且x∪┬=┬.
半格[10]与格最大的差别在于二元运算的个数,半格中只有一个二元运算∩.数据流分析使用半格的元素来表达数据流信息.
定义2 数据流分析框架(D,V,∩,F)由以下元素组成[8].
1)数据流方向D,取值为FORWARD(前向)或BACKWARD(逆向).
2)半格L=(V,∩),其中包括值的集合V 和交汇运算∩.
3)从集合V 到集合V 的转移函数集合F,转移函数集合中包含描述程序中每个节点边界条件的转移函数.
在半格L 上定义如下偏序关系≤:对于集合V中的所有x 和y,x≤y 当且仅当x ∩y=x.此外,F反映数据流信息在各个点之间的转移情况.当F 中的函数为单调函数时,可以通过求解转移函数的固定点求解数据流分析问题.
对静态漏洞检测方法进行介绍.该检测方法的输入为被分析程序以及Web应用程序中常见的污点源头、敏感函数和清洁函数的相关信息.
该方法整体分为以下4个阶段.
1)生成被分析程序的调用图G,并对该程序进行指针分析.
2)遍历程序的调用图G 以标记程序中的污点源头、敏感函数和清洁函数.
3)对除污点源头、敏感函数和清洁函数以外的方法进行过程内数据依赖分析,建立方法的数据依赖关系摘要.
4)进行双向数据流分析来跟踪数据流,定位漏洞位置,生成漏洞警报.
指针分析是一种静态程序分析技术,计算指针指向关系,将每一个指针变量映射到运行时可能指向的对象集合.典型的指针指向关系通过变量的指针指向集合(points-to set)表示,集合中存放运行时变量可能指向的对象.通过指针分析得到完整的指针指向关系被证明是不可判定的[11],通过指针分析只能得到近似的结果,并且算法的精确度由算法对程序结构描述的精确度决定.指针分析算法的精确度越高,时间复杂度越高,在实际的系统设计中须同时考虑方法的精确度和性能.本文采用以Andersen算法[12]为基础的指针分析算法,直接集成了Java指针分析框架Doop[13]中实现的2种类型指针分析算法,分别是上下文不敏感(context-insensitive)的指针分析和一层调用点上下文敏感(one level of call-site context-sensitive)的指针分析,对被分析程序进行指针分析预处理.在预处理之后,系统使用指针分析的结果计算变量之间的may-alias 别名关系.
定义3 对于本地变量v 和w,定义别名关系Alias(v,w)为
式中:pts(v)和pts(w)为变量v 和w 的指针指向集合.
Java程序片段如下.
通过指针分析可以发现,变量s1和s2均指向由第16行内存分配点所表示的同一个堆内存位置,即pts(v)∩pts(w)≠∅.由别名关系的定义可得,变量s1和s2之间存在别名关系Alias(s1,s2).同时,指针分析处理程序中的load/store语句,因此可以通过指针分析获得堆内数据的依赖关系.
过程内数据依赖分析旨在获得被分析方法参数与返回值之间的数据依赖关系摘要.
定义4 数据依赖关系摘要可以定义为对组(ret,P),其中ret表示方法的返回值,P 表示方法中所有影响返回值ret的参数的集合.
在对单个方法进行过程内数据依赖分析时,只考虑除源头函数、清洁函数以及敏感函数以外的方法.分析从方法返回语句出发,逆向地对方法内的语句逐一进行分析,记录影响方法返回值的变量,直达方法初始处的语句;若记录的变量中存在该方法的参数,则将参数作为输入生成该方法的摘要.Java程序片段如下.
方法“id”经过程间数据依赖分析得到的数据依赖关系摘要为(ret,{str}).方法“id”调用了Java标准库中StringBuffer类的toString和append方法.为了提高分析效率,在对应用程序部分进行过程内数据依赖分析前,预先识别出与字符串操作相关的库方法,并构建这些方法的数据依赖关系摘要,用于应用程序中方法的数据依赖分析.
方法的数据依赖关系摘要描述了参数与返回值间的数据依赖关系,在进行过程间分析时,可以避免对同一方法重复进行多次分析.当过程间分析中某方法被调用时,可以直接使用摘要获得该方法的数据依赖关系,完成数据流传播,从而提高方法的整体性能.
使用双向数据流分析:首先,从敏感函数被调用处出发,进行逆向的数据流分析,即敏感性分析;然后,将污点源头输入的数据标记为污点数据,进行前向的数据流分析,即污点传播.当双向数据流交汇时,即污点源头和敏感函数之间存在可行路径如图1所示,方法会发出漏洞警报.在Web应用程序中,典型的污点源头函数包括getParameter、getHeader和getCookies,典型的敏感函数包括Statement.execute-Update、JspWriter.print和sendRedirect.
传统的静态信息流跟踪技术只进行单向的污点传播,当污点数据传入敏感函数时进行漏洞报警.与传统方法相比,本文方法在进行污点传播前先进行敏感性分析,从而缩短了污点传播路径的长度,提高了污点传播的效率.此外,在进行过程间数据流分析时使用过程内分析产生的数据依赖关系摘要,分别对敏感性数据和污点数据进行传播.
图1 漏洞检测模型Fig.1 Vulnerability detection model
2.3.1 敏感性分析 敏感性分析是一种逆向的数据流分析,计算程序中变量的敏感性属性.变量的敏感性属性表示变量是否会成为敏感函数的敏感参数.表达变量敏感性属性的半格定义为Sensitiveness,半格的值包括sensitive和insensitive,分别表示不敏感(insensitive)和敏感(sensitive)2种数据类型.当变量为不敏感(insensitive)时,表示变量不会成为敏感函数的敏感参数;当变量为敏感(sensitive)时,表示变量会成为敏感函数的敏感参数.在半格上定义偏序关系“≤”,其中sensitive≤insensitive,定义二元运算符∩为半格中的最大下界操作.在默认情况下,局部变量的敏感性属性初始化为insensitive.
敏感性分析的半格为一个乘积格,值域集合V为P(Var×Sensitiveness).其中Var为程序中变量的集合,Sensitiveness为变量的敏感性属性值,顶元素┬为∅,底元素┴为全集Var,在该半格上定义偏序关系“≤”为⊆.
求解变量的敏感性属性的迭代算法如下.
在敏感性分析中,IN[B]和OUT[B]是值为sensitive的变量的集合.S∈succ(B)表示基本块B 在控制流图中的所有后继节点.
基本块B 由一个或多个语句stmt组成.转移函数fB定义为fB(OUT[B])=(OUT[B]-KILLB)∪GENB,其中集合KILLB为基本块B 中变为不敏感的变量(即值为insensitive),集合GENB为基本块B 中变为敏感的变量(即值为sensitive).敏感性分析主要关注基本块中的数据操作语句,数据操作语句有赋值和函数调用等.这些语句中包含至少一个源数据src和一个目标数据tgt.sensitivity(stmt,src),sensitivity(stmt,tgt)={insensitive,sensitive}分别表示语句stmt中的源数据和目标数据是否敏感.数据间的敏感性属性按如下规则传播.
1)当stmt为赋值语句,tgt=src时,sensitivity(stmt,src)=sensitivity(stmt,tgt).
2)当stmt为调用语句,tgt=invoke(src)时,分为以下3种情况.
a)若调用的方法为敏感函数,
则sensitivity(stmt,src)=sensitive.
b)若调用的方法为清洁函数,
则sensitivity(stmt,src)=insensitive.
c)若调用的方法为其他方法,
则sensitivity(stmt,src)=sensitive(stmt,tgt).对于程序中的每一个基本块B,逆向遍历其中的语句stmt∈B,根据语句的类型对集合KILLB和GENB进行更新.不同类型语句对应的规则如下.1)当stmt为赋值语句,tgt=src时,GENB=
{src|sensitivity(stmt,tgt)is sensitive}∪GENB.
2)当stmt为调用语句,tgt=invoke(src)时,分为3种情况.
a)若调用的方法为敏感函数,则GENB={src}∪GENB.
b)若调用的方法为清洁函数,则KILLB={src}∪KILLB.
c)若调用的方法为其他方法,则GENB={src|sensitivity(stmt,tgt)is sensitive}∪GENB.
2.3.2 污点传播 污点传播是一种前向的数据流分析,计算程序中变量的污点属性.变量的污点属性表示变量是否受污点源头数据的污染.表达变量污点属性的半格定义为Taintness,半格的值包括tainted、unknown和untainted.当变量为污染(tainted)时,表示变量受污点源头数据的污染.当变量为未知(unknown)时,表示变量的污点属性待定.当变量为未污染(untainted)时,表示变量不受污点源头数据的污染.在半格上定义偏序关系“≤”如图2所示,二元运算符∩为半格中的最大下界操作.在默认情况下,将局部变量的污点属性初始化为unknown.
图2 半格Taintness的定义Fig.2 Definition of lattice“Taintness”
污点传播的半格为一个乘积格,值域集合V 为P(Var×Taintness),其中Var为程序中变量的集合,Taintness为变量的污点属性值;顶元素┬为∅,底元素┴为全集Var;在该半格上定义偏序关系“≤”为⊆.
污点传播的迭代算法如下.
在污点传播中,IN[B]和OUT[B]包含2 个集合,INuntainted[B]、INtainted[B]以 及OUTuntainted[B]、OUTtainted[B]分别包含值为untainted和tainted的变量.S∈pred(B)表示基本块B 在控制流图中的所有前驱节点.该算法中转移函数fB定义如下.
1)fB(INuntainted[B])=(INuntainted[B]-KILLB-untainted)∪GENB-untainted.其中集合KILLB-untainted为基本块B 中变为污染的变量(即值为tainted);集合GENB-untainted为基本块B 中变为未污染的变量(即值为untainted).
2)fB(INtainted[B])=(INtainted[B]-KILLB-tainted)∪GENB-tainted.其中集合KILLB-tainted为基本块B 中变为未污染的变量(即值为untainted);集合GENB-tainted为基本块B 中变为污染的变量(即值为tainted).
在污点传播中,关注基本块中的数据操作语句,即赋值和函数调用语句;语句中包含至少一个源数据src和一个目标数据tgt.taint(stmt,src),taint(stmt,tgt)={tainted,unknown,untainted}分别表示语句stmt中源数据和目标数据是否被污染.数据间的污点属性按如下规则传播.
1)当stmt为赋值语句,tgt=src时,
taint(stmt,tgt)=taint(stmt,src);
2)当stmt为调用语句,tgt=invoke(src)时,分为3种情况.
a)若调用的方法为污点源头,
则taint(stmt,tgt)=tainted.
b)若调用的方法为清洁函数,
则taint(stmt,tgt)=untainted.
c)若调用的方法为其他方法,
则taint(stmt,tgt)=taint(stmt,src).
对于程序中的每一个基本块B,前向遍历其中的语句stmt∈B,根据语句的类型对集合KILLB和GENB进行更新.不同类型语句对应的规则如下.
1)当stmt为赋值语句tgt=src时,
GENB-tainted={tgt|taint(stmt,src)is tainted}∪GENB-tainted,
GENB-untainted={tgt|taint(stmt,src)is untainted}∪GENB-untainted.
2)当stmt为调用语句tgt=invoke(src)时,分为以下3种情况.
a)若调用的方法为污点源头,
则 GENB-tainted={tgt}∪GENB-tainted,并 且KILLB-untainted={tgt}∪KILLB-untainted;
b)若调用的方法为清洁函数,则GENB-untainted={tgt}∪GENB-untainted,并且KILLB-tainted={tgt}∪KILLB-tainted.
c)若调用的方法为其他方法,则
通过与FindBugs 2.0.0[14]静态检测方法进行比较,证明本文提出的方法能够在不明显降低运行性能的同时,提高FindBugs的输入验证漏洞检测精确度.
方法的实现基于开源静态代码分析工具Find-Bugs.系统整合了Java指针分析框架Doop 中的2种类型指针分析的结果,分别是上下文不敏感指针分析(CI)和一层调用点上下文敏感指针分析(CS).
实验的运行环境为Windows XP SP2 的PC(2.33GHz Intel Core 2CPU,2GB RAM)以及Java标准 版 运 行 环 境(Java Standard Edition Runtime Environment,JRE)1.6.0_23版本和256M 堆空间.实验的分析对象为SecuriBench[15]基准程序中7个开 源 的Java Web 应 用 程 序,表1 显 示 了SecuriBench中基准程序的基本信息.
为了评估方法的精确度,对本文方法漏洞检测的误报率进行分析,并与FindBugs进行比较.如表2所示为对本文方法和FindBugs的漏洞检测结果进行统计:“污点源头”列显示了基准程序中污点源头的数量,“敏感函数”列显示了敏感函数的数量,这2列值在一定程度上体现了人工代码审计的工作量;“FindBugs”列显示了FindBugs漏洞警报的数量,“CI”列和“CS”列分别显示了整合2种不同类型指针分析后本文方法的漏洞警报数量.
表1 实验基准程序信息Tab.1 Information of benchmarks
表2 FindBugs和本文方法的实验结果比较Tab.2 Experimental results of FindBugs and our approach
表2显示的漏洞警报包含真/假阳性警报.通过人工检查,确定真/假阳性警报,并对存在假阳性漏洞警报的基准程序中的真/假阳性漏洞警报的数量进行对比.如图3 所示,N 为漏洞警报的数量.FindBugs总共报出50 例漏洞警报,其中30 例误报,平均误报率为60.0%.其中,在基准程序jboard、roller和snipsnap中,FindBugs报出11例假阳性漏洞警报;在webgoat中,FindBugs报出2例假阳性漏洞警报.经人工分析发现,该13例假阳性漏洞警报对应的数据流均不来源于不可信的源头,因而无法被利用进行攻击.此外,FindBugs报出的其他17例假阳性漏洞警报均存在于webgoat中;漏洞警报对应的污点数据流已被应用程序中特定的方法进行清洁,因此无法被利用进行攻击.综上所述,FindBugs误报率是由其不完整且不精确的信息流跟踪造成的.
图3 漏洞警报的真阳性与假阳性分类Fig.3 Classification of reported issues into true and false positives
本文提出的方法共报出23 例漏洞警报,其中1例假阳性,误报率为4.3%,将FindBugs输入验证漏洞检测的误报率降低了55.7%.该假阳性警报存在于webgoat中,漏洞发生处的污点数据流已被应用程序中特定的方法进行清洁,因此无法被利用进行攻击.此外,与FindBugs相比,本文的方法发现了额外2例存在于webgoat中的真阳性漏洞警报,类型为HTTP响应拆分漏洞(HTTP response splitting).在本文方法发现的22 例漏洞警报中,包含snipsnap中的7例HTTP响应拆分漏洞、2例webgoat中的HTTP响应拆分漏洞以及13例webgoat中的SQL注入漏洞.
在实验中,本文方法的平均运行时间为42.8s,是FindBugs运行时间的1.9倍.本文方法的最长运行时间不超过100s,为FindBugs运行时间的2.5倍.图4比较了本文提出的方法和FindBugs分析各个基准程序的运行时间t.实验结果表明,本文方法在没有明显降低性能的同时,降低了FindBugs输入验证类型漏洞检测的误报率.经过分析发现,额外的运行时间主要来源于在数据流分析过程中使用指针分析结果计算别名关系带来的额外开销.
本文方法的核心算法基于数据流分析实现,数据流分析通过迭代模型求解.假设被分析程序的控制流图中基本块的数量为I,变量的数量为V,每一个基本块B 的IN[B]和OUT[B]对应的集合中最多包含V 个变量,因此算法最多需要O(I×V)次迭代到达固定点.此外,每次迭代中最多包含O(I)次数据流交汇运算,每次交汇运算最多需要O(V)时间.在最坏情况下,数据流分析的时间复杂度为O(I2×V2).实际中,数据流分析的时间复杂度为O(I×V)[16].实验结果表明,对于普通的应用程序,本文方法能够以较小的时间代价完成.随着输入程序的复杂性和规模的增长,本文方法的运行时间呈线性递增的趋势.
图4 FindBugs和本文方法的运行时间比较Fig.4 Execution time of FindBugs and our approach
在应用安全领域,信息流跟踪技术被广泛应用于安全漏洞检测、攻击检测和预防、恶意软件检测和自动输入过滤生成等方向.信息流跟踪技术可以通过3种方式,即静态、动态和混合的方式实现.本章主要针对应用于安全漏洞检测的静态信息流跟踪技术进行综述和讨论.
1)基于类型的方法.Volpano等[17]提出了一种基于类型的方法,用于检测有类型编程语言中的漏洞,通过在编程语言的类型系统(type system)中引入类型限定符(type qualifier)实现变量污点属性的传递.扩展了C 语言类型系统的CQual[18]工具,通过限定推断(qualifier inference)确定引入额外限定符的扩展系统中是否存在类型错误.Shankar等[5]用CQual工具对C 语言程序中的格式化字符串缺陷进行检测.JFlow[6]方法对Java语言进行扩展,通过标记静态地检测程序中的安全问题,并且在Myers 的Jif(Java Information Flow)工 具 上 实 现.Huang等[19]使用类似CQual的类型系统,首次针对PHP Web应用程序的漏洞进行检测.通常,基于类型系统的方法要改变编程语言、编译器及运行时系统,并且需要程序员对代码进行类型注释.采用本文提出的方法直接分析程序,不增加程序员负担,相比之下更具有实际应用价值.
2)基于依赖图(dependency graph)的方法.Java字节码静态检测工具MARCO[20]基于程序切片技术实现静态数据流跟踪.Tripp等[8]提出了Java应用 程 序 污 点 分 析 方 法(taint analysis for Java,TAJ),将MARCO 中使用的技术扩展到实际的大型Web应用程序中.Guarnieri等[21]提出了ACTARUS工具,该工具受到TAJ的重要影响,用于进行JavaScript应用程序中的安全漏洞检测.Sridharan等[22]在ACTARUS上提出了F4F,用于支持基于框架开发的Web应用程序静态分析.通常,基于依赖图的方法将被分析程序用程序依赖图(program dependency graph)或系统依赖图(system dependency graph)表示,从而将数据流跟踪问题转化为图的可达性问题.本文方法不生成被分析程序的依赖图,直接对程序进行数据流分析.
3)基于数据流分析的方法.Jovanovic等[23]提出一种上下文敏感的过程间数据流分析算法,来检测PHP应用程序中的输入验证漏洞,并实现了原型系统Pixy.与Pixy相比,本文采用基于数据流分析的方法检测漏洞,但提出双向数据流分析实现静态信息流跟踪,在一定程度上提高信息流跟踪的效率.
黄强等提出一种在SSA(static single assignment)中间表示上进行前向污点传播分析的方法,在潜在漏洞发生处动态插装清洁函数.与黄强等[24]提出的方法相比,本文方法直接分析Java程序,采用前向的污点传播和逆向的敏感性分析,缩短了污点传播路径的长度.
此外,Livshits 等[7]使 用 程 序 查 询 语 言(program query language,PQL)描述漏洞检测策略,并进行 基 于 二 元 决 策 图(binary decision diagrams,BDD)[25]的流不敏感过程间别名分析跟踪对象间的信息流,从而检测程序中的安全漏洞.本文使用的漏洞检测策略描述方式比PQL更简洁,易于扩展.
本文针对Java Web应用程序中的输入验证漏洞,提出一种基于静态信息流跟踪的检测方法.本文在开源静态代码分析工具FindBugs上实现了该方法,并在基准程序SecuriBench 上对该方法的性能和漏洞检测精确度进行评估.实验结果表明,采用该方法能够有效地检测输入验证漏洞,在不明显降低FindBugs运行性能的前提下,大幅度降低了漏洞检测的误报率.
(
):
[1]CHESS B,WEST J.Secure programming with static analysis[M].Boston:Wesley,2007.
[2]DENNING P J.Certification of programs for secure information flow [J].Communications of the ACM,1977,20(7):504-513.
[3]SHANKAR U,TALWAR K,FOSTER J,et al.Detecting format string vulnerabilities with type qualifiers[C]∥Proceedings of 10th USENIX Security Symposium.Berkeley:USENIX,2001.
[4]MYERS A.JFlow:practical mostly-static information flow control[C]∥Proceedings of the ACM Symposium on Principles of Programming Languages.New York:ACM,1999.
[5]LIVSHITS B,LAM M.Finding security vulnerabilities in Java applications with static analysis[C]∥Proceedings of 14th USENIX Security Symposium.Baltimore:USENIX,2005.
[6]TRIPP O,PISTOIA M,FINK S J,et al.TAJ:effec-tive taint analysis of web applications[C]∥Proceedings of ACM Conference on Programming Language Design and Implementation.Dublin:ACM,2009.
[7]OWASP Top 10.2014-03-21.https:∥www.owasp.org/index.php/Top_10_2013-Top_10.
[8]KILDALL G A.A unified approach to global program optimization[C]∥Proceedings of the ACM Symposium on Principles of Programming Languages.New York:ACM,1973.
[9]GRÄTZER G.Lattice theory:first concepts and distributive lattices[M].San Francisco:Freeman,1971.
[10]张鸣华.半格基础上的数据流分析[J].计算机学报,1980(04):309-320.ZHANG Ming-hua.Dataflow analysis with semi-lattice[J].Chinese Journal of Computers,1980(04):309-320.
[11]RAMALINGAM G.The undecidability of aliasing[J].ACM Transactions on Programming Languages and Systems,1994,16(5):1467-1471.
[12]ANDERSEN L O.Program analysis and specialization for the C programming language[D].Denmark:University of Copenhagen,1994.
[13]BRAVENBOER M,SMARAGDAKIS Y.Strictly declarative specication of sophisticated points-to analyses[C]∥Proceedings of the 24th ACM SIGPLAN Conference on Object Oriented Programming Systems Languages and Applications. New York:ACM,2009.
[14]FindBugsTM-Find Bugs in Java Programs.2014-03-21.http:∥findbugs.sourceforge.net/.
[15]Stanford SecuriBench.2014-03-21.http:∥suif.stanford.edu/~livshits/securibench/.
[16]ANDREW W A,JENS P.Modern compiler implementation in Java[M].Cambridge:Cambridge University Press,2002.
[17]VOLPANO D,IRVINE C,SMITH G.A sound type system for secure flow analysis[J].Journal of Computer Security,1996,4(2/3):167-187.
[18]FOSTER J,FAEHNDRICH M,AIKEN A.A theory of type qualifiers[C]∥Proceedings of ACM Conference on Programming Language Design and Implementation.New York:ACM,1999.
[19]HUANG Y,YU F,HANG C,et al.Securing web application code by static analysis and runtime protection[C]∥Proceedings of the 12th International World Wide Web Conference.New York:ACM,2004.
[20]PISTOIA M,FLYNN R J,KOVED L,et al.Interprocedural analysis for privileged code placement and tainted variable detection[C]∥Proceedings of the 19th European Conference on Object-Oriented Programming.Glasgow:Springer,2005.
[21]GUARNIERI S,PISTOIA M,TRIPP O,et al.Saving the world wide web from vulnerable JavaScript[C]∥Proceedings of the 20th International Symposium on Software Testing and Analysis.New York:ACM,2011.
[22]SRIDHARAN M,ARTZI S,PISTOIA M,et al.F4F:taint analysis of framework-based web applications[C]∥Proceedings of the 2011ACM International Conference on Object Oriented Programming Systems Languages and Applications.New York:ACM,2011.
[23]JOVANOVIC N,KRUEGEL C,KIRDA E.Pixy:a static analysis tool for detecting web application vulnerabilities[C]∥Proceedings of IEEE Symposium on Security and Privacy.Berkeley/Oakland:IEEE,2006.
[24]黄强,曾庆凯.基于信息流策略的污点传播分析及动态验证[J].软件学报,2011,22(9):2036-2048.HUANG Qiang,ZENG Qing-kai.Taint propagation analysis and dynamic verification with information flow policy [J].Journal of Software,2011,22(9):2036-2048.
[25]WHALEY J,LAM M.Cloning-based context-sensitive pointer alias analysis using binary decision diagrams[C]∥Proceedings of ACM Conference on Programming Language Design and Implementation.New York:ACM,2004.