本文将讨论如何使用Maven程序集创建可提供给第三方漏洞评估站点(例如Veracode )进行审查的工件。

错误的静态分析与漏洞评估

在这一点上,每个人都知道findbug并虔诚地使用它,对吗?

对?

Findbugs使用静态分析来查找错误。 更准确地说,它使用静态分析来查找可以通过静态分析发现的错误。 例如,我看到了一种常见的模式

public void foo(Object obj) {if (obj != null) {obj.doSomething();}// lots of obscuring codeobj.doSomethingElse()
}

我们应该第二次检查null吗? 我们需要第一次检查吗? 我们应该从“ if”子句中返回吗?

为什么我们还需要漏洞评估?

什么是漏洞评估? 它与错误有何不同?

关键概念是,易受攻击的代码表面上没有错误,但是仍然容易受到滥用以攻击该网站或其用户。

易受攻击的代码的一个示例是使用未经消毒的用户提供的值。 从事前端工作的任何人都应该了解净化这些价值的重要性。

但是,当用户提供的数据从前端传递出去时(例如,将其写入数据库时​​)会发生什么? 每个从数据库中提取数据的人都知道它可能包含未经消毒的用户提供的数据吗? 如何通过SQL注入将恶意数据放入数据库?

用于漏洞评估的静态分析与静态分析很像,可以发现漏洞,而且要经过很多检查。 而findbug可能需要5分钟才能运行Veracode,可能需要几个小时!

(动态分析使这一步骤更进一步,并针对实时系统运行了测试。您可以使用集成测试来进行此简化版。)

漏洞评估的工件

我们需要提供什么以进行漏洞评估? 简短的答案是三件事:

  • 我们的编译代码(例如,java或scala)
  • 我们的脚本代码(例如,jsp)
  • 递归依赖的每个jar文件

我们不需要提供我们的源代码或资源。 编译后的代码确实需要包括调试系统,这样它才能给出有意义的错误消息- 知道包含79个类的库中有19个缺陷并不是很有帮助!

一个好的格式是一个包含以下内容的压缩包:

  • 我们的jar和wars在顶层,没有版本号
  • 我们在“ / lib”下的依赖,带有版本号

版本号被剥离或保留用于跟踪目的。 我们的代码在多次运行中具有连续性。 我们的依赖关系可以随时更改,并且除了版本号中明确指出的内容之外,没有任何连续性。

我们的war文件应该从嵌入式jar中删除,因为它们将出现在“ lib”目录下。 “较厚”的战争文件只会增加上传的工件的大小。

我们可以使用两个Maven程序集描述符来构建它。

va-war.xml(漏洞评估皮包骨头的战争)

第一个程序集创建一个精简的.war文件。 我不想称它为一场皮包骨头的战争,因为预期的目的有所不同,但它们有很多共同点。

<assemblyxmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/plugins/maven/assembly-plugin/assembly/1.1.2http://maven.apache.org/xsd/assembly-1.1.2.xsd"><id>va-war</id><formats><format>war</format></formats><includeBaseDirectory>false</includeBaseDirectory><fileSets><!-- grab everything except any jars --><fileSet><directory>target/${project.artifactId}-${project.version}</directory><outputDirectory>/</outputDirectory><includes /><excludes><exclude>**/*.jar</exclude></excludes></fileSet></fileSets>
</assembly>

如果您具有敏感信息或大量大型工件,则可以排除其他文件:

<excludes><exclude>**/*.jar</exclude><exclude>**/*.jks</exclude><exclude>**/*.p12</exclude><exclude>**/*.jpg</exclude><exclude>**/db.properties</exclude></excludes>

但是,您需要注意–您需要包含脚本编写的所有内容,例如jsp文件或Velocity模板。

va-artifact.xml(漏洞评估工件)

第二个工件收集所有依赖项,并将战争简化为一个压缩包。 我们的jar和wars在tarball的顶层,所有依赖项都在“ lib”目录中。 这使得区分工件和依赖关系变得容易。

<assemblyxmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/plugins/maven/assembly-plugin/assembly/1.1.2http://maven.apache.org/xsd/assembly-1.1.2.xsd"><id>va-artifact</id><formats><format>tar.gz</format></formats><includeBaseDirectory>false</includeBaseDirectory><dependencySets><!-- ******************************************* --><!-- Our code should not include version numbers --><!-- ******************************************* --><dependencySet><includes><include>${project.groupId}:*:jar</include><include>${project.groupId}:*:va-war</include><!-- we could also include subprojects --><include>${project.groupId}.**:*:jar</include></includes><!-- we might have sensitive resources --><excludes><exclude>${project.groupId}:*-properties</exclude><excludes><outputFileNameMapping>${artifact.artifactId}${dashClassifier?}.${artifact.extension}</outputFileNameMapping></dependencySet><!-- *********************************************** --><!-- Our dependencies should include version numbers --><!-- *********************************************** --><dependencySet><outputDirectory>lib</outputDirectory><includes /><excludes><exclude>${project.groupId}:*</exclude><exclude>*.pom</exclude><!-- exclude standard APIs --><exclude>javax.*:*</exclude><exclude>dom4j:*</exclude><exclude>jaxen:*</exclude><exclude>jdom:*</exclude><exclude>xml-apis:*</exclude></excludes></dependencySet></dependencySets>
</assembly>

构建工件

程序集描述符只是故事的一半。 我们仍然需要调用maven程序集,我们不想在每个构建中都这样做。

这是配置文件的理想时间–只有指定了特定的配置文件,我们才会构建工件。

pom.xml用于战争模块

对于war模块,pom.xml文件的必要添加是适度的。 我们需要调用程序集描述符,但不需要显式添加依赖项。

<profiles><profile><id>vulnerability-assessment</id><build><plugins><plugin><artifactId>maven-assembly-plugin</artifactId><configuration><descriptors><descriptor>src/main/assembly/va-war.xml</descriptor></descriptors></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin></plugins></build></profile>
</profiles>

pom.xml用于顶级模块

顶级模块的pom.xml文件的必要附加操作更为复杂,尤其是在分发程序集是在子模块而不是根模块中创建时。 在这种情况下,我们需要显式添加对pom文件和lite war文件的依赖。 如果不指定前者,则将丢失大多数依赖项;如果不指定后者,则将丢失.war文件。

<profiles><profile><id>vulnerability-assessment</id><build><plugins><plugin><artifactId>maven-assembly-plugin</artifactId><configuration><descriptors><descriptor>src/main/assembly/va-artifact.xml</descriptor></descriptors></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin></plugins></build><dependencies><!-- specify parent pom --><dependency><groupId>${project.groupId}</groupId><artifactId>parent</artifactId> <!-- FIXME --><version>${project.version}</version><type>pom</type></dependency><!-- specify each war file and corresponding pom file --><dependency><groupId>${project.groupId}</groupId><artifactId>webapp-1</artifactId> <!-- FIXME --><version>${project.version}</version><type>war</type><classifier>va-war</classifier></dependency><dependency><groupId>${project.groupId}</groupId><artifactId>webapp-1</artifactId> <!-- FIXME --><version>${project.version}</version><type>pom</type></dependency><!-- second... --><dependency><groupId>${project.groupId}</groupId><artifactId>webapp-2</artifactId> <!-- FIXME --><version>${project.version}</version><type>war</type><classifier>va-war</classifier></dependency><dependency><groupId>${project.groupId}</groupId><artifactId>webapp-2</artifactId> <!-- FIXME --><version>${project.version}</version><type>pom</type></dependency><!-- and so on... --></dependencies></profile>
</profiles>

一个小陷阱!

有一个小陷阱! 在这种特定方法中。 各个Web模块可能依赖于公共库的不同版本。 没有人希望这样做,但是一旦项目达到一定规模,您就无法承受使所有模块保持同步所需的时间和精力。

当我们在公共位置进行依赖关系解析时,此信息将丢失。

我不认为这是一个问题,原因有两个。 首先,我们可以以更精细的粒度执行漏洞评估–本质上是在.war级别而不是.ear文件上进行分析。 这保证了库将匹配,但是如果我们有大量的Web模块,则将极大地增加我们的工作量。

其次,我们的主要重点是代码中的漏洞,而不是特定版本的第三方库中的漏洞。 这些库为评估工具提供了重要的提示,但我们只希望对代码进行全面分析。 如果有必要,我们总是可以对我们依赖的库进行单独的评估。

Jenkins Veracode插件

最后,我想指出的是,有一个用于Veracode分析的Jenkins插件: Veracode Scanner Plugin 。 它可用于定期安排扫描,因此当您最终记得在发布前几天运行扫描时,不会发现数百个缺陷。

参考: Invariant Properties博客中的JCG合作伙伴 Bear Giles 使用Maven程序集创建漏洞评估工件 。

翻译自: https://www.javacodegeeks.com/2013/10/creating-vulnerability-assessment-artifacts-using-maven-assembly.html

使用Maven程序集创建漏洞评估工件相关推荐

  1. idea创建maven程序_使用Maven程序集创建漏洞评估工件

    idea创建maven程序 本文将讨论如何使用Maven程序集创建可提供给第三方漏洞评估站点(例如Veracode )进行审查的工件. 错误的静态分析与漏洞评估 在这一点上,每个人都知道findbug ...

  2. 漏洞评估的优先级决定了网络安全保护的成本

    黑客一直都在扫描互联网中的漏洞,如果你不想让你的组织成为受害者,那么你需要成为第一个发现这些漏洞的人.换句话说,你必须采取主动的方法来管理漏洞,而实现此目标的关键第一步就是执行漏洞评估. 2021年的 ...

  3. Maven原型创建技巧

    我最近需要为姜黄SOA项目创建一些Maven原型. 对于不了解的人来说, Maven原型是一种基于一些预先罐装的项目模板生成项目的方法. 对于当前的姜黄SOA原型,它将创建一个多模块Maven项目,该 ...

  4. docker -v 覆盖了容器中的文件_「安定坊」安全卫士-容器漏洞评估

    现阶段,我们正在从虚拟化过渡到容器化,一些我们所熟悉的容器化技术就包括了诸如docker或http://quay.io等.一般来说,我们可以通过配置程序依赖环境来为特定应用程序建立镜像,通常当开发人员 ...

  5. Kali Linux 秘籍 第五章 漏洞评估

    第五章 漏洞评估 作者:Willie L. Pritchett, David De Smet 译者:飞龙 协议:CC BY-NC-SA 4.0 简介 扫描和识别目标的漏洞通常被渗透测试者看做无聊的任务 ...

  6. SQL Server数据库漏洞评估了解一下

    SQL Server Management Studio 17.4或更高版本的SSMS中提供了SQL Server漏洞侦测(VA)功能,此功能允许SQL Server扫描您的数据库以查找潜在的安全漏洞 ...

  7. azure云数据库_Azure SQL数据库中的漏洞评估和高级威胁防护

    azure云数据库 In today's time where data breaches are highly expected to happen, there is a high need to ...

  8. 开放式漏洞评估语言(OVAL)概述

    1. 什么是OVAL? OVAL(开放漏洞评估语言)是一个国际信息安全社区标准,用于评估和报告计算机系统的机器状态,促进开放和公开的安全内容,并在整个安全工具和服务范围内传输此信息. 这是一个开放的社 ...

  9. 操作系统和应用程序漏洞评估

    近年来,漏洞数量激增,全球组织对如何进行成功的漏洞评估感到困惑.若要解决此问题,需要首先确定要通过漏洞评估过程实现的目标,以便对其进行微调以满足组织的个人需求. 什么是漏洞评估 漏洞管理的目标是始终控 ...

最新文章

  1. outlook express 邮件超过2G时的解决方法
  2. SRAM Controller
  3. 19-爬虫之scrapy框架大文件下载06
  4. linux系统下怎么修改sshd端口?
  5. Python速忆笔记(更新中)
  6. Spring(二)--FactoryBean、bean的后置处理器、数据库连接池、引用外部文件、使用注解配置bean等...
  7. 平面/UI设计师社区交流网站集设|给你的作品多一个展示机会
  8. Shell编程 之 while循环 和 until循环 和 总结
  9. 如何解决分布式系统数据事务一致性问题(HBase加Solr)
  10. html跨页面传数组,如何把一个页面的对象数组传到另外一个页面,没有后台,存js_html/css_WEB-ITnose...
  11. git提交了不需要的文件夹或者文件怎么办
  12. 如何在vs2017编写java程序_VS2017开发Linux平台上的程序
  13. C# 一个基于.NET Core3.1的开源项目帮你彻底搞懂WPF框架Prism
  14. MapGIS6.7环境设置
  15. XPS查看器(XPS Viewer)适用Win10系统安装说明
  16. Adapter与AdapterView
  17. html页面百度分享代码,使用百度分享api实现网页分享功能代码
  18. Latex之页边距设置
  19. 宏旺半导体为你解释手机内存不够用的原因
  20. Mysql设置别名(表名和列名)

热门文章

  1. beanutil 批量copy_BeanUtils.copyProperties 需要getset方法支持
  2. java 招聘要求_Java程序员如何进阶,一般招聘都有哪些要求?
  3. python内置模块有哪些_python中那些小众但有用的内置模块
  4. 10人以下小团队管理手册-学习笔记
  5. GET与POST传递数据的最大长度能够达到多少
  6. Angular 应用解决跨域访问的问题
  7. compose应用_带有PostgreSQLDocker Compose for Spring Boot应用程序
  8. jetty java_Jetty,Java和OAuth入门
  9. jakarta ee_关于Jakarta EE软件包名称更改的思考
  10. java分布式系统开发_从微服务到分布式系统-Java开发人员生存指南