靠单个产品修复所有的应用安全漏洞几乎不可能。开发安全需要在开发各个阶段实施不同的防御措施,层层递进地去实现。
开发安全类工具一般包括:
- SAST - 静态应用安全测试
- DAST - 动态应用安全测试
- IAST - 交互式应用安全测试
- RASP - 运行时应用自我保护
- 依赖项安全扫描
- Secrets Detection(机密信息检测)
尽早修复漏洞确实更加容易,成本也更低,但在开发早期阶段发现所有漏洞也不太可能。安全应贯穿软件开发生命周期的整个过程。
纵轴:修复成本;横轴:软件开发生命周期
SAST
静态应用安全测试,也称为“白盒测试”,通过扫描源代码发现代码中的已知漏洞,是最常见也是最早出现的自动化应用安全测试。市场上的SAST工具非常多。确定使用某个工具前,需要评估工具的支持和维护情况以及是否适配自身的技术栈。这里推荐一些免费的SAST工具。
1. NodeJsScan
NodeJs Scan有一个命令行接口,可轻松与DevSecOps CI/CD管道集成,并以JSON格式生成扫描结果。每种语言都有一个配置文件,可以根据自定义检索进行修改。文件总览和整个代码库都可以通过统计数据和饼图做到可视化。它还可以检测缓冲区溢出漏洞和针对Java的十大OWASP漏洞。
2. SonarQube
SonarQube被誉为是“最好用的免费自动化代码审计工具之一”,具备上千种自动化静态代码分析规则,且支持27种开发语言,能够很好地覆盖整个开发项目的发展。
DAST
DAST,动态应用安全测试,也被称为“黑盒测试”,不像SAST那样从源代码中发现漏洞,而是在应用运行时,通过注入故障的方式进行安全测试。DAST可以发现SQL注入、跨站脚本等常见的安全漏洞,识别应用程序运行时的安全风险,如身份验证和服务器配置问题,以及只有在已知用户登录时才有可能发现的安全问题。
3. OWASP ZAP
OWASP ZAP是一个功能非常全面的开源DAST工具,不但能够自动进行漏扫,还能协助测试人员完成web应用的渗透测试。ZAP的漏洞库也非常丰富。
IAST
IAST,交互式应用安全测试,有时也称为“灰盒测试”,是一种综合了SAST和DAST的检测技术,一般会在测试环境中以agent的形式(例如针对Java虚拟机或.NET CLR的插桩技术)监测运营与攻击情况,从而发现风险点。
4. Contrast Security - Community
Contrast也是一个声称“开发者至上”的产品,能更深入地发现漏洞。应用程序运行时的上下文信息对于其它的SAST和DAST工具完全是盲区,如控制器、业务逻辑、数据层、视图,用户库,开源组件和应用程序服务器。
RASP
RASP,运行时应用程序自我保护,一般部署在某个服务器上,当应用运行时即开始工作,能够实时发现目标应用中的攻击活动。应用程序一旦开始运行,RASP就会分析应用的行为和上下文信息,防止恶意输入或恶意行为的发生。通过对应用行为的持续监控,不用人为干预就可以发现攻击活动并且做到及时修复。
5. Sqreen
Sqreen的RASP可通过请求的完整执行上下文信息来发现应用上线后的漏洞利用和攻击活动,覆盖OWASP十大安全漏洞,如SQL注入、XSS和SSRF等。它的强大之处在于能够根据请求的执行逻辑进行攻击拦截,比其它解决方案的误报率低得多。Sqreen还能自动适配不同的应用程序技术栈,无需重新部署或配置。
依赖项安全扫描
依赖项安全扫描(Dependency Scanning)能够在应用程序开发和测试时检测依赖项的安全漏洞,例如正在使用的外部(开源)依赖库是否存在风险。
6. Snyk
据说Snyk也是一个开发者之上的企业,为开发人员提供一些开源的解决方案。Snyk自带很多比较好的功能,比如能在IDE中检测漏洞,扫描本地git测试存储库中的项目等等。Snyk有一个能够防止新漏洞通过构建过程进入开发环境的安全网关,还有一个用于测试运行环境中是否存在暴露风险点的生产环境。
7. WhiteSource Bolt for GitHub
Whitesource和Snyk一样有一些面向开发人员的免费工具。WhiteSource Bolt for GitHub是一款免费的应用,能够持续扫描自有和公开的存储库,检测开源组件中的漏洞并提供修复建议,支持200多种编程语言,能够像美国国家安全漏洞库NVD一样持续跟踪多个开源漏洞库。
Secrets Detection(机密信息检测)
API密钥、数据库凭证和安全证书等是一个组织的机密信息(secrets),拿到这些东西就能访问很多敏感系统。因此需要secrets detection这样的技术加以保护。secrets detection可扫描源代码、日志等文件,发现其中隐藏的机密。这是一项技术要求较高的专业服务,因为大多数机密都是以随机字符串的形式存储,而且很多随机字符串都不是机密信息,因此需要通过分类算法,才能以较高的准确度检测到机密信息。
很多人可能会把secrets detection和SAST搞混,因为两者都是扫描源码的技术。但SAST只扫描目标应用的当前版本,而secrets detection检测的是该项目的所有开发版本。像git这样的版本控制系统会对项目的所有变更信息进行跟踪和存储。如果源码的上一个版本含有硬编码的机密信息,却在后面的阶段被删除了,代码审计和SAST工具就无法发现这个问题,遗留在git存储库中容易遭到恶意利用。所以secrets detection成为了一个独立的分类。
8. GitGuardian
GitGuardian可通过扫描开发人员存储库,持续发现机密信息,涵盖300多种不同类型的机密类型,从密钥到数据库连接字符串、SSL证书、用户名和密码,通过复杂的模型匹配等多种算法技术进行检测。GitGuardian可以与GitHub帐户实现集成,几分钟即可完成配置。开发人员可以通过GitGuardian API检测目录、邮件客户端或Slack channel等服务中的机密信息。
总结
眼花缭乱的解决方案容易让人选择困难,一个重要标准就是思考这个工具是否能够适配当前的工作流程。
上述的开源工具都只能提供最基本的保护,实际运营过程中还是需要更多功能更加丰富的商业软件和方案。确保应用的安全是开发人员中最有价值的技能之一,虽然将安全性“左移”看起来是一项艰巨的任务,但在整个开发生命周期中融合安全测试系统肯定是一项非常值得的投资。