俗话说“人怕出名猪怕壮”,当系统小有名气以后就会被一些黑客盯上,三天两头的用各种漏洞扫描工具做渗透,如果不希望某天你负责的系统因为安全问题而出名,那就提前行动起来吧,这就是今天要讲的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. HashMap源码(JDK1.8)-手动注释

    HashMap简介 HashMap是一种K-V映射的一种数据结构,通过K(key)值能实现在O(1)的时间复杂度下找到对应的V(value).JDK1.8之前,HashMap的底层数据结构是数组+链表 ...

  2. 操作系统中的描述符和GDT

    在操作系统中,全局描述符是什么?GDT又是什么?在进入保护模式之前,准备好GDT和GDT中的描述符是必须的吗?用汇编代码怎么创建描述符?本文解答上面几个问题. 在实模式下,CPU是16位的,意思是,寄 ...

  3. Java初体验

    参考书籍「Java语言程序设计基础篇」 比特与字节 计算机中只有0和1,二进制,即比特(bit,二进制数): 字节(byte)是最小的存储单元,每个字节有8个比特组成 即:1byte=8bit 各种数 ...

  4. “科大讯飞杯”第18届上海大学程序设计联赛春季赛暨高校网络友谊赛 G 血压游戏

    [血压游戏] (https://ac.nowcoder.com/acm/contest/5278/G) 神奇的tag数组...,巧妙弥补了高度损失. 方法一:dsu on tree 类似长链剖分,不过 ...

  5. Codeforces Round #585 (Div. 2) E. Marbles(状压dp)

    题意:给你一个长度为n的序列 问你需要多少次两两交换 可以让相同的数字在一个区间段 思路:我们可以预处理一个数组cnt[i][j]表示把i放到j前面需要交换多少次 然后二进制枚举后 每次选择一个为1的 ...

  6. Codeforces 1355 C. Count Triangles

    传送门:C - Count Triangles  题意:给你四个数A,B,C,D,求有多少个三边为x,y,z (A ≤ x ≤ B ≤ y ≤ C ≤ z ≤ D)的三角形. 题解:枚举 x=A~B, ...

  7. Codeforces Round #641 (Div. 2) D. Orac and Medians (贪心)

    题意:有一个长度为\(n\)的数组,问能否通过多次使某个区间的所有元素变成这个区间的中位数,来使整个数组变成题目所给定的\(k\). 题解:首先这个\(k\)一定要在数组中存在,然后我们对中位数进行考 ...

  8. POJ-3984 迷宫问题 (BFS)

    题意:有一个\(5\)X\(5\)的\(01\)图,输出从左上角走到右下角的最短路径. 题解:基础的bfs,这里困难的是如何输出这个最短路径,我们可以用一个结构体来存点和路径,我们每次向外去拓展的时候 ...

  9. 如何创建一个GETH节点(单节点,windows环境)

    所有命令都是在powershell上执行的 1.创建"创世块" 初始化配置 创建一个 hdgenesis.json文件,拷贝到geth根目录 {    "config&q ...

  10. vue中怎么动态生成form表单

    form-create 是一个可以通过 JSON 生成具有动态渲染.数据收集.验证和提交功能的表单生成组件.支持3个UI框架,并且支持生成任何 Vue 组件.内置20种常用表单组件和自定义组件,再复杂 ...