当前位置: 首页 > 科技观察

引爆全球Log4j2核弹级漏洞,Jndi是什么鬼?

时间:2023-03-16 21:03:10 科技观察

背??景前段时间,Log4j2、Logback日志框架频频爆雷:爆了!Log4j2再次爆发,v2.17.1诞生。..Logback也炸了,炸了。..很大一部分原因是因为JNDI。..JNDIJNDI:JavaNamingandDirectoryInterface,即:Java命名和目录接口,为Java应用程序提供命名和目录功能。JNDI架构图:如图所示,JNDI包括以下两部分:1)JNDIAPI:Java应用程序通过JNDIAPI访问各种命名和目录服务。2)JNDISPI(ServiceProviderInterface)Java应用程序通过JNDISPI插入各种命名和目录服务,然后通过JNDIAPI访问它们。例如,在使用JNDI之前,您可能必须在Java代码中硬编码一些JDBC数据库配置。使用JNDI,您可以将资源定义为数据源,然后按名称进行搜索。示例代码如下:Connectionconn=null;try{Contextctx=newInitialContext();DataSources=(Datasource)ctx.lookup("java:MysqlDataSource");conn=ds.getConnection();...}catch(Exceptione){...}最后{...}当然,现在数据源和配置都由Spring管理,这里只是介绍JNDI的一个用法。说白了,JNDI就是一套Java规范,相当于注册了某个资源,然后根据资源名查找定位资源。要使用JNDI,必须有一个JDNI类,以及一个或多个服务提供者(SPI),例如JDK中包含以下服务提供者:轻量级目录访问协议(LDAP)通用对象请求代理架构(CORBA)Common对象服务命名服务(COS)Java远程方法调用(RMI)域名服务(DNS)这里的LDAP协议是漏洞频发的根源,攻击者屡试不爽。Log4j2漏洞回顾了Internet上许多重复出现的示例。为了不造成更大的影响,这里就不做实际演示了。示例代码如下:/***作者:StackLeader*来源公众号:Java技术栈*/publicclassTest{publicstaticfinalLoggerlogger=LogManager.getLogger();publicstaticvoidmain(String[]args){logger.info("${jndi:ldap://localhost:8080/dangerious}");}}这个就是造成Log4j2核弹级漏洞的主要原因!LDAP协议如前所述上面是JDKJNDI下的一个开放的应用协议和服务提供者,用于提供目录信息的访问控制。该漏洞是在JDNI中使用了ldap协议。如果上述代码中的localhost是攻击者的地址,就会造成远程代码执行漏洞,后果不堪设想。.这是因为Log4j2有一个Lookups功能,它提供了一种给Log4j配置加值的方式,即通过一些方法和协议来读取特定环境下的信息。JndiLookup就是其中之一:经过一系列的Version修复和调整,从Log4jv2.17.0开始,需要通过以下参数主动开启JNDI操作:log4j2.enableJndiLookup=true现在这种jndi:ldap协议查找方式同样被Log4j2Lookups杀死,只支持java协议或者不支持协议的方式来查找。Log4j2漏洞的后续进展,栈长会持续跟进,关注公众号Java技术栈,公众号会第一时间推送。结论Log4j2Lookups造成的漏洞很多。它已经轰炸了一段时间。这真是一个鸡肋的功能。有多少人用过?当然,这几天的漏洞也不全是JNDI造成的。JNDI只是提供了一套规范,没用好能怪它吗?因此,我们不能把所有的责任都推到JNDI身上。Log4j2Lookups功能摆脱不了。既然提供了JndiLookup的功能,但是对它的影响考虑的太少了。.一个日志框架,主要用途是记录日志。虽然它提供了很多其他丰富的功能,但是如果考虑不到位,将会造成严重的后果。毕竟安全是第一位的,但是没办法,用开源利弊就得接受开源。还有人说,自己开发可能太离谱了。使用主流开源的公司很多,有泄密的时候也有大厂反馈。他们可以在第一时间感知它们并自行开发。产品和持续维护是另一回事。参考文档:https://docs.oracle.com/javase/jndi/tutorial/getStarted/overview/index.htmlhttps://logging.apache.org/log4j/2.x/manual/lookups.html本文转载来自微信公众号“Java技术栈”,可以通过以下二维码关注。转载本文请联系Java技术栈公众号。