【修復(fù)總結(jié)】JAVA反序列化

威脅說(shuō)明

如果Java應(yīng)用對(duì)用戶輸入例诀,即不可信數(shù)據(jù)做了反序列化處理朽肥,那么攻擊者可以通過(guò)構(gòu)造惡意輸入,讓反序列化產(chǎn)生非預(yù)期的對(duì)象尽楔,非預(yù)期的對(duì)象在產(chǎn)生過(guò)程中就有可能帶來(lái)任意代碼執(zhí)行投储。

問(wèn)題原因

  • ObjectInputStream在反序列化時(shí),沒(méi)有對(duì)生成的對(duì)象的輸入做限制阔馋,使攻擊者利用反射調(diào)用函數(shù)進(jìn)行任意命令執(zhí)行玛荞。
  • CommonsCollections組件中對(duì)于集合的操作存在可以進(jìn)行反射調(diào)用的方法

問(wèn)題根源

Apache Commons Collections允許鏈?zhǔn)降娜我獾念惡瘮?shù)反射調(diào)用。

問(wèn)題函數(shù)

org.apache.commons.collections.Transformer接口

問(wèn)題版本

3.2.2之前所有版本

快速排查

目前打包有apache commons collections庫(kù)并且應(yīng)用比較廣泛的主要中間件有Jenkins呕寝、WebLogic勋眯、JbossWebSphere下梢、OpenNMS等客蹋。

如果使用了以上中間件,需檢測(cè)中間件安裝目錄是否包含apache commons collections庫(kù)及其版本孽江。特別是項(xiàng)目中發(fā)現(xiàn)使用了readObject函數(shù)阴孟。如:

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聚谁,請(qǐng)參考修復(fù)建議冻晤。

修復(fù)建議

1. 通用修復(fù)方案

方法:更新Apache Commons Collections庫(kù)至3.2.2及以上版本。

警告:此方法為中間件上游修復(fù)方案这刷,如果使用了中間件婉烟,請(qǐng)查看對(duì)應(yīng)中間件的修復(fù)方案。

官方版本說(shuō)明:https://commons.apache.org/proper/commons-collections/release_3_2_2.html


2. spring-boot-starter-actuator

  • 僅開放需要的接口:
endpoints.enabled = false
endpoints.metrics.enabled = true
  • 開啟賬戶密碼認(rèn)證:
  1. 引入spring-boot-starter-security依賴
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
  1. 在application.properties中指定actuator的端口以及開啟security功能暇屋,配置訪問(wèn)權(quán)限驗(yàn)證:
management.port=8099
management.security.enabled=true
security.user.name=xxxxx
security.user.password=xxxxxx

參考鏈接:
https://xz.aliyun.com/t/2233
http://www.reibang.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 無(wú)影響
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 無(wú)影響
RHEV Manager 3 jasperreports-server-pro 受攻擊

官方升級(jí)補(bǔ)端圃:https://access.redhat.com/security/cve/cve-2015-7501


4. WebLogic

影響版本:10.3.6.012.1.2.0率碾、12.1.3.0叔营、12.2.1.0

官方升級(jí)補(bǔ)段荼搿: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仔粥。

修復(fù)方案:(參考:https://jenkins.io/security/advisory/2015-11-11/

  • Jenkins主線版本用戶應(yīng)該升級(jí)至1.638或以上。
  • Jenkins LTS版本用戶應(yīng)該升級(jí)至1.625.2或以上。

臨時(shí)方案:(參考https://github.com/jenkinsci-cert/SECURITY-218

  1. 在Groovy腳本控制臺(tái)(/script)運(yùn)行下面的代碼躯泰,這將關(guān)閉正在運(yùn)行的Jenkins的CLI子系統(tǒng)谭羔,而無(wú)需重新啟動(dòng)。
  2. 將下面的代碼放到$JENKINS_HOME/init.groovy.d/cli-shutdown.groovy麦向,保證確保在主機(jī)重啟后保護(hù)保持不變瘟裸。
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(官方已停止維護(hù))

官方補(bǔ)丁:

提示:以上IBM提供的補(bǔ)丁連接,需輸入登錄賬號(hào)后才能下載诵竭。

注意:在打補(bǔ)丁之前請(qǐng)先關(guān)閉WebSphere服務(wù)话告,安裝完成后再將服務(wù)開啟。


7. 臨時(shí)方案

如果無(wú)法打補(bǔ)丁卵慰,以下為各中間件官方推薦的臨時(shí)方案:

  • 方式1:使用SerialKiller替換進(jìn)行序列化操作的ObjectInputStream類沙郭。

  • 方式2:在不影響業(yè)務(wù)的情況下,刪除所有commons-collections包中的InvokerTransformer.class裳朋、InstantiateFactory.class病线、InstantiateTransformer.class,例如:

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

警告:臨時(shí)方案中任何變動(dòng)都需手動(dòng)驗(yàn)證業(yè)務(wù)可用性鲤嫡。


8. 強(qiáng)制封禁方案

嚴(yán)格意義說(shuō)起來(lái)送挑,Java相對(duì)來(lái)說(shuō)安全性問(wèn)題比較少,出現(xiàn)的一些問(wèn)題大部分是利用反射暖眼,最終用Runtime.exec(String cmd)函數(shù)來(lái)執(zhí)行外部命令的让虐。

如果可以禁止JVM執(zhí)行外部命令,未知漏洞的危害性會(huì)大大降低罢荡,可以大大提高JVM的安全性赡突。

如下,只要在Java代碼里簡(jiǎn)單加一段程序区赵,就可以禁止執(zhí)行外部程序了惭缰。

SecurityManager originalSecurityManager = System.getSecurityManager();
if (originalSecurityManager == null) {
    // 創(chuàng)建自己的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!");
                }
            }
            // 禁止設(shè)置新的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);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市笼才,隨后出現(xiàn)的幾起案子漱受,更是在濱河造成了極大的恐慌,老刑警劉巖骡送,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昂羡,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡摔踱,警方通過(guò)查閱死者的電腦和手機(jī)虐先,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)派敷,“玉大人蛹批,你說(shuō)我怎么就攤上這事撰洗。” “怎么了腐芍?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵差导,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我猪勇,道長(zhǎng)设褐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任泣刹,我火速辦了婚禮络断,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘项玛。我一直安慰自己貌笨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布襟沮。 她就那樣靜靜地躺著锥惋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪开伏。 梳的紋絲不亂的頭發(fā)上膀跌,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音固灵,去河邊找鬼捅伤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛巫玻,可吹牛的內(nèi)容都是我干的丛忆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼仍秤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼熄诡!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起诗力,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤凰浮,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后苇本,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體袜茧,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年瓣窄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了笛厦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡康栈,死狀恐怖递递,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情啥么,我是刑警寧澤登舞,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站悬荣,受9級(jí)特大地震影響菠秒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜氯迂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一践叠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嚼蚀,春花似錦禁灼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至导帝,卻和暖如春守谓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背您单。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工斋荞, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人虐秦。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓平酿,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親悦陋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子染服,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容