文章总结: 文章梳理JDK对JNDI利用的修复历史,指出安全加固已覆盖JDK8。OpenJDK8u432及OracleJDK8u461起禁止LDAP反序列化,OracleJDK8u471起限制第三方ObjectFactory。这将显著增加JDK8环境下JNDI注入利用难度,传统攻击载荷将失效。 综合评分: 89 文章分类: 漏洞分析,漏洞预警,WEB安全
jdk8或许也要告别JNDI利用了
原创
珂字辈
珂技知识分享
2026年1月10日 09:00 湖北
一,前言
关于java漏洞的利用,无论是原生反序列化,fastjson反序列化,yaml反序列化,xml反序列化,log4j2,jdbc,SSTI等等,都有可能转到JNDI上进一步利用。
为此ldap/rmi协议利用工具百花齐放,从远程类加载到反序列化绕过到ObjectFactory绕过,一个又一个议题被抛出来供安全研究。
为此java也做出了几次重大更新,在我以前的文章提到过。
最近跟jdbc有关的新知识——ldap篇
jdk17对java安全的影响
二,JNDI修复历史
第一个重大更新,也是最为人熟知的防止远程类加载(俗称JNDI注入)的开关。
于8u121/7u131/6u141引入
com.sun.jndi.rmi.object.trustURLCodebase=false
防止rmi协议加载远程类。
这次补丁也比较出名叫做JEP 290,同时还引入了ObjectInputFilter以支持反序列化过滤器,并以此来对rmi协议中存在反序列化的地方进行过滤。
比如DGCImpl/RegistryImpl/SingleEntryRegistry等类,它们都有各自实现的ObjectInputFilter。但也产生了两次bypass分别于8u121-8u231和8u231-8u241。
于11.0.1/8u191/7u201/6u211引入
com.sun.jndi.ldap.object.trustURLCodebase=false
防止ldap协议加载远程类。
这也是为什么基本大家都爱用ldap协议工具的原因,除了基本覆盖rmi协议的各种利用之外,它的修复也稍微迟一点。
这次修复之后JNDI的利用基本都需要bypass,也就是反序列化和ObjectFactory。
第二个重大更新,防止ldap协议反序列化的开关。
于jdk11引入(默认为true不影响反序列化利用)
com.sun.jndi.ldap.object.trustSerialData=true
于jdk20默认为false
com.sun.jndi.ldap.object.trustSerialData=false
自此,绝大部分的JNDI 反序列化 bypass都无法使用,甚至还波及了ldap协议中的部分ObjectFactory bypass。详情见前文。
第三个重大更新,防止非内置ObjectFactory的过滤器。
于JDK20引入
jdk.jndi.rmi.object.factoriesFilter=com.sun.jndi.rmi.**;!*jdk.jndi.ldap.object.factoriesFilter=com.sun.jndi.ldap.**;!*
就是默认只允许使用jdk自带的ObjectFactory,别再想着第三方ObjectFactory bypass了。
至此,所有的JNDI利用都被堵了个遍,唯一的漏网之鱼是rmi协议中的StreamRemoteCall.executeCall(),详情还是翻前面的文章。
三,jdk8也受影响
这个时候小伙伴们就会抛出那句名言了,你修任你修,我用jdk8。然而遗憾的是,最近我在做安全研究的时候无意中发现,这股妖风也吹到jdk8了。。。
第二个重大更新,防止ldap协议反序列化的开关。
https://bugs.openjdk.org/browse/JDK-8290367
如下版本开始trustSerialData=false
openjdk 8u432/11.0.25/17.0.13
oraclejdk 8u461/11.0.28/17.0.16
第三个重大更新,防止非内置ObjectFactory的过滤器。
https://bugs.openjdk.org/browse/JDK-8290368
如下版本开始增加factoriesFilter
openjdk 17.0.17(8和11暂时未修复)
oraclejdk 8u471/11.0.29/17.0.17
详情
https://www.oracle.com/java/technologies/javase/8u461-relnotes.html
https://www.oracle.com/java/technologies/javase/8u471-relnotes.html
https://docs.redhat.com/en/documentation/red_hat_build_of_openjdk/8/html/release_notes_for_red_hat_build_of_openjdk_8.0.432/openjdk-80432-release-notes_openjdk
https://github.com/openjdk/jdk11u/blob/be7966c633830516c703f14610e4fef1bbe7f57d/src/java.naming/share/classes/com/sun/naming/internal/ObjectFactoriesFilter.java
https://github.com/openjdk/jdk8u/blob/976d0a196ce036c40147535209b80143e021c2fe/jdk/src/share/classes/com/sun/naming/internal/ObjectFactoriesFilter.java
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:珂技知识分享 珂字辈《jdk8或许也要告别JNDI利用了》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论