审校 | 孙淑娟
软件架构师Bob和安全开发工程师Alice是一家软件开发初创公司的成员。以下是他们之间关于开发一套新的微服务的对话。
Bob说:“你听到通知了吗?客户交易已经敲定。我们可以开始为他们在云平台上使用的金融服务开发分析应用程序。”
Alice:“太棒了!那么应该使用哪种编程语言构建应用程序?”
Bob:“还没有确定。它可以基于任何一种软件编程语言,但更重要的是它必须是安全的。我们所有的系统及其应用程序都应该打上最新的安全补丁,并且软件版本应该始终以正确的配置运行。
我会通过电子邮件给你发送详细的业务用例和技术要求。简而言之,它将是持续集成和交付的快速发展。那么你建议我们使用什么工具进行端到端安全扫描?”
Alice说:“当然,我会向你发送一份工具清单,这些工具将使我们能够在生产部署之前检测和修复漏洞。我认为需要有一种有前途的方法来扫描和消除代码或应用程序可能带来的网络安全风险。”
Bob说:“太好了,我们更喜欢采用开源扫描工具,但如果有的话,你可以列出对流行的第三方专有工具的见解。”
Alice开始探索关于代码扫描主题的各种现有资源。根据Bob提供的需求规范,她考虑了所有关键领域,例如代码的静态分析、面向互联网的用户界面(UI)和API端点的动态分析以及依赖包的漏洞扫描。
而几天过去了,她仍然感到困惑,难以做出决定,因为得到的大部分信息都是基于用户角色和软件可用性规范而不是以代码为中心的,虽然这从开发人员角度来看是有用的,并且可以适应需求。
以下将深入了解各个安全扫描工具内容(这足以帮助Alice做出决定)。
1.类别
以下是各种安全扫描工具的类别:
(1)SAST(静态应用程序安全测试),又名静态扫描
- 用于分析应用程序源代码以识别漏洞来源的白盒测试过程;通常在应用程序开发生命周期的编码/质量保证阶段实施,从而能够早期识别和缓解代码中的漏洞。
- 确保应用程序从设计阶段就以强大且安全的方式构建,并在投入生产之前符合安全编码标准。
- 提供SAST的一些工具包括SonarQube、App Scan、IBM Code Risk Analyzer、Fortify Static Code Analyzer、WhiteSource等。
- 使用SAST工具之前,常用的评估标准是:
- 支持所需的编程语言。
- 误码率。
- 漏洞检测精度。
- 详细程度。
- 代码安全分析结果的清晰性。
(2)SCA(软件组合分析),又名依赖项扫描
- 跟踪代码库中的开源组件以检测漏洞、潜在的安全和许可证合规性威胁,使团队能够通过避免与IP、声誉和费用方面的冲突及早进行补救。
- 当静态扫描检测内部开发的专有源代码中的漏洞时,软件组合分析(SCA)执行依赖扫描以识别开源依赖中的漏洞、发现已弃用的依赖项,并评估数字签名。它几乎没有误报,扫描速度非常快。不需要访问源代码,可以在软件开发生命周期(SDLC)的任何阶段进行集成,甚至在后期部署。
- 一些提供SCA/依赖扫描的工具是White Source Software、GitLab、GitHub、Snyk和Jfrog Xray。
- 使用SCA工具之前常用的评估标准是:
- 开源组件及其漏洞的知识库。
- 支持各种编程语言。
- 扫描速度。
- 易于使用报告的分析结果。
- 开发生命周期各个阶段的集成能力。
(3)DAST(动态应用程序安全测试),又名动态扫描/Web应用程序扫描
- 这是一个黑盒测试过程,用于通过渗透测试识别应用程序Web端点的漏洞,并且无法访问其源代码,通常在构建应用程序的质量保证(QA)和预生产阶段执行。它探索应用程序运行状态,并检查其对由该工具进行的模拟攻击的响应,这将有助于确定应用程序是否易受攻击,以及是否可能面临真正的恶意攻击的风险。
- 适合检测身份验证和配置问题;独立于应用程序使用的语言和平台。
- 一些提供动态扫描的工具是OWASP ZAP、App Scan、Netsparker和Detectify。
- 使用DAST工具之前常用的评估标准是:
- 支持API测试。
- 认证扫描。
- DevSecOps(作为CI/CD管道的一部分完全自动化运行的能力)。
(4)IAST(交互式应用安全测试)
- IAST是一种结合了SAST和DAST优点的混合测试方法。IAST通过在运行时使用代理和传感器检测应用程序来分析漏洞。与DAST不同,IAST可以查看整个代码库,并可以指向代码的确切易受攻击位置。此外,与SAST不同,它能够捕获错误配置等运行时问题,并且误报率最低。
- 提供IAST的一些工具是Veracode和Netsparker。
- 使用IAST工具之前常用的评估标准是:
- 支持的技术。
- 易于报告和分析的详细程度。
- 执行速度。
- 准确度极低/无误报的结果。
(5)数据库安全扫描
- 通过检查数据库的内部和外部配置(如身份验证、机密性、完整性和可用性)来识别数据库应用程序中的漏洞的过程。
- 其中一些工具是Scuba、Zenmap和SQLRecon。
2.工具
(1)WhiteSource Scan
WhiteSource具有SAST和SCA功能来执行代码的安全扫描。SAST能力可用于检测源代码中的漏洞,SCA可用于检测开源依赖项中的漏洞。WhiteSource帮助开发人员修复漏洞。它与Jenkins、Bamboo、AzureDevOps、GIT和TFS集成。
(2)SonarQube
SonarQube是一个用于检查代码质量的开源平台,并与GitHub、BitBucket、GitLab、Maven、Gradle、Travis、Jenkins、Bamboo和Azure DevOps集成。SonarQube可以测量关键指标,包括错误、代码缺陷、安全漏洞和重复代码。SonarQube支持创建SonarQube插件,这有助于自定义代码规则。
(3)IBM CRA
Code Risk Analyzer获取所有基于Git的代码、配置和部署工件,构建依赖关系图,并运行合规性控制检查管道。它会生成一个物料清单(BOM)文件,其中列出了所有第三方操作系统包和应用程序包的依赖关系。它会发现物料清单(BOM)文件中列出的包中的漏洞。Code Risk Analyzer仅支持IBM Cloud®Continuous Delivery托管的github.com存储库、Git存储库和问题跟踪存储库。它可以启用CRA来扫描拉取请求和合并。
(4)HCL AppScan
HCL AppScan是一个全面的、基于云的应用程序安全解决方案,与构建环境、DevOps工具和IDE集成。AppScanon Cloud提供一整套测试技术(SAST、DAST、IAST和开源)以提供最广泛的覆盖范围。它可以使用AppScan UI设置误报。
(5)Gosec
Gosec是一个安全工具,可以对Golang项目的安全漏洞进行静态代码分析。Gosec通过将所有源代码加载到AST(抽象语法树)中来工作,并应用一组内置规则来查找常见错误,例如代码中的秘密。它允许用//#nosecG101G102识别误报。
(6)OWASP ZAP
Zed Attack Proxy(ZAP)是一种免费的、开源的动态扫描工具,由开放式Web应用程序安全项目(OWASP)维护。ZAP专为Web应用程序的渗透测试而设计。它设置警报过滤器以设置误报。
3.工具比较
工具名称 | 用途 | 支持的语言 | 忽略列表 | 优点 | 缺点 |
开源库扫描工具。漏洞通过MITRE和NVD验证 | Java、C#、C++、Golang、Node.js、Ruby、.Net、Dockerfiles、Javascript 等 | Whitesource的配置文件以包含忽略列表 | 漏洞影响的细节很清楚,可用于所有依赖项的许可证类型分类与 Eclipse、VsCode、IntelliJ 等集成,问题在存储库中修复后会自动关闭 | 图像扫描(操作系统包)和源代码扫描不包括在内。 | |
源代码静态扫描和动态扫描工具 | Android、Kotlin、Java、c/c++、Golang、Groovy、JS、Python、PHP、Scala、Ruby、TypeScript等 | 在UI中标记误报 | 一款涵盖静态代码和动态代码扫描的工具。 扫描Dockerfile问题误报太多 | 误报太多。 误报设置适用于行号,因此每次行号更改时都必须重新设置误报。 主要关注 SQL 注入和 CSRF 相关漏洞, 不是广泛的源代码扫描。 | |
依赖扫描。 不是源代码扫描。 使用 security.snyk.io 作为 CVE 数据库 | Java, Node.js, Python, Golang, Docker files, Kubernetes, Terraform | .cra/.fileignore(可以排除开发依赖项(--excludedev)) | 执行基本映像(操作系统包)扫描。 可以集成到管道中。 | 自动创建的问题没有很多细节(管道有细节但没有链接到问题)。 修复后的问题不会自动关闭。 运行管道时可能出现重复,如果Dockerfile需要传递ARG,需要确保将ARG设置为环境变量。还可以使用Docker BUILDFLAG环境变量。 仅支持IBM Cloud® Continuous Delivery托管的Github.com存储库、Git存储库和问题跟踪存储库。 | |
开源渗透测试工具 | Java, Python, Node.js, .NET, PHP或者Go | 可以在 UI 中设置误报。 使用配置文件忽略警报。 | 稳定的渗透测试/动态扫描解决方案。 自动更新和拉取请求分析。 提供四种不同的扫描模式。 •安全的 •受保护 •标准 •攻击 | 需要更好的报告格式。 主动扫描很危险,根据应用程序可能会创建/修改/删除数据。 | |
源代码质量和安全扫描工具。漏洞通过MITRE和NVD验证 | Java(包括 Android)、C#、C、C++、JavaScript、TypeScript、Python、Go、Swift、COBOL、Apex、PHP、Kotlin、Ruby、Scala 等 | 没有Sonar可以用来排除扫描代码中的一行 | 对Java、C、C++等语言进行广泛的源代码扫描,用于在代码中检测: •错误 •代码缺陷 •安全漏洞 •重复代码 提供有关如何修复代码的详细信息 根据OWASPTop10和CWETop25标准跟踪项目安全性。 | 商业版不支持GitHub集成。 企业版价格高昂。 不扫描依赖项。这需要将插件集成到SonarQube。 定义政策/规则是一项挑战。 测试覆盖报告需要第三方覆盖工具集成。 | |
Gosec | GoLang的代码分析工具。漏洞由NVD验证 | GoLang | //#nosec G101 | 可以自定义Gosec以排除或包含某些测试。 gosec-track-suppressions可用于查看所有抑制。 Gosec将在Go模块打开时自动获取正在分析的代码的依赖关系。 支持多种输出格式,如text、json、yaml、csv、sonarqube、JUnit XML、html和golint。 | 映射CWE而不是CVE报告每个问题。 |
结论
尽管Alice之前没有操作安全扫描工具的经验,但她不想尝试每种工具,因为它们会为原型新软件应用程序环境带来集成问题的成本。
安全扫描工具的选择是团队必须做出的重要决定。调查结果将进一步导致关键决策,例如在安全扫描失败的情况下阻止代码交付,或在动态代码扫描的情况下,记录可审计的可追溯过程以确认测试的安全接受(即接受或忽略错误正数)。
而了解这些工具比较的细节之后,Alice将这些工具推荐给Bob,而这些工具很快就能入围。
对于Bob来说,显著避免使用不良的扫描工具比找到最好的工具更重要。Alice和Bob为此都很高兴,因为可以节省更多的时间,让他们专注于实际业务需求开发产品。
原文Take Control of Your Application Security,作者:Josephine E. Justin,Deepika Kothamasu,Swathi Pemmaraju