应用程序的安全性是很有挑战性的:尽管发现一些漏洞可能很容易,但是保证应用没有漏洞是困难的。1
渗透测试和静态代码分析工具都有其固有的局限性。渗透测试依赖于有效地代码执行,但是在实践中,漏洞识别时只会检查Web应用的输出。所以,缺少查看应用的内部行为会限制渗透测试的有效性。
另一方面,详尽的
源代码分析可能比较困难。代码的复杂性以及缺少动态(运行时)的观察可能会阻止发现很多安全缺陷。当然,渗透测试不需要查看源码,但是静态代码分析需要。
使用错误的检测工具会导致部署的应用含有未检测出的漏洞。图2比较了在Web服务中,知名的并广泛使用的渗透测试和静态分析工具在检测SQL注入漏洞中的表现。8结果显示静态代码分析工具——包括FindBugs、Fortify 360以及IntelliJ IDEA(在图中匿名为SA1到SA3)——的覆盖度通常高于渗透测试工具,包括HP WebInspect、IBM Rational AppScan、Acunetix Web Vulnerability Scanner以及科英布拉大学开发的一个原型工具(在图中匿名为VS1到VS4)。这两种方式都有的一个问题就是误报,但是在静态分析中更明显。一个重要的发现在于相同方式下的不同工具对于相同的代码通常报告不同的漏洞。
根据研究结果,需要强调工具的局限性使得有必要提高漏洞检测的有效性,比如这可以通过联合使用多种方式来实现。另外,开发人员需要定义一种机制来评估和比较不同的工具,这样它们才能选择最适合各种开发场景的工具。
检测攻击
为了防止对Web应用的
攻击,软件工程师必须实施攻击检测机制,通常称为入侵检测系统(intrusion detection system,IDS)或Web应用防火墙(WAF)。不同的工具可以作用在应用或网络级别甚至在应用的资源上,如数据库,它们可以使用不同的方式如异常检测或签名匹配来检测攻击。
检测攻击的方法
检测攻击要区分出与所学习行为的差别。攻击检测工具所使用的方式要么基于异常检测要么基于签名。8
异常检测通常需要一个训练阶段。训练阶段会展现系统的无恶意请求,工具会在给定的架构级别观察它的行为并
学习正常的操作。这些工具会考虑到每个Web应用程序的细节,但如果应用程序的正确行为发生了变化或学习不完整的话,会产生很多错误的警告。
相比之下,基于签名的工具会查找预定义的一组规则模式或标示攻击的签名。因为这些签名通常是独立于应用的,所以工具的成功与应用程序的运行配置文件或任何训练过程无关。
在网络级别进行操作的工具通常会监视和分析
网络流量,以保证攻击在到达Web应用之前检测到。
工作在应用级别的攻击检测工具会分析发送给应用的请求并试图利用服务端程序和请求中参数的特定关系。工作在资源层的工具会保护与每种漏洞类型相关的资源。这些工具会在应用层之下并接近受保护的资源。一个常见的例子是监控对数据库服务器的访问来检测SQL注入的IDS。
工具使用各种策略来收集应用请求以及可能收到攻击的信息。一些工具会使用嗅探策略来监控和分析通过网络传输的数据以此来观察HTTP流量,但是加密、编码以及封装可能会限制其有效性。同时,网络上可能会承载大量与受保护应用无关的数据。另一些工具会分析应用产生的日志甚至是应用所在服务器所产生的日志。尽管这种策略不会直接延迟对应用的请求,但是受限于日志中可以得到的信息。
而另一种策略就是在请求的来源和受保护的应用或资源间引入一个代理。这能够很容易地阻止攻击,因为它提供了关于目标应用或资源的有用信息,但是,它引入了不良的延时从而会影响应用的正常行为。
检测攻击的局限性
因为每个Web应用程序的细节会影响到攻击检测工具的表现,同时工具所运行的架构级别也会有所影响,所以它们的实际效果通常是未知的。10大多数工具的检测覆盖比较低(在很多场景下,低于20%),同时它们还会有很多误报(高达所产成警报的50%)。此外,有些工具在特定的场景下展现的结果很好,但是在其他场景下所提供的结果很差。
数据库级别的工具通常比应用级别的工具表现更好一些,10
不过它们会产生一些关于请求的误报,这些请求是不会成功攻击数据库的。基于异常检测的工具对于简单的应用表现得更好,而基于签名的工具对于复杂的应用表现更好。在简单的应用程序中,工具能够学习并且更好地描述行为,因此从模式中检测偏差会更准确。实际上,异常检测的成功取决于训练阶段。如果训练不完整或者应用的正常操作配置在训练