俗话说“人怕出名猪怕壮”,当系统小有名气以后就会被一些黑客盯上,三天两头的用各种漏洞扫描工具做渗透,如果不希望某天你负责的系统因为安全问题而出名,那就提前行动起来吧,这就是今天要讲的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对应用做个安检的更多相关文章

  1. 【OWASP TOP10】2021年常见web安全漏洞TOP10排行

    [2021]常见web安全漏洞TOP10排行 应用程序安全风险 攻击者可以通过应用程序中许多的不同的路径方式去危害企业业务.每种路径方法都代表了一种风险,这些风险都值得关注. 什么是 OWASP TO ...

  2. 在CI中实现持续Web安全扫描

    一. 当前Web应用安全现状 随着中国互联网金融的爆发和繁荣,Web应用在其中扮演的地位也越来越重要,比如Web支付系统.Web P2P系统.Web货币系统等.对于这些金融系统来讲,安全的重要性是不言 ...

  3. Web CI过程中的Security解决方案

    http://www.infoq.com/cn/articles/WebScan-CI 一. 当前Web应用安全现状 随着中国互联网金融的爆发和繁荣,Web应用在其中扮演的地位也越来越重要,比如Web ...

  4. 使用jquery.validation+jquery.poshytip做表单验证--未完待续

    jqueryValidate的具体使用方法很多,这里就不在赘述,这一次只谈一下怎样简单的实现表单验证. 整片文章目的,通过JQvalidation按表单属性配置规则验证,并将验证结果通过poshyti ...

  5. 后端开发实践——Spring Boot项目模板

    在我的工作中,我从零开始搭建了不少软件项目,其中包含了基础代码框架和持续集成基础设施等,这些内容在敏捷开发中通常被称为"第0个迭代"要做的事情.但是,当项目运行了一段时间之后再来反 ...

  6. 后端开发实践:Spring Boot项目模板

    在我的工作中,我从零开始搭建了不少软件项目,其中包含了基础代码框架和持续集成基础设施等,这些内容在敏捷开发中通常被称为"第0个迭代"要做的事情.但是,当项目运行了一段时间之后再来反 ...

  7. 使用maven来管理您的java项目

    maven是一个项目管理工具,使用maven可以自动管理java项目的整个生命周期,包括编译.构建.测试.发布和报告等.在大型项目开发中,使用maven来管理是必不可少的. 一.安装maven 1.W ...

  8. spring beans源码解读之--Bean的定义及包装

    bean的定义,包装是java bean的基础.再怎么强调它的重要性都不为过,因此深入 了解这块的代码对以后的代码研究可以起到事半功倍的功效. 1. Bean的定义BeanDefinition 1.1 ...

  9. 3.8 spring - AbstractBeanDefinition 介绍

    之前,我们已尽完成了xml 文档到 GenericBeanDefinition的转换, 也就是说,到这里,所有的配置都可以在GenericBeanDefinition 的实例中找到对应的配置. Gen ...

随机推荐

  1. TCP/IP__TCP/IP协议

    1.定位:指因特网整个TCP/IP协议族,由四个层次组成:网络接入层.网络层.主机到主机层.应用层.也叫DoD模型.每一层都呼叫它的下一层所提供的网络来完成自己的需求. 2.与OSI模型的对应: 3. ...

  2. jvm系列二内存结构

    二.内存结构 整体架构 1.程序计数器 作用 用于保存JVM中下一条所要执行的指令的地址 特点 线程私有 CPU会为每个线程分配时间片,当当前线程的时间片使用完以后,CPU就会去执行另一个线程中的代码 ...

  3. linux(6)查看进程ps命令

    ps命令 Linux ps (英文全拼:process status)命令用于显示当前进程的状态,类似于 windows 的任务管理器 查看所有进程 ps -A 显示所有进程信息,连同命令行 ps - ...

  4. GPLT L2-007 家庭房产 (并查集)

    题意: 给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数.人均房产面积及房产套数. 思路: 输入和输出各构造一个结构体,利用并查集归并输入,枚举编号进行输出. #include &l ...

  5. 【noi 2.6_6046】数据包的调度机制(区间DP)

    题意:给定一个队列延迟值为Di的任务,以任意顺序入栈和出栈,第K个出栈的延迟值为(K-1)*Di.问最小的延迟值. 解法:f[i][l]表示完成以第i个任务开始,长度为l,到第i+l-1个任务的最小延 ...

  6. Markdown基本语法学习(使用Typora编辑器)

    Markdown基本语法学习(使用Typora编辑器) 一级标题:就用 #加标题名字 二级标题 二级标题:## + 标题名字 三级标题 三级标题:### + 标题名字 四级标题 四级标题:#### + ...

  7. SSM框架整合(Spring + SpringMVC + MyBatis)

    搭建环境 使用Spring(业务层)整合其他的框架SpringMVC(表现层)和MyBatis(持久层) Spring框架 创建数据库表 CREATE DATABASE ssm; USE ssm; C ...

  8. Kubernets二进制安装(9)之部署主控节点控制器controller-manager

    kube-controller-manager运行控制器,它们是处理集群中常规任务的后台线程 Controller Manager就是集群内部的管理控制中心,由负责不同资源的多个Controller构 ...

  9. C++中main函数的返回值一定要是int

    因为大学上课时候,经常是在主函数中做处理,直接用cout语句输出到显示设备,所以一直在用void main(). 直到后面具体编程的时候,才发现void main()这种用法是按 C89(C语言的早期 ...

  10. Windows 10 Emoji shortcuts

    Windows 10 Emoji shortcuts Windows 10 Emoji 快捷方式 https://support.microsoft.com/en-us/windows/windows ...