【修复总结】JAVA反序列化

威胁说明

如果Java应用对用户输入,即不可信数据做了反序列化处理,那么攻击者可以通过构造恶意输入,让反序列化产生非预期的对象,非预期的对象在产生过程中就有可能带来任意代码执行。

问题原因

  • ObjectInputStream在反序列化时,没有对生成的对象的输入做限制,使攻击者利用反射调用函数进行任意命令执行。
  • CommonsCollections组件中对于集合的操作存在可以进行反射调用的方法

问题根源

Apache Commons Collections允许链式的任意的类函数反射调用。

问题函数

org.apache.commons.collections.Transformer接口

问题版本

3.2.2之前所有版本

快速排查

目前打包有apache commons collections库并且应用比较广泛的主要中间件有JenkinsWebLogicJbossWebSphereOpenNMS等。

如果使用了以上中间件,需检测中间件安装目录是否包含apache commons collections库及其版本。特别是项目中发现使用了readObject函数。如:

ls -R 安装目录 | grep commons-collections.jar
ls -R 安装目录 | grep *.commons-collections.jar
ls -R 安装目录 | grep apache.commons.collections.jar
ls -R 安装目录 | grep *.commons-collections.*.jar

如果包含,且版本低于3.2.2,请参考修复建议。

修复建议

1. 通用修复方案

方法:更新Apache Commons Collections库至3.2.2及以上版本。

警告:此方法为中间件上游修复方案,如果使用了中间件,请查看对应中间件的修复方案。

官方版本说明:https://commons.apache.org/proper/commons-collections/release_3_2_2.html


2. spring-boot-starter-actuator

  • 仅开放需要的接口:
endpoints.enabled = false
endpoints.metrics.enabled = true
  • 开启账户密码认证:
  1. 引入spring-boot-starter-security依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
  1. 在application.properties中指定actuator的端口以及开启security功能,配置访问权限验证:
management.port=8099
management.security.enabled=true
security.user.name=xxxxx
security.user.password=xxxxxx

参考链接:
https://xz.aliyun.com/t/2233
https://www.jianshu.com/p/3162ce30a853


3. Jboss

影响版本:

Platform Package State
Red Hat Subscription Asset Manager 1 jasperreports-server-pro 受攻击
Red Hat OpenStack Platform 8.0 (Liberty) opendaylight 无影响
Red Hat JBoss Portal 5 jbossas 受攻击
Red Hat JBoss Fuse Service Works 6 jbossas 受攻击
Red Hat JBoss Enterprise SOA Platform 5 JBossAS 受攻击
Red Hat JBoss Enterprise SOA Platform 5 jbossas 受攻击
Red Hat JBoss Enterprise SOA Platform 4 JBossAS 受攻击
Red Hat JBoss EWS 2 tomcat 无影响
RHEV Manager 3 jasperreports-server-pro 受攻击

官方升级补丁:https://access.redhat.com/security/cve/cve-2015-7501


4. WebLogic

影响版本:10.3.6.012.1.2.012.1.3.012.2.1.0

官方升级补丁:https://www.oracle.com/technetwork/topics/security/alert-cve-2015-4852-2763333.html


5. jenkins

影响版本:

  • 所有低于1.637Jenkins主线版本,包括1.637
  • 所有低于1.625.1Jenkins LTS版本,包括1.625.1

修复方案:(参考:https://jenkins.io/security/advisory/2015-11-11/

  • Jenkins主线版本用户应该升级至1.638或以上。
  • Jenkins LTS版本用户应该升级至1.625.2或以上。

临时方案:(参考https://github.com/jenkinsci-cert/SECURITY-218

  1. 在Groovy脚本控制台(/script)运行下面的代码,这将关闭正在运行的Jenkins的CLI子系统,而无需重新启动。
  2. 将下面的代码放到$JENKINS_HOME/init.groovy.d/cli-shutdown.groovy,保证确保在主机重启后保护保持不变。
import jenkins.*;
import jenkins.model.*;
import hudson.model.*;

// disabled CLI access over TCP listener (separate port)
def p = AgentProtocol.all()
p.each { x ->
  if (x.name.contains("CLI")) p.remove(x)
}

// disable CLI access over /cli URL
def removal = { lst ->
  lst.each { x -> if (x.getClass().name.contains("CLIAction")) lst.remove(x) }
}
def j = Jenkins.instance;
removal(j.getExtensionList(RootAction.class))
removal(j.actions)

6. websphere

影响版本:

  • WebSphere Application Server ND Version V9.0.0.0 – V9.0.0.11
  • WebSphere Application Server ND Version V8.5.0.0 – V8.5.5.15
  • WebSphere Virtual Enterprise Version 7.0(官方已停止维护)

官方补丁:

提示:以上IBM提供的补丁连接,需输入登录账号后才能下载。

注意:在打补丁之前请先关闭WebSphere服务,安装完成后再将服务开启。


7. 临时方案

如果无法打补丁,以下为各中间件官方推荐的临时方案:

  • 方式1:使用SerialKiller替换进行序列化操作的ObjectInputStream类。

  • 方式2:在不影响业务的情况下,删除所有commons-collections包中的InvokerTransformer.classInstantiateFactory.classInstantiateTransformer.class,例如:

zip -d commons-collections-3.2.1.redhat-3.jar org/apache/commons/collections/functors/InvokerTransformer.class

警告:临时方案中任何变动都需手动验证业务可用性。


8. 强制封禁方案

严格意义说起来,Java相对来说安全性问题比较少,出现的一些问题大部分是利用反射,最终用Runtime.exec(String cmd)函数来执行外部命令的。

如果可以禁止JVM执行外部命令,未知漏洞的危害性会大大降低,可以大大提高JVM的安全性。

如下,只要在Java代码里简单加一段程序,就可以禁止执行外部程序了。

SecurityManager originalSecurityManager = System.getSecurityManager();
if (originalSecurityManager == null) {
    // 创建自己的SecurityManager
    SecurityManager sm = new SecurityManager() {
        private void check(Permission perm) {
            // 禁止exec
            if (perm instanceof java.io.FilePermission) {
                String actions = perm.getActions();
                if (actions != null &amp;&amp; actions.contains("execute")) {
                    throw new SecurityException("execute denied!");
                }
            }
            // 禁止设置新的SecurityManager
            if (perm instanceof java.lang.RuntimePermission) {
                String name = perm.getName();
                if (name != null &amp;&amp; name.contains("setSecurityManager")) {
                    throw new SecurityException(
                    "System.setSecurityManager denied!");
                }
            }
        }
        @Override
        public void checkPermission(Permission perm) {
            check(perm);
        }
        @Override
        public void checkPermission(Permission perm, Object context) {
            check(perm);
        }
    };
    System.setSecurityManager(sm);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容