使用OWASP Dependency-Check对应用做个安检
俗话说“人怕出名猪怕壮”,当系统小有名气以后就会被一些黑客盯上,三天两头的用各种漏洞扫描工具做渗透,如果不希望某天你负责的系统因为安全问题而出名,那就提前行动起来吧,这就是今天要讲的OWASP Dependency-Check。
图片来源于百度
背景
随着业务的发展,系统的用户逐渐增多,这时就会有一些不速之客找上门来。
俗话说“人怕出名猪怕壮”,当系统小有名气以后就会被一些黑客盯上,三天两头的用各种漏洞扫描工具做渗透,如果不希望某天你负责的系统因为安全问题而出名,那就提前行动起来吧,这就是今天要讲的OWASP Dependency-Check。
何为OWASP Dependency-Check
依赖项检查是一种软件组成分析(SCA)工具,它试图检测项目依赖项中包含的公开披露的漏洞。它通过确定给定依赖项是否存在通用平台枚举(CPE)标识符来完成此操作。如果找到,它将生成一个报告,链接到相关的CVE条目。
翻译成大白话就是借助扫描工具和一些公开的漏洞库提前告知开发者潜在的风险,比如你项目中依赖了Struts 2.0.0,那这个工具会告诉你Struts2.0.0相关的jar包存在风险,如果你不为所动那只能等老板约你喝茶了。
具体介绍请参阅:https://owasp.org/www-project-dependency-check/
开始之前
通过官方的介绍,目前提供了四种扫描方式,分别是Jenkins集成,命令行工具,Maven插件,Ant task,有兴趣的去https://github.com/jeremylong/DependencyCheck了解,这里不再多说。
我自己使用的是Maven插件这种方式,后面内容会以这种方式来展开。
开始扫描
Maven方式扫描很简单,只需要两步即可。
1.在pom.xml增加dependency-check-maven插件的配置,如下:
<project> <build> <plugins> <plugin> <groupId>org.owasp</groupId> <artifactId>dependency-check-maven</artifactId> <version>6.1.0</version> <executions> <execution> <goals> <goal>check</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
2.执行mvn org.owasp:dependency-check-maven:check
为了测试,我给项目增加了fastjson依赖
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.7</version> </dependency>
幸运的话你会在target目录看到dependency-check-report.html,这就是扫描结果,浏览器打开看看大概长啥样。
如果不幸运的话可能会遇到下面提到的问题,听我娓娓道来。
FAQ
问题1-漏洞库加载慢或者加载失败
[ERROR] Unable to download meta file: https://nvd.nist.gov/feeds/json/cve/1.1/nvdcve-1.1-modified.meta org.owasp.dependencycheck.data.update.exception.UpdateException: Unable to download meta file: https://nvd.nist.gov/feeds/json/cve/1.1/nvdcve-1.1-modified.meta at org.owasp.dependencycheck.data.update.NvdCveUpdater.getMetaFile (NvdCveUpdater.java:347) at org.owasp.dependencycheck.data.update.NvdCveUpdater.getUpdatesNeeded (NvdCveUpdater.java:385) at org.owasp.dependencycheck.data.update.NvdCveUpdater.update (NvdCveUpdater.java:122) at org.owasp.dependencycheck.Engine.doUpdates (Engine.java:855) at org.owasp.dependencycheck.Engine.initializeAndUpdateDatabase (Engine.java:662) at org.owasp.dependencycheck.Engine.analyzeDependencies (Engine.java:592) at org.owasp.dependencycheck.maven.BaseDependencyCheckMojo.runCheck (BaseDependencyCheckMojo.java:1641) at org.owasp.dependencycheck.maven.BaseDependencyCheckMojo.execute (BaseDependencyCheckMojo.java:910) at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:137) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:210) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156)
原因分析
依赖检查的时候会通过外网去下载&更新漏洞库,初始下载可能需要十分钟或者更长时间,对于网络环境超好的用户来说自然不会有问题,但网络环境一般的用户失败的几率就会非常高,因此官方提供了一种方案“在局域网内部建立漏洞库”,以此来加速日常的检查,内部漏洞库的更新频率结合自己的实际情况,可以是每天也可以是每周。
如何搭建内部漏洞库
1.通过官方提供的一个java程序来下载漏洞库到指定目录
具体参考 :
https://github.com/stevespringett/nist-data-mirror/
https://jeremylong.github.io/DependencyCheck/data/mirrornvd.html
例如 java -jar nist-data-mirror.jar nist-data #运行nist-data-mirror.jar 将漏洞库下载到nist-data目录
2.自建漏洞库
我是采用的nginx作为漏洞库代理,参考如下配置:
server { listen 80; location / { root 具体的nist-data目录; } }
3.pom.xml中配置cveUrlModified、cveUrlBase属性
<plugin> <groupId>org.owasp</groupId> <artifactId>dependency-check-maven</artifactId> <version>6.1.0</version> <configuration> <cveUrlBase>http://nginxip/nvdcve-1.1-%d.json.gz</cveUrlBase> <cveUrlModified>http://nginxip/nvdcve-1.1-modified.json.gz</cveUrlModified> </configuration> <executions> <execution> <goals> <goal>check</goal> </goals> </execution> </executions> </plugin>
总结
借助现有的工具提前做一些安全预警,不要让亡羊补牢的故事重演。
道高一尺魔高一丈,对自己的系统时刻保持一丝敬畏之心。
推荐阅读
https://owasp.org/www-project-dependency-check/
https://github.com/stevespringett/nist-data-mirror/