Java当中更改源码/修复CVE-2016-1000027漏洞分析

Java当中更改源码/修复CVE-2016-1000027漏洞分析

1、基础知识

​ 要想分析首先要了解什么是Spring HTTP Invoker,HttpInvoker是基于HTTP之上提供RPC,同时又使用了Java的对象序列化机制,实现了穿透防火墙或多系统之间的通信。

​ 具体的实现过程很复杂,我们不用太深入的去了解,只需要知道HttpInvoker主要是使用http协议通过传输序列化数据来实现通信,一旦传输序列化数据,如果使用不当就会产生反序列化漏洞。

2、漏洞成因

​ 漏洞版本:spring-web<6.0版本中

​ 漏洞发生在,HttpInvokerServiceExporter和RemoteInvocationSerializingExporter中,序列化数据未进行检测,当传输恶意序列化数据的时候,反序列化中就会执行恶意代码。

​ 首先查看漏洞的存在位置,这里可以看到执行的栈关系:

调用层级如下所示,首先通过handleRequest接收发送来的数据,然后调用readRemoteInvocation,createObjectInputStream最后通过doReadRemoteInvocation的readObject实现反序列化。

httpinvoker.HttpInvokerServiceExporter.handleRequest
	httpinvoker.HttpInvokerServiceExporter.readRemoteInvocation
		RemoteInvocationSerializingExporter.createObjectInputStream
			RemoteInvocationSerializingExporter.doReadRemoteInvocation
				RemoteInvocationSerializingExporter.readObject

image-20230803092348343

3、解决方法一:修改源码

漏洞修复其实直接升级到6.0版本就可以了,但是麻烦的点在于:

spring-web 6.0版本变动比较大,6.0之后jdk1.8的版本就不支持了.

转而Spring6jdk版本要求至少jdk17以上

对maven版本的要求是3.6以上

image-20230803094309967

项目中使用的jBPM 6.2.0和Hibernate 4.2不兼容Spring Framework 6 ,Spring Framework 6需要JPA 2.2或更高版本,Hibernate 4.2也是基于JPA 2.0的,与Spring Framework 6不兼容。这样的话要想修复漏洞就不能采用升级的方式,只能手工修复:

1. 第一种方案就是添加执行限制,对序列化数据进行限制,如果存在调用恶意cc链就禁止,但是这样存在被绕过风险,并不安全
2. 第二种方案就是直接把HttpInvokerServiceExporter功能关闭,如果业务上没有使用并不会产生什么影响。
这里就采用第二种方案,将handleRequest方法置空,关闭其回调。

修改后代码如下:

image-20230803092530207

3.1、修改源码

以spring-web这个包为例.本质上来说就是创建一个和HttpInvokerServiceExporter.class内容相同的HttpInvokerServiceExporter.java的文件,然后在handleRequest中去除那段多余的代码,然后将HttpInvokerServiceExporter.java文件生成一个新的.class文件,然后将新的.class文件替换到原来的spring-web的原jar包中;

image-20230803092909764

1.将新生成的HttpInvokerServiceExporter.java文件放到这个目录下面
2.进入cmd
3.javac -cp C:\Users\wonder\Desktop\spring-web漏洞修复\jar\* HttpInvokerServiceExporter.java
4.cp是指向这个HttpInvokerServiceExporter.java依赖的jar包的位置,javac是将.java文件生成.class文件

image-20230803093219243

5.如果在执行javac -cp C:\Users\wonder\Desktop\spring-web漏洞修复\jar\* HttpInvokerServiceExporter.java出现了notfound的时候,检查自己的依赖是否正确,直到执行命令之后无异常.

image-20230803093439639

6.执行命令成功之后会在当前目录下面生成.class文件,然后将生成的.class文件直接替换到原有的jar中的位置即可.

image-20230803093617717

7.复制这两个.class文件,将spring-web-5.3.29.jar通过解压工具预览,注意不要解压;找到原来当中这个文件在jar中的原始位置;

image-20230803093737744

8.替换即可;打开idea刷新maven之后重新验证,可以看到已经成功修改;

image-20230803093939768

反编译工具:
jd-gui:https://github.com/java-decompiler/jd-gui/releases

参考:

CVE-2016-1000027分析

手动实现第三方jar包修改并重新打包

4、解决方法二:拦截器AOP

package com.wondertek.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * CVE-2016-1000027安全漏洞补丁方案
 * https://blog.csdn.net/u011628753/article/details/130961609
 */
@Component
@Aspect
@Slf4j
public class HttpInvokerServiceExporterAspect {

    /**
     * 设置AOP切点
     */
    @Pointcut("execution(* org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter.handleRequest(..))")
    public void mypointcut() {
    }


    /**
     * 执行方法环绕
     *
     * @param point
     */
    @Around(value = "mypointcut()")
    public Object aroundHandleRequest(ProceedingJoinPoint point) throws Throwable {
        log.info("-----------禁用org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter.handleRequest,防止CVE-2016-1000027安全漏洞------------");
        return null;
    }
}

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java小白笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值