摘要:如何做好安全测试,我们重点从应用程序安全测试AST、软件组成分析SCA和渗透测试三个方面来看一下。
本文分享自华为云社区《DevSecOps研发安全实践——测试篇》,作者:华为云PaaS小助手 。
前言
随着DevOps的发展,DevOps大幅提升了企业应用迭代的速度。但同时,安全如果不能跟上步伐,不仅会抵消DevOps变革带来的提升,拖慢企业数字化转型进程,还会导致漏洞与风险不约而至。所以安全能力在全球范围内受到的重视越来越高,软件开发内生的安全性成为评价企业DevOps成熟度水平的重要指标。2012年,Gartner提出了DevSecOps的理念,将安全防护流程有机地融入传统的 DevOps 流程中,为研发安全提供强有力保证,安全工具支撑研发阶段安全要求落地。
安全测试的重要性
软件测试是软件开发生命周期必不可少的一环,是重要的组成部分。测试有多种形式,按照测试类型,可以分为界面类测试、功能测试、性能测试、文档测试等。传统的功能测试和非功能测试能够通过某种形式隐式发现程序中的某些漏洞,如密码格式验证,但是这些测试并不是专门寻找安全缺陷的,也不够全面,无法保证应用程序或服务已经通过了全面的安全漏洞测试。安全测试可以测试软件在遭到没有授权的内部或者外部用户的攻击/恶意破坏时如何进行处理,能够保证软件和数据的安全。
在Forrester 2020年发布的调查报告统计《 The State Of Application Security, 2020》中显示,在 480家全球企业已经确认的外部攻击中,针对Web应用程序是位于首位,占比39%,攻击 Web 应用程序主要指基于程序的 SQL 注入、跨站脚本或者远程文件包含攻击。针对软件漏洞攻击占比30%,主要指对于安全漏洞的利用攻击。
安全测试是 DevSecOps 实践的关键部分,软件程序经过各种方法的测试以保证质量。安全测试不仅应涉及软件程序,还应关注端到端管道、实时生产系统、软件基础设施、数据库以及中间件,以降低任一环节的安全攻击风险。安全测试是一个专业领域,拥有自己的一套工具和实践,旨在暴露这些漏洞。
如何做好安全测试
如何做好安全测试,我们重点从应用程序安全测试AST、软件组成分析SCA和渗透测试三个方面来看一下。
应用程序安全测试AST
在前面的攻击对象统计数据中可见,应用程序仍然是主要的攻击对象,应用程序是客户和核心业务功能之间的网关。客户使用应用程序访问企业提供的服务或购买产品,因此它为企业及其客户提供了最大的安全风险。同时随着全球疫情的存在,远程办公形式的兴起,使得企业对应用程序的依赖更强,所以应用程序的安全至关重要,在安全测试中,应用程序安全测试也是首当其冲,目前业界常用的技术主要分为静态应用程序安全测试SAST、动态应用程序安全测试DAST、交互式应用程序安全测试IAST三类。
静态应用程序安全测试SAST
静态应用程序安全测试(Static Application Security Testing),是通过检查应用程序的源代码来发现程序代码存在安全漏洞的测试方法。有些工具也会依赖于编译过程甚至是二进制文件,通过一些抽象语法树、控制流分析及污点追踪等技术手段来提升检测覆盖度和准确度。SAST是一种白盒测试方式,常见的工具有Coverity、Checkmarx、FindBugs、 CodeQL和ShiftLeft inspect。
SAST工具有出色的代码覆盖率,能够发现代码中更多更全的漏洞类型,使用SAST 可以低成本防御隐藏在源代码中的一些常见安全缺陷,公开的漏洞,如OWASP TOP10。同时问题点可以定位到具体代码行便于修复。但是使用SAST,难逃误报率这个问题,误报会降低工具的实用性,工程师可能需要花费更多的时间来清除误报而不是漏洞,好在大多数SAST 工具都为工程师提供了配置扫描仪以减少报告的误报数量的方法。
动态应用程序安全测试DAST
动态应用程序安全测试(Dynamic Application Security Testing),是在不需要系统源码的情况下,通过模拟攻击者的行为构造特定的输入给到应用程序,分析应用程序的行为和反应,从而确定该应用是否存在某些类型的安全漏洞。常见的工具如针对Web应用商业和开源的AWVS,还有一些针对电脑或终端AppScan等。
DAST是从攻击者视角出发,复制了真实的攻击,如果成功,证明了应用程序中漏洞的可利用性,因此误报的数量远低于SAST,准确性非常高,工程师可以专注于修复真正的漏洞,而不是花时间验证它们。DAST是非常可靠的漏洞检测技术,可以发现大量的真实安全漏洞。DAST采用攻击特征库来做漏洞发现与验证,能发现大部分的高风险问题,因此是业界Web安全测试使用非常普遍的一种安全测试方案。
DAST是一种黑盒测试形式,在DAST测试过程中,主要以功能为主,不需要具备编程能力,不用了解应用程序的内部逻辑结构,模糊测试是DAST测试中常用的一种方式,通过故意向应用程序引入不正确格式或随机数据诱发程序故障。模糊测试策略的制定,以应用程序的预期用途,以及应用程序的功能和设计规范为基础。
DAST除了可以扫描应用程序本身之外,还可以扫描发现第三方开源组件、第三方框架的漏洞。许多DAST工具可以跨多种语言和框架工作,与 SAST工具相比,可以提供更大的应用程序覆盖范围。但这需要付出代价:当发现漏洞时,通常很难准确指出在源代码中应用修复的位置。
配置 DAST 需要高级安全知识,才能根据目标应用程序的潜在攻击面正确设置测试。工程师必须能够配置动态测试工具以获得最准确的结果。他们还需要在运行时将其集成到应用程序中,它更适合 CI/CD 流水线,在其中可以执行运行时分析。Stuart Gunter 高度评价 DAST 作为自动化测试工具。如果使用得当,其低误报输出和接近手动渗透测试的动作可以产生出色的结果。
交互式应用程序安全测试IAST
交互式应用程序安全测试(Interactive Application Security Testing),由Gartner公司在2012年提出,是一种运行时检测工具,依赖于应用程序在被监控时的活动,可监控流经应用程序的流量,以确定底层源代码是否容易被利用。IAST监控正在运行的应用程序的数据流以确定是否存在保护数据的安全控制。例如,它会检测一个字符串是否通过了验证方法,或者密码是否在源头加密并保持加密,直到它退出正在运行的应用程序。因为它是在运行时观察数据的行为,而不是对单个组件如何在本地管理数据进行假设,所以IAST 很少误报。同时IAST 工具能够读取和理解底层源代码,因此它们可以定位和报告程序员应该关注的代码行,以修复扫描识别出的漏洞。
尽管 IAST 使用起来简单,但它也有与 DAST 相同的限制--它需要一个正在运行的应用程序来执行测试,这意味着最好将它集成到 CI/CD流。并且如果在测试期间执行的功能测试未覆盖100%的底层源代码,则安全测试代码覆盖率也将低于100%。
自动化应用程序安全测试的三种方法:静态、动态和交互,这些都在成功的 DevSecOps 框架中发挥作用,决定将哪些集成到价值流中取决于许多因素。 SAST最容易在源代码中找到的缺陷-- 但由于缺乏上下文,它会产生大量的误报,用 DAST 或 IAST(或两者)补充 SAST 是不错的方法。
软件组成分析SCA
应用程序成为外部攻击的主要对象,其中的一个原因就是开源软件的使用不断增多,为了加快开发速度,开发者会大量复用成熟的组件、库等代码,组织机构对开源和第三方组件的使用,从而使更多的API 暴露在外。组织的代码库包含不是由开发人员编写的代码。不知道它是否经过安全测试,或者它是否包含恶意代码或恶意软件。更糟糕的是,许多这些开源库依赖于其他开源库来提供更多功能。这意味着在组织的应用程序中存在 OSS 的依赖链。根据 Synopsys 的说法,开源占应用程序代码库的 70%,这意味着组织的大多数应用程序不是由组织的工程师编写的,面临的挑战在于了解这些依赖项是否安全,如果不安全,如何确保它们安全。
尽管应用程序安全测试可以识别依赖代码中的一些漏洞,但不太可能识别出与它们相关的所有问题。已知漏洞可能会记录在通用漏洞数据库中,一些开源提供商也维护自己的漏洞数据库。必须根据这些数据库检查应用程序依赖性并解决与易受攻击的组件相关的任何风险。有许多软件组合分析工具可用于执行此任务,每个工具都有自己的优点和缺点。在基本级别,它们都提供了漏洞的详细信息和降低风险的建议,例如升级到组件的安全版本或完全使用不同的组件。
通常安全测试阶段进行二次SCA,首次则在软件开发的早期阶段。因为在开发过程中更新第三方库比在生产环境中更新成本更低,在生产环境中,修复成本更高。
渗透测试
上面讲到的AST应用程序测试和SCA软件组件分析,在研发安全时间过程中都是以自动化形式存在,尽管价值流中有很多层自动化测试,但它不可能 100% 安全,作为自动化测试的有效补充,手工安全测试不必可少,在一些受监管的行业部门中,必须由经认可的第三方对组织的在线产品或服务进行渗透测试。通常,这些渗透测试是在预生产环境中进行的,它们也可以在实时系统上进行。
国家网络安全中心(NCSC)将渗透测试定义为“对计算机网络或系统的授权测试,旨在寻找安全漏洞”。渗透测试是一种有效的测试方法,是安全人员模拟黑客进入系统的测试方法,他对执行测试的人要求很高,能力强的测试者能够发现有价值的安全性漏洞,而不具备很强攻击能力的测试者就无法有效发现系统中的安全性漏洞,因此很难被大规模使用。渗透测试的过程不具有可重复的特点(主要依赖于测试者的经验,类似调试),所以脚本化、自动化的渗透测试想法不可行,完全自动化的工具通常只能发现那些可以被用标准方式发现的特定安全漏洞,如简单的SQL注入。在渗透测试期间,授权测试人员尝试使用攻击者使用的相同技术和工具,利用公开已知的漏洞和常见的错误配置,针对系统架构、应用程序、网络层面漏洞进行渗透测试,根据行业特点与业务场景实施渗透测试,范围应覆盖重要安全风险点与重要业务系统,有明确的渗透测试计划与管理机制。
在DevOps 中,一天可能会有多次发布。因此,在系统部署之前运行手动测试是不可行的。相反,手动渗透测试是作为年度审查的一部分进行的,以满足监管要求,并作为一个验证过程来突出自动化安全测试过程中的弱点。
华为云安全开发实践
华为云主要从规范、方法和工具三个方面保证验证阶段的安全。
• 规范上制定各语言安全编码规范、各测试设计规范、指南和测试指导;安全编译选项技术规范、Fuzz安全测试指导;
• 方法上,遵循安全编译选项、静态分析、SCA ,TMBT安全测试设计、Web安全测试技术、通用组件安全测试、虚拟化安全测试方法、IoT安全测试、病毒扫描、Fuzz;
• 工具上,华为云将客户安全需求和业界标准作为检查项,研发了自己专有的工具平台,SecSolar安全编码检查服务、SecGuard安全测试服务、SecFuzz,SecureCat 可以对业界主流的 OS 和 DB 的安全配置进行检查。
华为云的所有云服务在发布前都需要经过多轮的安全测试。在Alpha 阶段会进行认证、鉴权、 会话安全等微服务级功能和接口安全测试;Beta 阶段通过对 API 和协议的 fuzzing 测试验证服务集成;Gamma 阶段进行数据库安全等安全专项测试。在测试用例上,会覆盖安全设计阶段识别出的安全需求和攻击者视角的渗透测试用例等。
后记
在安全测试方面,它与传统的手动测试方法有所不同,尽可能采用自动化是其核心要求。通过持续集成流水线中的安全测试自动化,DevOps工程师可以以最小的安全风险快速交付功能。来自自动化测试的反馈循环允许工程师在特性出现在生产中之前识别和修复它们。当与有效的教育政策和良好的设计原则相结合时,安全测试自动化通过这些反馈循环增强了持续的学习,并提供了一种环境,在这种环境中,安全是软件交付的核心,而不会对流程和客户结果产生负面影响。
参考附录
1.《华为云安全白皮书》.华为技术有限公司
2.《研发运营安全白皮书》. 云计算开源产业联盟.
3.《DevSecOps领导者指南》格伦·威尔逊(GLENN WILSON)
4. 每天扫描超300亿行 代码,DevSecOps在华为的落地与实践_DevOps
5. Forrester’s State Of Application Security Report, 2021: Key Takeaways