Sink:漏洞的引爆点。找出所有可能引发安全漏洞的代码。这些代码常常是根据外部传入数据而执行特定任务的代码。如SQL的查询,HTML中输出,命令的执行等等。当数据被传到Sink代码时,Sink首先去检查此数据是否带有污染标记,如果没有,则没有安全问题。反之,则此处可能存在安全问题。然后再根据代码执行的结果来判定是什么类别的安全问题。举例来说明这一分析过程:
userID = request.getParameter("user");
……
2
try {
sql = "SELECT * FROM users " +"WHERE id='" + userID + "'";
……
stmt.executeQuery(sql);
}
这段代码在静态分析过程中,request.getParameter()方法会被标记为一个 “污染源”: Source。stmt.executeQuery()方法会被标记为一个“引爆点”:Sink。当用户输入数据“user”通过 request.getParameter()进入程序并赋值予变量“userID”时, “userID”会被标记上“污染”标记。当用 “userID” 来构造变量“sql”时,“sql”会获取“userID”的“污染”标记而成为被“污染”的数据。当“sql”被送到Sink函数 stmt.executeQuery()中执行的时候,Sink函数的检测机制检测到了“sql”有污染标记,从而判定此处可能引发一个安全问题,随后再根据Sink函数执行“污染”数据“sql”的结果,这里是执行一个SQL查询命令,依此可以判定此处可能会引发一个SQL—Injection的安全问题。
三:Fortify Tracer
全球最大的软件安全厂商美国Fortify Software公司在根据从事多年的软件安全领域的研究的基本上,根据上文讲述的动态污染传播的方法(Dynamic Taint Propagation)成功开发出来了新型安全测试产品——Fortify Tracer。
图2:Fortify Tracer 安全测试报告
Fortify Tracer 利用动态污染传播方法的特点,首先对软件的二进制代码进行插桩分析,找出所有的Source, Sink代码,建立检测机制。然后再对程序进行常规的功能测试。测试过程不需要测试人员输入任何带攻击性的测试数据,就可以进行安全测试了,Fortify Tracer会根据功能测试自动地找出软件中所有可能因外部输入数据而造成的安全问题,并根据漏洞类类清晰地报告出来。总结Fortify racer的主要特点有:
1.无需特殊的攻击性测试数据,让QA人员都可以做安全测试。解决测试缺乏安全知识,攻击知识的难题。
2.由于直接跟踪外部输入数据,所以能够很真实、有效地找出系统中最严重,最关键的安全问题。
3.与功能并行,速度快,效率高,很容易与现有测试流程结合。同时利用功能测试覆盖率高的优点,大大提高了动态安全测试
的覆盖率。
4.清晰而详细的报告。如上图2所示,Fortify Tracer根据漏洞类别清晰地报告出来,点击报出的每一个漏洞,Fortify Tracer可以定位到该漏洞在什么地方产生的。它的Source和Sink分别在哪里等清晰而又详细的报告。
四、总结:
良好的测试方法加上优秀的测试工具一定能够更好地帮助软件企业做好软件安全测试。对于一个软件企业,如果能将软件质量测试与软件安全测试有效地结合,不但能很好地解决软件安全测试问题,同时也可以使得测试团队的工作效率更高,那么基于Dynamic Taint Propagation测试方法的Fortify Tracer将是一个不错的选择。
原文转自:http://www.uml.org.cn/Test/201001284.asp