APP下载

基于代码审计的Web 应用安全性测试技术研究

2021-06-29韩可

数字技术与应用 2021年5期
关键词:插桩源代码开发人员

韩可

(上海纽盾科技股份有限公司,上海 200438)

1 背景

1.1 全球面临软件安全危机

从我们对2018年网络威胁的研究中可以看出,Web应用程序黑客攻击是对组织和个人最频繁的攻击之一。被黑客入侵的网站可用于多种用途:散布恶意软件,窃取数据,发布广告或禁止的信息,进行欺诈或渗透内部网络。

Web应用的发展伴随着巨大的安全危机,解决漏洞问题是软件开发从业者和安全从业者们迫在眉睫的任务。

1.2 Web应用安全性测试的必要性

如果没有Web安全测试,程序上带有病毒,你的系统就会受到巨大影响,很容易成为黑客们的挑衅对象。刚上线系统对互联网环境的适应性比较差,代码审计可以充分挖掘代码中存在的安全问题;避免系统刚上线就遭受到黑客的重大攻击。应事先于黑客发觉系统的安全隐患,并提前部署好安全防御措施,保证系统的每一个环节在未知环境下都能经受得起黑客挑战。实践证明,保证代码质量最快捷有效的手段就是源代码的审计,而程序的安全性是否有保障在很大程度上取决于程序代码的质量,因此做好源代码审计是很有必要的[2]。

1.3 目标

在这项工作中,对软件开发人员进行安全代码审查的有效性进行了探索性分析,希望能够确定:(1)开发人员进行代码审查的效率如何以及其中的差异程度;(2)聘请的独立审核员的最佳数量;(3)是否可以提前预测哪些开发人员在执行安全审核方面最有效;(4)和审查工具的结果进行对比。

2 预测效果

代码审计是一种以发现程序错误,安全漏洞和违反程序规范为目标的源代码分析,能够找到普通安全测试所无法发现的安全漏洞。提前做好代码审计工作,非常大的好处就是将先于黑客发现系统的安全隐患,提前部署好安全防御措施,保证系统的每个环节在未知环境下都能经得起黑客挑战,进一步巩固客户对企业及平台的信赖[3]。我们向每位审稿人询问以下因素,希望这些因素可能与审稿人的有效性有关:

(1)对应用理解;(2)对评估的自我评估信心;(3)教育程度;(4)有代码审查经验;(5)与安全有关的认证的名称和数量;(6)具有软件/网站开发和计算机安全方面的经验;(7)对软件/Web开发人员和安全专家充满信心;(8)最熟悉的编程语言。

识别审阅者对这些问题的响应与他们在代码审阅期间发现错误的成功之间的关系,可以洞悉哪些标准或因素最能预测成功的安全审阅。同时对比审查工具结果。

3 实现原理

经过多年对IAST技术的深入分析及需求调研,注重结果的精确度及工具的易用性,更加适用于DevSecOps场景,提升代码安全质量。我们编写了一个代码审计助手程序,应用于代码安全审核和质量分析,支持对主流编码规范、后门代码检测、分布式引擎部署。

我们采用最具代表性的代理模式和插桩模式。

代理模式,设置代理服务器,让PC端浏览器或者移动端APP的功能测试的流量通过代理完成,模拟多种漏洞检测方式,通过转发的流量对被测服务器进行安全测试[3]。

插桩模式,在特定位置安装探针程序的同时保证目标程序原有逻辑完整,探针可以获取请求、代码数据流、代码控制流等,不影响原有程序的运行。可以通过请求、代码、数据流、控制流综合分析来判断是否存在漏洞。

3.1 代理模式实现原理

代理模式实现原理如图1。

图1 代理模式原理Fig.1 Delegation pattern

其测试步骤:(1)在浏览器中或者APP中设置代理;(2)测试开始后,代码审计助手将复制的流量改造成安全测试的流量;(3)将改造后的流量模拟发起安全测试,根据返回的数据结果判断是否存在漏洞。

3.2 主动插桩实现原理

主动插桩实现原理图如图2。

图2 Active 插桩原理Fig.2 Principle of Active piling

其测试步骤:

(1)被测试服务器中安装插桩探针;(2)DAST Scanner发起扫描测试;(3)探针追踪被测试应用程序在扫描期间的反应,包含测试、覆盖率和上下文测试,测试完之后将信息发送给管理服务器,将安全测试结果展示出来。

3.3 被动插桩实现原理

被动插桩实现原理如图3。

图3 Passive 插桩原理Fig.3 Principle of Passive piling

其测试步骤:

(1)被测试服务器中安装插桩探针;(2)插桩探针在应用程序运行时获取请求和代码数据流、代码控制流;(3)插桩测试完之后将信息发送给管理服务器,将安全测试结果展示出来。

4 分析验证

4.1 准备工作

我们使用了一个现有的开源Web CMS应用程序。该CMS是用PHP和JavaScript编写的,使用MySQL数据库。由于:(1)代码中存在已知漏洞,我们选择了此应用程序进行研究;(2)它的大小足够小,足以使安全审查以合理的成本完成;(3)它的相对宽松的许可证,使我们可以将代码匿名化。

该CMS当前有四个发行版本,我们选择让审阅者审阅第三个发行版本0.6,而不是最新版本,该版本具有更多已知的漏洞,但仍具有与最新版本相当的功能。

为了准备和匿名处理代码,我们通过两种方式修改了CMS源代码:首先,删除了名称和所有商标,将其重命名为TestCMS,这是一个通用名称,无法在网上搜索。希望开发人员查看该CMS的错误跟踪器或任何公开报告的漏洞;

我们希望确保他们没有任何先入为主的方式来检查代码,而匿名化包括从页面标题,所有相关图像和Logo以及变量名称或注释中的所有和名称相关的内容。对代码进行匿名处理后,我们以两种方式修改代码以增加其中的漏洞数量,以减少随机噪声在我们对审阅者有效性的评估中的作用并增加漏洞类型的多样性。

完成此修改之后,Web应用程序具有我们已知的三个Cross-Site 脚本漏洞,并且在整个应用程序中都没有Cross-Site Request Forgery保护。其次,我们仔细介绍了两个SQL注入漏洞,为确保它们代表自然可见的真实SQL注入漏洞,我们在安全列表网站(SecList.org)上找到了结构相似的CMS应用程序,

对它们进行分析,找出其中的两个SQL注入漏洞,改编易受攻击的代码,并将这些漏洞引入TestCMS,结果是一个具有六个已知漏洞的Web应用程序。

确保这些漏洞可以合理地代表其他Web应用程序中存在的问题。

Web应用程序的任何访问者都可以利用这六个已知的漏洞;他不必是注册用户;此外,这些漏洞仅是由应用程序的PHP源代码中的错误引起的,例如,我们不考虑诸如此类的问题。另外还有拒绝服务攻击或不安全的密码策略等方面,但我们没有在六个已知漏洞列表中列出这些问题,并未将此类报告归类为不正确的内容,第4.1节包含了有关如何处理此类报告的更多详细信息。

4.2 测试的流程

我们要求开发人员仅审查提供给他们的一部分代码,尤其是让他们审查除管理界面和客户端代码之外的所有内容,他们总共审查了大约3500行代码。

人工漏洞:如前所述,我们引入了两个SQL注入漏洞,添加这些人工漏洞会创建人为漏洞的代码库,其中应用程序的原始开发人员并未引入所有错误。

这些人为的漏洞可能会使结果产生偏差,因为它可能使代码审阅比审阅“自然的bug”应用程序更容易或更难。通过确保真正的Web开发人员之前犯过相同的错误来实现代码库的功能。

静态分析工具:我们限制验证开发人员执行审核方式的方式;在设计实验时已考虑了这一点;我们需要报告的每个漏洞的具体且详细的信息。了解漏洞及其对应用程序的影响,从而最大程度地减少审阅者使用静态分析工具的可能性,并最大程度地提高我们检测静态分析工具使用情况的能力。虽然不能保证开发人员手动完成审阅,但我们认为所有漏洞报告均已充分且准确地完成,这是经过手动代码审查的结果,因此我们将其包括在我们的结果中。

安全专家与Web开发人员:我们借用了多名审阅者,其中一些专门研究安全性,而其他人则纯粹是We b开发人员。这样能通过不同的视角对安全漏洞有一个直观的了解。

代码审查工具里面提供的检查项目包括:系统所用开源框架、源代码设计、错误处理不当、资源滥用、API滥用、后门代码发现、应用代码关注等。

主要的关注要素包括:跨站脚本漏洞、跨站请求伪装漏洞、SQL注入漏洞、命令执行漏洞、日志伪造漏洞、参数篡改、密码明文存储、配置文件缺陷、路径操作错误、资源管理、不安全的Ajax调用、系统信息泄露、调试程序残留、第三方控件漏洞、文件上传漏洞、远程命令执行、远程代码执行、越权下载、授权绕过漏洞等方面。

以PHP为例,整理了一些危险函数(见表1),提供给自动化审计工具对代码进行扫描,提供后续结果分析。

表1 危险函数Tab.1 Hazard Function

4.3 常用工具列表

(1)自动化扫描工具:AWVS、OWASPZAP、Burpsuite等;(2)端口扫描、服务检测:Nmap、THC-Amap等;(3)密码、口令破解:Johntheripper、HASHCAT、Cain等;(4)漏洞利用工具:MetasploitFramework等;(5)应用缺陷分析工具:Burpsuite、Sqlmap等。

4.4 效果分析

为了了解开发人员的代码审查并提供结果,我们首先必须对提交的每个漏洞报告进行分类。我们将每个漏洞报告归为以下四类之一:有效漏洞,无效漏洞,安全隐患或超出范围。

有效漏洞对应于Web应用程序中的可利用漏洞。如果开发人员发现了我们所知道的漏洞之一,或者她利用所报告的漏洞的步骤有效,则将其分类为有效。

无效漏洞是一种报告,该报告将某些代码指定为实际上容易受到攻击的代码,我们通过尝试使用开发人员提供的步骤来利用该应用程序,以及在源代码中,当计算虚假报告的漏洞数量时,每个无效漏洞都会计算在哪,有效和无效漏洞都包含在报告的总漏洞总数中[4]。

安全隐患是指漏洞类别描述的报告可能是安全隐患,但不是可利用的漏洞或不是特定于此Web应用程序的;例如,任何有关拒绝服务攻击或密码选择不安全之类。

代码审计助手漏洞检测率极高,包括水平越权、垂直越权等标准We b应用安全性测试无法检测的逻辑漏洞,误报率几乎为0;漏洞详情直接定位请求、数据流、代码片段,修复漏洞更容易;采用Passive 插桩技术,无需重放请求,不会形成脏数据,可覆盖加密、防重放、签名等任意场景;近实时检测漏洞,漏洞检测随着应用程序运行实时进行;误报较少、无人工。

5 结语

我们的结果表明,多年的经验和教育对预测受试者完成代码审阅的程度没有帮助,我们还发现受试者对他们执行情况的看法与报告的有效程度无关。

在我们的样本中,有20%的审阅者没有发现真正的漏洞,也没有开发人员在七个已知漏洞中发现超过五个。

事实证明,没有任何自我报告的指标可用于预测审阅者的有效性,这是一个尚待解决的问题,那就是选择没有经验的开发真作为审阅者的最佳方法,评估方法取决于他们在先前分配的任务上的表现。

研究这些结果是否适用于其他人群,并评估我们的筛查测试的表现是否与审阅者的有效性相关,这将是很有趣的。回顾其他技术,例如自动渗透测试工具,我们将其作为未解决的问题留待以后的工作。

代码审计助手支持扫描工具进行便捷式管理、优化扫描结果、输出统一的漏洞描述和修复建议,方便用户对比分析,解决各平台输出报告混杂、耗费整理时间等问题,减少代码审核的人力、时间投入。

猜你喜欢

插桩源代码开发人员
人工智能下复杂软件源代码缺陷精准校正
基于TXL的源代码插桩技术研究
Semtech发布LoRa Basics 以加速物联网应用
基于性能分析的自适应插桩框架
软件源代码非公知性司法鉴定方法探析
基于记录重播的嵌入式系统死锁检测方法
揭秘龙湖产品“源代码”
后悔了?教你隐藏开发人员选项
基于顺序块的嵌入式白盒测试插桩技术研究
三星SMI扩展Java论坛 开发人员可用母语