最近发现目前使用的Spring-web 5.xx 系列存在RCE(remote code execution) 的问题,讲的是当对不可信的数据进行反序列化之时,没有进行有效的验证,会允许攻击者控制执行的状态或流程。当然CVE-2016-1000027叙述中也提到了这个问题只是有可能存在,在于此工具包如何在产品中实现,对数据的验证可能是需要的。
而在spring-web 6.xx 系列,则不存在这个问题了,但若想升级到6.xx,发现此版本是存在于 spring-boot-starter-web 3.xx之中的,而对于Spring boot 3.xx,同Spring 6.xx 一样,需要基于JDK 17 的运行环境。
比如环境使用的是JDK 8, 若强行单个包的升级,比如单纯将spring-web 升级到6.xx的版本,则会报“class file has wrong version 61.0, should be 52.0” 的问题,说的是class类是基于61编译的,但是运行环境是52. 对于Major version 和 java SE的对照关系,常见的我们知道java 6 的major verson 是 50, 往上逐次相加,java 8 对应的是52,java 17 对应的则是 61。
所以若想升级spring-web 到6.xx,必须至少将JDK升级到17。否则可以看看项目是否真的存在RCE的vulnerablility问题,若能做到对接收数据的验证,确保是对可信任数据的序列化,则可以规避此问题。
值得一提的是在Spring-boot 3.0 中,开始使用了Jakarta(Jakarta EE 9 APIs)替代javax, 而这个 Jakarta EE 9 却是依然可以运行在JDK 8 上的。
参考内容:
https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web/3.0.0
https://stackoverflow.com/questions/57775378/deserialization-of-untrusted-data-in-jms-security-issue
https://security.snyk.io/vuln/SNYK-PHP-CODECEPTIONCODECEPTION-1324585
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-1000027
https://docs.oracle.com/javase/specs/jvms/se19/html/jvms-4.html#jvms-4.1-200-B.2
https://stackoverflow.com/questions/74648576/java-class-file-has-wrong-version-61-0-should-be-55-0