摘要:如何做好安全测试,我们重点从应用程序安全测试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

点击关注,第一时间了解华为云新鲜技术~

想要做好软件测试,可以先了解AST、SCA和渗透测试相关推荐

  1. 软件测试用例优秀例子_新手入门:想要做好软件测试,这些理论知识,你得好好掌握...

    对于很多测试新手来说,想要把自己的测试技术练得更精进,扎实自己的理论知识是必不可少的一门功课.下面,我们就一起来复习一下,那些让我们一知半解或者记不全的理论知识吧. 1.什么是软件测试? 最老套但是测 ...

  2. python3库黑客_想知道黑客为什么首先Python吗?看看这些渗透测试工具和库

    前言你知道现在为什么许多黑客都首先选择Python吗,因为快呀,具有许多强大的渗透测试工具和强大的库支持,开发又快又好,优点多多.如果你喜欢漏洞研究,喜欢渗透测试,逆向工程等等,强烈建议学学Pytho ...

  3. 想做好软件测试,需要具备什么能力呢?送你必备的四点能力

    关注我,每天分享软件测试技术干货.面试经验,想要领取测试资料.进入软件测试学习交流群的可以直接私信我哦~~ 和大家聊下想要成为QA需要具备什么能力. 第一点是产品感,什么是产品感呢,产品感是不是真实存 ...

  4. 如何做好软件测试管理工作,如何才能做好软件测试工作

    原标题:如何才能做好软件测试工作 如何做好测试,业内普遍认为测试是技术含量偏低的工作,因为我们理解的测试就是一群鼠标点击者,在电脑前按照文档机械性重复着枯燥的事情,最后写份报告,工作就算完成了. 对于 ...

  5. 做好软件测试需要具备的思维方式

    做好软件测试需要具备的思维方式! 最近部门来了好几位应届毕业生加入团队,我们也大张旗鼓的组织了集中式的培训,其中我需要对关于测试工作进行简介,在培训内容中,我特地整理和回顾了做好软件测试需要具备的思维 ...

  6. 华为7年经验的软件测试总监,给所有想转行学软件测试的朋友几点建议

    对于软件测试的建议,首先不知道大家当前具体情况,是非计算机专业转行的零基础小白还是计算机专业刚入行的新人?当然,不管前提条件怎么样,只要你决心想走上测试的道路,这些前提都不是问题. 那么要想学好软件测 ...

  7. 想要转行软件测试就得先搞清测试工程师的职责是什么?

    一. 测试工程师: 1. 国内定位和发展前景: 测试工程师,软件质量的把关者,工作起点高,发展空间大.我国的软件测试职业还处于一个发展的阶段,所以测试工程师具有较大发展前景. 目前传统的软件行业还是以 ...

  8. 想转行学软件测试要注意哪些问题

    软件测试的快速发展,让很多人都红了眼,大家都想转行学软件测试,那么想转行学软件测试要注意哪些问题呢?大家是否考虑过自己是否合适呢?那么我们来看看下面的介绍吧. 想转行学软件测试要注意哪些问题?据数据显 ...

  9. 一个七年的老测试给想入行软件测试这个行业的二十条建议

    软件测试不是点点点,还有性能测试,自动化测试,安全测试,甚至于AI测试,大数据测试等等,软件测试的前景还是非常好的. 软件测试相对门槛比较低,前期比较容易入门,哪怕不是计算机专业的小白,也能轻松掌握, ...

最新文章

  1. angularJS的controller之间如何正确的通信
  2. WITH AS【原创】
  3. c语言0x00如何不截断_binary 和 varbinary 用法全解
  4. 如何编写java请求_如何避免将Java请求从Java Web服务器发送到自身?
  5. 深入理解C# 静态类与非静态类、静态成员的区别 [转载]
  6. docker 中安装 mongodb
  7. 程序员搞笑对联_程序员春节对联集锦
  8. DB2常用错误代码大全
  9. fedora 14 安装virtualbox
  10. Rainmeter雨滴桌面秀教程
  11. Unity3D学习笔记——物理引擎
  12. NOIP2016普及组复赛——T4魔法阵
  13. 多视几何 003 二次曲线
  14. Dynamics 365 New Feature之Rich Text Editor Control
  15. android怎么开机画面,安卓手机开机画面怎么修改?
  16. RN 调用原生WebPage 解决微信支付Referer问题
  17. 区块链实战(一)实现简单的区块与区块链交易
  18. COSCon'21 人工智能(A)论坛介绍
  19. 酷派D539 APP2SD(扩展内存空间\把应用安装到扩展卡)的方法
  20. c语言画一只小猪佩奇

热门文章

  1. 树莓派4b风扇安装方法_树莓派安装Raspberry Pi OS系统
  2. 数字ic设计——AMBA总线(1)AMBA总线介绍
  3. 【行测】“逻辑推理”聂佳课程笔记——1. 图形推理
  4. [GRE] 填空经典1290题 错题(二)
  5. python中的变量是动态类型的什么意思_Python零基础入门(一):对Python的简单认识...
  6. python入门小程序代码_源码精灵游戏小程序,python入门游戏,点开既玩
  7. element中使用loading,加载中
  8. 程序员心灵鸡汤桌面壁纸1080p 欢迎大家下载,HTML,PHP,node,css,前端
  9. 【基础教程】Python转义字符及用法
  10. .Net主线程扑捉子线程中的异常