安全研究所 | JNDI注入的一种新攻击面-CVE-2024-20931分析

💡 原文中文,约1600字,阅读约需4分钟。
📝

内容提要

Oracle官方发布的2024年1月补丁修复了Weblogic T3\IIOP协议的远程命令执行漏洞CVE-2024-20931。该漏洞由亿格云安全研究员Glassy在2023年10月提交给Oracle。补丁限制了绑定ForeignOpaqueReference对象时对jndiEnvironment中providerURL的设置,并对lookup的JNDI链接的协议做了严格限制。漏洞的挖掘还有可能通过寻找其他实现OpaqueReference接口的类的getReferent函数,绕过补丁中的JNDIUtils.isValidJndiScheme函数,以及在java.naming.provider.url为空的情况下寻求代码执行的可能性。

🔎

延伸解读

补丁绕过与攻击面转移

CVE-2024-20931本质上是CVE-2023-21839补丁的绕过。Oracle在2023年1月补丁中限制了ForeignOpaqueReference对象绑定时的providerURL设置,并严格限制lookup的JNDI协议,直接堵死了原有攻击路径。但攻击者将关注点从lookup函数转移到Context初始化阶段,利用AQjmsInitialContextFactory在初始化时通过JNDI获取远程DataSource的特性,实现了二次JNDI注入,最终达成远程代码执行。这种思路的转变值得防守方注意。

漏洞挖掘的潜在方向

文章指出了三条可能的绕过路径:一是寻找其他实现OpaqueReference接口的类的getReferent函数,例如ForeignOpaqueReference在两个包路径下存在细微差异;二是尝试绕过JNDIUtils.isValidJndiScheme函数;三是在java.naming.provider.url为空时,利用其他可控环境变量,通过指定java.naming.factory.initial来创造代码执行条件。虽然作者在第二条路径上未成功,但第三条路径的成功表明,对InitialContextFact

Oracle后续修复与遗留风险

在CVE-2024-20931之后,Oracle在后续补丁中对java.naming.factory.initial的设置增加了验签处理,进一步提高了利用门槛。但文章指出,jndiEnvironment中仍有一些属性可以设置,能否找到新的绕过方式需要更深入的研究。这意味着Weblogic的JNDI注入风险并未完全消除,安全研究人员和运维人员仍需关注T3/IIOP协议的安全配置,及时应用最新补丁,并限制不必要的JNDI环境属性。

❓

Q&A

CVE-2024-20931是什么漏洞?

CVE-2024-20931是一个基于Weblogic T3/IIOP协议的远程命令执行漏洞,由亿格云安全研究员Glassy在2023年10月提交给Oracle,属于CVE-2023-21839补丁的绕过。

CVE-2023-21839漏洞的原理是什么?

当Weblogic通过T3/IIOP绑定的远程对象实现了OpaqueReference接口时,对该对象进行lookup会调用其getReferent函数。ForeignOpaqueReference的getReferent函数会发起JNDI查询,从而造成JNDI注入。

Oracle如何修复CVE-2023-21839漏洞?

Oracle在2023年1月补丁中修复了该漏洞,限制绑定ForeignOpaqueReference对象时对jndiEnvironment中providerURL的设置,并对lookup的JNDI链接协议做了严格限制。

CVE-2024-20931是如何绕过补丁实现攻击的?

攻击者利用AQjmsInitialContextFactory在初始化时通过JNDI获取远程DataSource的特性,在java.naming.provider.url为空的情况下,通过控制其他环境变量,发起二次JNDI注入,实现远程代码执行。

CVE-2024-20931与之前的JNDI注入漏洞有何不同?

之前的JNDI注入主要在lookup函数上寻求突破,而CVE-2024-20931将关注点侧重于Context的初始化阶段,通过控制初始化工厂来绕过补丁。

Oracle后续对CVE-2024-20931采取了什么修复措施?

Oracle在后续补丁中对java.naming.factory.initial的设置做了验签处理,但可能还有其他jndiEnvironment设置可被利用,需要进一步研究。

🏷️

标签

➡️

继续阅读