焦点

反序列化命令执行漏洞

时间:2010-12-5 17:23:32  作者:知识   来源:热点  查看:  评论:0
内容摘要:2015年,Apache Commons Collections 3.2.1被曝出一个反序列化漏洞,编号CVE-2015-4852。WebLogic、JBoss、Jenkins、OpenNMS——一大

2015年,反序Apache Commons Collections 3.2.1被曝出一个反序列化漏洞,列化漏洞编号CVE-2015-4852。命令WebLogic、执行JBoss、反序Jenkins、列化漏洞OpenNMS——一大串Java应用全部中招。命令攻击者只需要向服务器发送一段精心构造的执行序列化数据,就能在目标机器上执行任意命令。反序这不是列化漏洞某个程序员写错了某行代码,而是命令Java语言本身的一个特性被拧成了武器。

要理解这件事,执行得先搞清楚序列化和反序列化到底在干什么。反序序列化就是列化漏洞把内存里的对象变成字节流,方便存文件或者走网络传输。命令反序列化是反过来,把字节流还原成对象。听起来很中性,问题出在还原的过程中——Java允许类自定义readObject方法,在反序列化时自动调用。这个设计本来是为了让开发者能在对象恢复时做一些初始化工作,但如果有类的readObject方法里恰好能触发某些危险操作,攻击者就能通过构造数据来操控这条执行链。

gadget chain:把零散的代码片段拼成一把刀

单独一个类的readObject通常做不了太出格的事。真正的杀伤力来自“链”——攻击者找到一条从反序列化入口到命令执行出口的调用路径,中间经过若干个类的方法调用。安全圈管这叫gadget chain,中文一般叫“利用链”。

以Commons Collections那条经典链为例:AnnotationInvocationHandler的readObject会调用Map的entrySet,如果这个Map被替换成TransformedMap,就会触发Transformer的transform方法。而ChainedTransformer可以把多个Transformer串起来,最终通过InvokerTransformer反射调用Runtime.exec()。整条链上每个类单独看都没问题,拼在一起就成了远程命令执行。

这种利用方式之所以难防,是因为它不是某个应用自身的bug。你写了一个完全正确的业务系统,只要classpath里存在这些库,就可能被攻击。Java生态里大量基础库——Spring、Groovy、BeanUtils、JDK自带的类——都曾被挖出可用作gadget的类。攻击面不是你的代码,是你依赖的整个生态。

为什么Java反序列化特别容易出问题

Java反序列化的核心问题是:它信任输入。readObject里做了什么,调用方完全不知道,也没有机制去限制。

对比一下其他语言。Python的pickle有类似问题,但Python社区对pickle的危险性有共识,文档里明确警告不要反序列化不可信数据。Java这边,大量框架默认使用Java原生序列化做RPC、做缓存、做消息传递,开发者往往意识不到传输的数据可能被篡改。

防御不是加个WAF就完事

很多人第一反应是上WAF拦恶意流量。流量层面的特征匹配能挡住已知的利用链,但改一改字节码、换个gadget组合,规则就可能失效。更靠谱的做法是从根上切断:能用JSON就不用Java原生序列化;必须用时,加ObjectInputFilter白名单,只允许特定类被反序列化。JDK 9引入了这个机制,但实际部署中开启白名单的应用并不多。

另一个常被忽略的点是依赖管理。你用的每一个第三方库都可能成为gadget chain的一环。mvn dependency:tree拉出来看看,心里有个数。

反序列化漏洞的本质是信任边界的问题。数据从不可信来源进入,经过一串你控制不了的代码路径,最终到达了危险操作。修单个gadget没用,得重新画那条信任边界。

最近更新
热门排行
copyright © 2026 powered by 力不从心网   sitemap