【信息安全服务】代码审计之反序列化漏洞分析

1.Java反序列化

序列化是用于将对象转换成二进制串存储起来,而反序列化则是相反,将二进制串转化为对象。Java的反射机制可以为日常开发提供众多遍历,但这样的设计同样存在安全风险。通过反射机制攻击者可以越过Java的静态检查和类型约束,直接访问并且修改目标对象的属性和状态。

2.关键函数

ObjectInputStream()

readObject()

当程序设计人员使用ObjectInputStream的readObject方法进行对象读取时,readObject方法可能会造成恶意代码被执行的风险。

import org.apache.commons.lang.SerializationUtils:
    public ClusterConfig getClusterConfig(){
        if (getConfBytes() == null) {
               return null;
        }
        return (ClusterConfig) SerializationUtils.deserializa(getConfBytes());

private static void deserialize() throws FileNotFoundException,IOException,ClassNotFoundException {
    FileInputStream fis = new FileInputStream(new File(pathname:"person.ser"));
    ObjectInputStream ois = new ObjectInputStrem(fis);
    Person p = (Person)ois.readObject();
    System.out.printIn("name:"+p.getName()+" age"+p.getAge());
}

3.常见几类反序列化漏洞

(0x1)Weblogic

XMLDecoder 反序列化漏洞(如CVE-2017-3506、CVE-2017-10271、CVE-2019-2725)

JRMP反序列化漏洞(CVE-2015-4852 CVE-2016-0638 CVE-2016-3510 CVE-2017-3428 CVE-2018-2628 CVE-2018--2893))

 (0x2) Spring JNDI 反序列化漏洞

 (0x3) Fastjson 反序列化漏洞 

(0x4) Jackson 反序列化漏洞 (CVE-2019.12086 CVE-2019-12384 CVE-2019-14361 CVE-2019-14379)

4.框架层面的主动防护

     JEP 290是Oracle针对Java反序列化提出的一种增强安全机制,并在JDK6u141、7u131、8u121及最新的JDK9和10进行了集

成;

JEP290为用户用户提供一个更加简单有效并且可配置的过滤机制,以及对RMI导出对象执行检查。其核心实际上就是提供了一个

名为ObjectInputFilter的接口,用户在进行反序列化操作的时候,将filter设置给ObjectInputStream对象。这里就是用的

setInternalObjectInputFilter方法:

private final void setInternal0bjectInputFilter(0bjectInputFilter filter) {
    SecurityManager sm = System.getSecurityManager();
    if (sm != null) {
        sm.checkPermission(new SerializablePermission(name: " serialFilter"));
    }
    if (serialFilter != null && serialFilter != ObjectInputFilter.Config.getSerialFilter()) {
        throw new IllegalStateException("filter can not be set more than once" );
    }
    this.serialFilter = filter;
}

 

你可能感兴趣的:(信息安全服务笔记及分享)