基于J NDI的攻击在过去几年中对任务关键型Java应用程序造成了严重破坏,不是因为这个API本身存在任何问题,而是开发人员使用它的疏忽方式。

什么是JNDI?

在Java命名和目录接口(JNDI)是Java API的目录服务,它允许Java软件客户端发现和查找数据和资源(在Java中的形式对象通过名称),与所有与主机系统连接的Java API 一样,JNDI独立于底层实现。

着名的Equifax漏洞被认为是“完全可以预防的”,发生在公司服务器上运行的易受攻击的Apache Struts版本中。然而,实际漏洞(CVE-2015-5638)与JNDI有关,这就是为什么理解底层细节是谨慎的,因为任何应用都可能发生这种情况。例如,就在上个月,Veracode发布了他们自己的建议,证明了多个Spring Boot执行器端点可供开发利用,JNDI命令是其中一个攻击媒介。

基本

JNDI的核心只不过是一个API,它允许开发人员执行各种查询和目录访问操作,例如,根据应用程序的上下文,它可能是访问LDAP等服务的首选标准方式,而不是从头开始实现您自己的解决方案。

从本质上讲,作为Java开发人员,您希望应用程序访问服务,而无需关心它正在检索的基础目录服务,这就是JNDI派上用场的地方。

攻击机制

问题出现是由于开发人员常见的疏忽错误,而不一定是API本身。例如,信任来自HTTP请求标头的外部输入,基本上我们在Struts,文件,用户输入字段,序列化对象的情况下观察到并将该输入直接传递给程序使用的各种JNDI命令是一种不好的做法,如服务器配置错误。

Veracode:通过提供流氓JNDI配置作为XML输入,可以利用Spring Boot执行器的示例。

预防

那么,您如何防止Web应用程序中的JNDI漏洞?

首先,作为开发人员不要相信外部输入,也不要在应用程序中使用它,如果没有适当的转义和清理。仅仅因为输入格式正确(语法上有效的XML,YAML或序列化对象),或来自可信赖的来源,并不意味着它不是恶意的。如果您的代码的逻辑正在执行系统命令,那么可能是技术娴熟的攻击者。