=Start=
缘由:
需要知道一种通用的方法以获取jar包的版本信息,因此有了此文。
搜索关键字:
how to check spring version
JAR 文件 规范
- http://docs.oracle.com/javase/6/docs/technotes/guides/jar/jar.html
- http://docs.oracle.com/javase/7/docs/technotes/guides/jar/jar.html
- https://zh.wikipedia.org/wiki/Manifest%E8%B5%84%E6%BA%90%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6
获取jar包版本信息
- http://blog.csdn.net/xiaxiaorui2003/article/details/4582778
- http://blog.csdn.net/heng_ji/article/details/7058396
- http://docs.oracle.com/javase/7/docs/technotes/guides/jar/jar.html#The_META-INF_directory
- http://joshuasabrina.iteye.com/blog/1821406
- http://www.cnblogs.com/wych/p/4072913.html
- http://blog.csdn.net/isea533/article/details/49151139
- http://ifeve.com/maven-2/
参考解答:
JAR文件本质上是一个zip文件,包含一个可选的META-INF目录。多数情况下,JAR文件并不是类文件和/或资源文件的简单聚合档案。他们经常用作应用程序和扩展的构建基础。如果存在的话,META-INF目录用来存储包和扩展的配置数据,包括安全、版本、扩展和服务。
将jar包解压后读取文件:
./META-INF/MANIFEST.MF
即可找到对应的版本信息。
$ unzip -p catalina.jar "META-INF/MANIFEST.MF" ... Manifest-Version: Defines the manifest file version. The value is a legitimate version number, as described in the above spec. ... Signature-Version: Defines the signature version of the jar file. The value should be a valid version-number string. ... Implementation-Version: The value is a string that defines the version of the extension implementation. ... Specification-Version: The value is a string that defines the version of the extension specification. ...
==
// 下面这个是获取Spring版本信息的代码(http://stackoverflow.com/a/947679) import org.springframework.core.SpringVersion; public class VersionChecker { public static void main(String [] args) { System.out.println("version: " + SpringVersion.getVersion()); } }
==
针对Maven管理的Jar包
在 pom.properties 中包含了jar包的版本号信息。
==
针对ANT管理的Jar包
在 build.xml 里建立一个存放版本号的属性,并在打Jar包时,将版本号压入MANIFEST文件。程序在执行的时候,读取Jar包的MANIFEST来获取版本号。
====
#查看jar包中都有哪些文件: $ unzip -l catalina.jar $ jar -tvf catalina.jar #从 catalina.jar 中解压出文件 ServerInfo.properties (需要知道文件的路径信息): $ jar xf catalina.jar org/apache/catalina/util/ServerInfo.properties #将修改后的文件重新打包至 catalina.jar 中: $ jar uf catalina.jar org/apache/catalina/util/ServerInfo.properties #示例 1: 将两个类文件归档到一个名为 classes.jar 的归档文件中: $ jar cvf classes.jar Foo.class Bar.class #示例 2: 使用现有的清单文件 'mymanifest' 并将 foo/ 目录中的所有文件归档到 'classes.jar' 中: $ jar cvfm classes.jar mymanifest -C foo/ .
=EOF=
《 “如何查看jar包的版本信息” 》 有 23 条评论
在部分情况下,通过pom.xml无法找到「间接」依赖的jar包信息;
但是我们可以通过Maven把运行时依赖到的内容也统计出来,更准确地讲,是把pom.xml中scope为compile和runtime级别的依赖都进行统计,这里可以使用 `mvn dependency:tree -Dverbose` 查看所有的依赖,简单的 `mvn dependency:tree` 可能显示不全。
【漏洞预警】Fastjson 远程代码执行漏洞(暂无PoC)
http://bobao.360.cn/learning/detail/3617.html
https://bbs.aliyun.com/read/309931.html
https://github.com/alibaba/fastjson/wiki/security_update_20170315
`
检测当前使用版本的是否有问题
方法一:通过maven dependency检测 如果是maven工程,在代码根目录下执行如下命令,如果有返回,就是需要升级
mvn dependency:tree | grep “com.alibaba.fastjson:” | grep -v sec01 | grep -v 1.2.25 | grep -v 1.2.26 | grep -v 1.2.27
方法二:在lib目录下执行如下脚本命令,可以判断版本是否有问题
ls | grep fastjson | grep jar | grep -v sec01 | grep -v 1.2.25 | grep -v 1.2.26 | grep -v 1.2.27 | grep -v 1.2.28 | grep -v 1.2.29
方法三:看打开的文件中是否包含fastjson
sudo -u tomcat lsof -X | grep -v 1.2.25 | grep -v 1.2.26 | grep -v 1.2.27 | grep -v 1.2.28 | grep -v 1.2.29
通过lsof检测,在tomcat某些场景是检测不出来的,最好在lib目录下用ls检测(第2种方法)。
`
查看maven项目依赖树
http://wuwenliang.net/2017/02/21/%E6%9F%A5%E7%9C%8Bmaven%E9%A1%B9%E7%9B%AE%E4%BE%9D%E8%B5%96%E6%A0%91/
https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html
https://maven.apache.org/plugins/maven-dependency-plugin/
http://stackoverflow.com/questions/2619598/differences-between-dependencymanagement-and-dependencies-in-maven
Spring WebFlow 远程代码执行漏洞分析(CVE-2017-4971)
https://www.iswin.org/2017/06/11/CVE-2017-4971-Spring-WebFlow-RCE-Analysis/
https://threathunter.org/topic/593d562353ab369c55425a90
依赖检查(OWASP dependency-check is a software composition analysis utility that detects publicly disclosed vulnerabilities in application dependencies.)
https://github.com/jeremylong/DependencyCheck
https://www.owasp.org/index.php/OWASP_Dependency_Check
【知识库】Dependency-check依赖检查工具
https://mp.weixin.qq.com/s/j37Y1rpQphFFSoAtbzSnMQ
GitHub引入依赖图和安全预警
http://www.infoq.com/cn/news/2017/10/github-dependency-graph-security
GitHub 社区对已经启用依赖图谱(Dependency Graph)功能的用户会推送已知漏洞预警
https://github.com/blog/2470-introducing-security-alerts-on-github
Apache Synapse 远程代码执行漏洞(CVE-2017-15708)
http://www.openwall.com/lists/oss-security/2017/12/10/4?from=timeline
http://synapse.apache.org/download/3.0.1/download.cgi
http://blog.nsfocus.net/cve-2017-15708/
https://commons.apache.org/proper/commons-collections/security-reports.html
提取加密过的jar包(Extract Crypted Jar Archives)
https://github.com/GraxCode/ReverseCrypt
Mac上用 homebrew 安装的Maven执行报错:
错误: 找不到或无法加载主类 org.codehaus.plexus.classworlds.launcher.Launcher
https://tieba.baidu.com/p/3142104595
http://blog.51cto.com/houenxun/1761956
http://www.clarkchen.com/mac-%E9%85%8D%E7%BD%AE-maven%E7%9A%84%E4%B8%80%E4%B8%AA%E9%97%AE%E9%A2%98/
`
网上的一些解决办法:
配置PATH时将 $M2_HOME/bin 放在系统 $PATH 前就可以了。
export M2_HOME=/opt/maven
export PATH=$M2_HOME/bin:$PATH
我的实际解决办法,只要在命令前面添加 sudo 即可,例如:
sudo mvn -version
`
说说依赖包的管理和维护
https://mp.weixin.qq.com/s/f0AlXv4soFJlklh8EoJJJQ
Dependency-Track:第三方库漏洞检测工具
https://github.com/stevespringett/dependency-track
spring-messaging Remote Code Execution 分析-【CVE-2018-1270】
https://xz.aliyun.com/t/2252
https://pivotal.io/security/cve-2018-1270
CVE-2018-1270:spring-messaging远程代码执行漏洞分析预警
https://mp.weixin.qq.com/s/zW53wlWm5Bk1ZJV8i3b6QQ
`
影响版本
Spring Framework 5.0 to 5.0.4.
Spring Framework 4.3 to 4.3.14
已不支持的旧版本仍然受影响
修复版本
5.0.x 用户升级到5.0.5版本
4.3.x 用户升级到4.3.15版本
对应jar包名称
spring-messaging-4.2.1.RELEASE.jar
`
漏洞环境速查列表
https://github.com/Medicean/VulApps/wiki/%E6%BC%8F%E6%B4%9E%E7%8E%AF%E5%A2%83%E9%80%9F%E6%9F%A5%E5%88%97%E8%A1%A8
Apache Shiro Java 反序列化漏洞分析
http://www.mottoin.com/86117.html
Apache Shiro 简介
http://followtry.cn/2016-05-20/shiro-instruction.html
强网杯“彩蛋”——Shiro 1.2.4(SHIRO-550)漏洞之发散性思考
https://blog.zsxsoft.com/post/35
Apache Shiro Java 反序列化漏洞分析
https://issues.apache.org/jira/browse/SHIRO-550
http://blog.knownsec.com/2016/08/apache-shiro-java/
https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet/blob/master/README.md#apache-shiro
Maven仓库是如何工作的?(How does a maven repository work?)
https://blog.packagecloud.io/eng/2017/03/09/how-does-a-maven-repository-work/
如何创建私有的Maven仓库(HOWTO: Private Maven Repositories)
https://blog.packagecloud.io/eng/2017/03/26/private-maven-repositories-jenkins-gradle/
Maven生成可以直接运行的jar包的多种方式
https://paper.tuisec.win/detail/5b730de2f09c1d0
https://blog.csdn.net/xiao__gui/article/details/47341385
`
Maven可以使用mvn package指令对项目进行打包,如果使用java -jar xxx.jar执行运行jar文件,会出现”no main manifest attribute, in xxx.jar”(没有设置Main-Class)、ClassNotFoundException(找不到依赖包)等错误。
要想jar包能直接通过java -jar xxx.jar运行,需要满足:
1、在jar包中的META-INF/MANIFEST.MF中指定Main-Class,这样才能确定程序的入口在哪里;
2、要能加载到依赖包。
使用Maven有以下几种方法可以生成能直接运行的jar包,可以根据需要选择一种合适的方法。
方法一:使用maven-jar-plugin和maven-dependency-plugin插件打包
方法二:使用maven-assembly-plugin插件打包
方法三:使用maven-shade-plugin插件打包
`
Can’t execute jar- file: “no main manifest attribute”
直接通过java命令执行jar包报错的解决方法
https://stackoverflow.com/questions/9689793/cant-execute-jar-file-no-main-manifest-attribute
`
1、如果不希望额外指定参数,那就需要jar包本身是一个「可执行的jar包」
这点可以通过在Maven项目的 pom.xml 中指定 mainClass 实现生成可执行jar包的功能;
2、虽然jar包本身不是可执行的,但是其中的某个 Class 里有main方法可以执行,可以通过下面的命令选项实现该方法的调用
java -cp app.jar com.somepackage.SomeClass
`
Oracle官方出的jar相关信息教程/说明文档
Lesson: Packaging Programs in JAR Files
https://docs.oracle.com/javase/tutorial/deployment/jar/index.html
Setting an Application’s Entry Point
https://docs.oracle.com/javase/tutorial/deployment/jar/appman.html
如何快速找到POC/EXP依赖的jar?
http://gv7.me/articles/2019/quickly-find-jars-that-depend-on-poc-exp/
http://www.liuhaihua.cn/archives/575573.html
`
标题主要是针对安全人员,如果针对是开发人员的话,应该是 如何快速从众多jar中找到目标类?
在编写Java相关中间件或者CMS的POC/EXP时一般都会依赖它们的某个jar,但它们的jar往往非常多,并且会分散在各个目录下,那么如何快速找到它们呢?
可以通过编程实现一个小工具,以快速从众多jar中,搜索目标class所在的jar。不区分大小写,支持通配符搜索。
`
Log4j2报错ERROR StatusLogger Unrecognized format specifier
https://www.cnblogs.com/yeyang/p/10485790.html
`
ERROR StatusLogger Unrecognized format specifier [d]
ERROR StatusLogger Unrecognized conversion specifier [d] starting at position 16 in conversion pattern.
`
https://stackoverflow.com/questions/34945438/log4j2-configuration-not-found-when-running-standalone-application-built-by-shad
https://stackoverflow.com/questions/27361052/failing-to-load-log4j2-while-running-fatjar
一行命令同时修改maven项目中多个mudule的版本号
https://mp.weixin.qq.com/s/RdIStsQbn3WGTGZ2DHQBDg
`
maven之所以强大,是因为他有一个牛X的插件机制。我们可以借助一个插件来实现这个功能。
这个插件就是versions-maven-plugin。使用方法也很简单,就是在最外层的pom文件中的plugins块中,增加一下对应的插件配置。
`
Maven打包时自动增加时间戳
https://mp.weixin.qq.com/s/6payM2tKOqV0JH3sZfBGMA
`
1.使用Maven自带的时间戳
// 或
2.使用build-helper-maven-plugin
`
jar包的打包方式调研
http://maven.apache.org/plugins/index.html #official & comprehensive
http://maven.apache.org/plugins/maven-jar-plugin/
http://maven.apache.org/plugins/maven-dependency-plugin/
http://maven.apache.org/plugins/maven-assembly-plugin/
http://maven.apache.org/plugins/maven-shade-plugin/
http://one-jar.sourceforge.net/
maven deploy时报错
https://my.oschina.net/wjzk/blog/602372
repository element was not specified in the POM inside distributionManagement element or in -DaltDep loymentRepository=id::layout::url parameter
https://stackoverflow.com/questions/27153024/repository-element-was-not-specified-in-the-pom-inside-distributionmanagement-el
`
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy (default-deploy) on project client: Deployment failed: repository element was not specified in the POM inside distributionManagement element or in -DaltDeploymentRepository=id::layout::url parameter -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
`
http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException