威脅說(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
勋眯、Jboss
、WebSphere
下梢、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)證:
- 引入spring-boot-starter-security依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
- 在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.0
、12.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.637
的Jenkins
主線版本所宰,包括1.637
。 - 所有低于
1.625.1
的Jenkins 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)
- 在Groovy腳本控制臺(tái)(/script)運(yùn)行下面的代碼躯泰,這將關(guān)閉正在運(yùn)行的Jenkins的CLI子系統(tǒng)谭羔,而無(wú)需重新啟動(dòng)。
- 將下面的代碼放到
$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 && actions.contains("execute")) {
throw new SecurityException("execute denied!");
}
}
// 禁止設(shè)置新的SecurityManager
if (perm instanceof java.lang.RuntimePermission) {
String name = perm.getName();
if (name != null && 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);
}