XXXX应对JNDI注入攻击的防护技战法
JNDI是Java提供的一个目录服务应用程序接口(API),它提供一个目录系统,并将服务名称与对象关联起来,从而使得开发人员在开发过程中可以使用名称来访问对象 。JNDI提供的服务中LDAP、RMI服务支持从指定的远程服务器上下载class文件,加载到本地JVM中,并通过适当的方式创建对象,在这个过程中,class文件中static代码块以目标对象的构造方法将被调用,从而造成任意代码执行。Log4j2、Fastjson、Kafka、H2等三方组件的远程代码执行漏洞其底层漏洞逻辑仍为JNDI注入攻击,故成功防护JNDI注入攻击则可大量减少服务器应用漏洞被成功利用的风险。
一、JNDI注入攻击防护策略
(1)、限制服务器出网策略
JNDI注入攻击均需通过调用InitialContext类的lookup()方法,其方法传参类型为String字符串格式为恶意服务器地址:端口/恶意服务,故想要利用JNDI进行恶意类加载造成任意代码执行则需受攻击服务器访问恶意服务器。根据此原理为防御JNDI注入,我方对所有服务器出网策略进行严格限制,仅可访问白名单内IP地址,从网络层面防护JNDI注入攻击。
(2)、修改JDK配置
JNDI注入利用从技术原理上分为RMI服务利用及LDAP服务利用,不同服务受限于不同JDK版本,详情如下:
RMI服务利用受限于JDK中com.sun.jndi.rmi.object.trustURLCodebase
、com.sun.jndi.cosnaming.object.trustURLCodebase
两个属性限制,JDK 8u121, 7u131, 6u141之后上述两个属性的默认值修改为false,修复了RMI从恶意服务器加载clss类的安全问题。
LDAP服务利用受限于JDK中com.sun.jndi.ldap.object.trustURLCodebase属性限制,JDK 11.0.1, 8u191, 7u201, 6u211之后上述配置默认值修改为false, 修复了LDAP从恶意服务器加载clss类的安全问题。
综上,为防御JNDI注入攻击,我方将所有服务器中JDK版本在JDK 11.0.1, 8u191, 7u201, 6u211之下的服务器com.sun.jndi.rmi.object.trustURLCodebase
、com.sun.jndi.cosnaming.object.trustURLCodebase
、com.sun.jndi.ldap.object.trustURLCodebase
属性均修改为false,从漏洞利用原理层面防护JNDI注入攻击。
(3)、流量监控
正如第一条所述,若要成功利用JNDI进行恶意类加载造成任意代码执行则需受攻击服务器访问恶意服务器且下载恶意class文件进行类加载,其中下载恶意class文件为http协议,又因class文件存在标识-魔数且值固定为
0xCAFEBABE,若Class文件头四个字节不是0xCAFEBABE则无法加载。故我方在流量检测设备中对返回包中后缀为.class且文件头为0xCAFEBABE请求进行告警拦截,从漏洞利用层面防护JNDI注入攻击。
二、技战法总结
针对JNDI注入攻击,我方深入分析漏洞利用原理,总结出相应的漏洞利用条件,使用网络访问限制、漏洞调用链限制、漏洞利用请求限制三个方法进行防守,修改大量业务服务器出网策略及JDK属性,在安全设备添加自定义规则成功防御JNDI注入攻击,目前所有业务系统安全平稳运行。
如您有问题、建议、需求、合作、加群交流请后台留言或添加微信
原文始发于微信公众号(白给信安):技战法分享
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论