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;
}