用OSSIndex做依赖安全检查

1. 依赖安全问题

据说,应用程序里80%左右的源代码不是开发团队自己写的,而是来自于应用程序所使用的第三方组件或者库(为描述方便,下文统称为“依赖”,即Dependency)。这些不是由开发团队开发出来的,并且占比达到80%的依赖,它们如果存在安全漏洞,则同样可能导致整个应用程序受到影响。

Screen Shot 2020-08-11 at 10.37.55 AM.png

有很多因为依赖存在严重安全漏洞而引发安全事件的新闻,比如说,2020年2月爆出的Tomcat CVE-2020-1938漏洞,使得攻击者可以直接下载Tomcat webapp目录下的所有内容,意味着可能下载到war包并且反编译出应用程序源代码,以及获取到配置文件中的未加密的密钥。更多详情请移步《Tomcat CVE-2020-1938 漏洞之细思极恐》这篇文章

作为开发团队,除了要确保自己写出来的代码的安全质量,也需要时刻关注这些猪队友依赖的安全性,主动排查它们是否有安全漏洞,并及时进行处理。

2. 后端依赖安全检查之痛

前端开发人员很幸运,NPM从6.0版本之后就自带了Audit命令,对依赖进行安全检查那简直是既简单又快捷,给Audit命令加个参数还能自动修复存在安全问题的依赖。这项安全检查能力不仅完全免费,NPM还干脆直接把它和NPM Install命令默认关联了起来,于是开发人员每次运行NPM Install命令都能得知当前依赖安全问题的汇总信息。

这可羡煞后端开发人员,每当他们回头看着自己手里的依赖安全检查工具时,一股恨铁不成钢的感觉总会涌上心头。

OWASP DependencyCheck是一款知名的开源免费的依赖安全检查工具,很多团队都在用它。我们以这个工具为例进行分析。这个工具是很有价值的,能够让后端开发人员了解应用中的依赖的安全问题,不过它在使用过程中确实存在着一些痛点。

首先是误报问题。 OWASP DependencyCheck对依赖的识别不够准确,它在识别应用程序所使用的依赖到底是哪一个应用、组件或者库的时候(也就是从依赖申明中的GroupArtifactVersion信息识别出这是哪个CPE的时候),始终有识别错误的情况。而一错皆错,CPE识别错误自然就会导致误报和漏报。

其次是扫描速度慢。 NPM Audit可以在几秒钟内输出检查结果,而OWASP DependencyCheck的速度可慢多了。第一次进行安全检查的时候它会先从网上全量下载漏洞数据库,这就有点耗时,如果网络条件不太好的话可能需要几十分钟甚至更久的时间。虽然后续运行不再全量下载漏洞数据库,但一次扫描还是需要几分钟时间。当然了,这两个工具的实现原理、前后端应用程序各自的依赖的情况也不尽相同,直接拿它们两比扫描速度有点不太公平,但不可否认的是,OWASP DependencyCheck的速度确实要慢一些。

至于商业的依赖安全扫描工具,可能它们解决了识别精准度以及扫描速度问题,不过费用问题不可忽视,疫情当下很多公司不得不缩减预算,过高的费用可能让中小型开发团队或者个人开发者望而却步。

3. 用OSSIndex对后端依赖做安全检查

OSSIndex的出现对于后端开发人员而言绝对是个好消息。同样是对依赖做安全检查,OSSIndex提供的扫描能力或者说使用体验要好很多。

首先,误报的问题算是完全解决了。如果你用OSSIndex gradle plugin对Java应用做依赖安全检查,你会发现报告出来的安全问题和依赖都能准确的对应上。从此,你再也不必花大量时间来检查OWASP DependencyCheck扫描报告中的问题到底是不是误报了。

其次,后端应用的安全检查速度大幅提升,达到了秒级输出安全结果的程度,终于可以媲美NPM Audit的速度。如此一来,后端依赖安全检查终于可以加入到CI/CD日常构建流水线里,在每次代码提交的时候都运行,而不必像以前那样,因为担心运行速度慢而单独为它创建一个构建流水线。

此外,OSSIndex提供多种构建工具,支持多种开发语言,而且还免费。

640.png

至于OSSIndex的用法,那简直太简单了,总共就三步。以OSSIndex gradle plugin为例,你只需在build.gradle文件里加上下面这段代码:

plugins { id 'org.sonatype.gradle.plugins.scan' version '1.2.0' }

然后在命令行里输入下面这个命令:

./gradlew ossIndexAudit

扫描结果就能直接打印输出在命令行里:

640 (1).png

简单,轻松,愉快,真香。

4. 小遗憾

世间没有完美的工具,OSSIndex也有它自己的问题。比如说,gradle plugin现在的功能还不够成熟和完善,至少对于输出扫描结果这件事而言,体验还不够友好。

具体来讲,当你用OSSIndex gradle plugin的时候,它暂时还不能仅显示存在已知安全漏洞的依赖,而是会把应用中的所有依赖全部打印出来。你需要人工再去做一次筛选。虽然这不是啥难事儿,但这些使用体验上的小瑕疵还是有点让人难受。

不过瑕不掩瑜,在误报和速度这两个核心问题面前,用户体验上的小瑕疵根本不是事儿。看完这篇文章,要不你也赶紧试试用OSSIndex做依赖安全检查?

All rights reserved
Except where otherwise noted, content on this page is copyrighted.