使用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/

使用OWASP Dependency-Check对应用做个安检的更多相关文章
- 【OWASP TOP10】2021年常见web安全漏洞TOP10排行
[2021]常见web安全漏洞TOP10排行 应用程序安全风险 攻击者可以通过应用程序中许多的不同的路径方式去危害企业业务.每种路径方法都代表了一种风险,这些风险都值得关注. 什么是 OWASP TO ...
- 在CI中实现持续Web安全扫描
一. 当前Web应用安全现状 随着中国互联网金融的爆发和繁荣,Web应用在其中扮演的地位也越来越重要,比如Web支付系统.Web P2P系统.Web货币系统等.对于这些金融系统来讲,安全的重要性是不言 ...
- Web CI过程中的Security解决方案
http://www.infoq.com/cn/articles/WebScan-CI 一. 当前Web应用安全现状 随着中国互联网金融的爆发和繁荣,Web应用在其中扮演的地位也越来越重要,比如Web ...
- 使用jquery.validation+jquery.poshytip做表单验证--未完待续
jqueryValidate的具体使用方法很多,这里就不在赘述,这一次只谈一下怎样简单的实现表单验证. 整片文章目的,通过JQvalidation按表单属性配置规则验证,并将验证结果通过poshyti ...
- 后端开发实践——Spring Boot项目模板
在我的工作中,我从零开始搭建了不少软件项目,其中包含了基础代码框架和持续集成基础设施等,这些内容在敏捷开发中通常被称为"第0个迭代"要做的事情.但是,当项目运行了一段时间之后再来反 ...
- 后端开发实践:Spring Boot项目模板
在我的工作中,我从零开始搭建了不少软件项目,其中包含了基础代码框架和持续集成基础设施等,这些内容在敏捷开发中通常被称为"第0个迭代"要做的事情.但是,当项目运行了一段时间之后再来反 ...
- 使用maven来管理您的java项目
maven是一个项目管理工具,使用maven可以自动管理java项目的整个生命周期,包括编译.构建.测试.发布和报告等.在大型项目开发中,使用maven来管理是必不可少的. 一.安装maven 1.W ...
- spring beans源码解读之--Bean的定义及包装
bean的定义,包装是java bean的基础.再怎么强调它的重要性都不为过,因此深入 了解这块的代码对以后的代码研究可以起到事半功倍的功效. 1. Bean的定义BeanDefinition 1.1 ...
- 3.8 spring - AbstractBeanDefinition 介绍
之前,我们已尽完成了xml 文档到 GenericBeanDefinition的转换, 也就是说,到这里,所有的配置都可以在GenericBeanDefinition 的实例中找到对应的配置. Gen ...
随机推荐
- (11)Linux服务器管理维护注意事项
1.远程服务器关机及重启时的注意事项 为什么远程服务器不能关机?原因很简单,远程服务器没有放置在本地,关机后谁帮你按开机电源键启动服务器?虽然计算机技术曰新月异,但是像插入电源和开机这样的工作还是需要 ...
- Java 复习整理day06
Java api 章节除了一下列的常用类别的用时候查文档 1 package com.it.demo01_api; 2 3 import java.util.Scanner; 4 5 /* 6 案例: ...
- Docker容器管理平台Rancher高可用部署——看这篇就够了
记得刚接触Rancher时,看了官方文档云里雾里,跟着官网文档部署了高可用Rancher,发现不管怎么折腾都无法部署成功(相信已尝试的朋友也有类似的感觉),今天腾出空来写个总结,给看到的朋友留个参考( ...
- JVM系列(一):jvm启动过程速览
jvm是java的核心运行平台,自然是个非常复杂的系统.当然了,说jvm是个平台,实际上也是个泛称.准确的说,它是一个java虚拟机的统称,它并不指具体的某个虚拟机.所以,谈到java虚拟机时,往往我 ...
- P4254 [JSOI2008]Blue Mary开公司 (李超树)
题意:插入一些一次函数线段 每次询问在x = x0处这些线段的最大值 题解:李超树模版题 维护优势线段 注意这题的输入是x=1时的b #include <iostream> #includ ...
- C# ArrayList和List的区别
ArrayList存的是object对象,可以装任何类型,但涉及装箱拆箱,效率低,类型转换可能报错 List只能存一种类型,不涉及装箱拆箱,效率高 总结:一般情况用List吧
- WPF 只读集合在 XAML 中的绑定(WPF:Binding for readonly collection in xaml)
问题背景 某一天,我想做一个签到打卡的日历.基于 Calendar,想实现这个目标,于是找到了它的 SelectedDates 属性,用于标记签到过的日期. 问题来了. 基于MVVM模式,想将其在xa ...
- Python模块——Openpyxl(EXCEL)操作
一.安装模块 pip install openpyxl 二.文件的操作 2.1文件创建 from openpyxl import Workbook #创建新的excle文件 wk = Workbook ...
- Zabbix 自动发现 & 自动注册
自动发现 Zabbix 为用户提供了高效灵活的网络自动发现功能,有以下优点: 加快 Zabbix 部署 简化管理 无需过多管理,也能在快速变化的环境中使用 Zabbix Zabbix 网络发现基于以下 ...
- Leetcode(28)-实现strStr()
实现 strStr() 函数. 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始).如果不存在,则返 ...