志达IT
做快乐程序员

log4j漏洞(log4j漏洞攻击原理)

log4j漏洞

简直每个体系都会运用日志结构,用于记录日志信息,这些信息能够供给程序运转的上下文,可是日志过多也会影响体系的功能,所以好的日志结构应该是牢靠,快速和可扩展的。
ApacheLog4j2是一个根据Java的日志东西,是Log4j的晋级版别,引入了许多丰富的特性,包含高功能,低废物搜集,插件体系等。现在许多互联网公司以及耳熟能详的公司的体系或许开源结构都在运用Log4j2。
2021.12.7,Log4j初次被发现了一个十分严重的缝隙,在当天Log4j就发布了log4j-2.15.0-rc1,可是12.9那天被发现这个版别仍然能够触发缝隙。简单点说,黑客能够恶意结构特殊数据恳求包payload触发缝隙,从而能够在方针服务器上履行任意代码,导致服务器被黑客操控,被定性为“曩昔十年来最大、最关键的缝隙”。
根据现在统计,90%以上根据java开发的应用平台都会受到影响。那么这篇文章就会深入分析这个缝隙究竟是怎样发生的以及怎样修正它。log4j
1.Log4j简介
ApacheLog4j是一个根据Java的日志记录东西。它是由CekiGülcü创始的,现在已经发展为Apache软件基金会的项目之一。
经过多年的开发迭代,Log4j1.x的保护已经变得十分困难,由于它需要与十分旧的Java版别兼容,所以于2015年8月正式晋级为Log4j2。
2.Log4j的lookup功能
本次缝隙是由于Log4j2组件中lookup功能的完成类JndiLookup的规划缺点导致,这个类存在于log4j-core-xxx.jar中。
log4j的Lookups功能能够快速打印包含运转应用容器的docker属性,环境变量,日志事件,Java应用程序环境信息等内容。比如咱们打印Java运转时版别:
publicclassVulnerabilityTest{
privatestaticfinalLoggerLOGGER=LogManager.getLogger();
publicstaticvoidmain(String[]args){
LOGGER.error(“Test:{}”,”${java:runtime}”);
}
}
输出:
20:20:21.312[main]ERRORcom.ldbmcs.VulnerabilityTest-OpenJDKRuntimeEnvironment(build11.0.11+9)fromAdoptOpenJDK
1
那么JndiLookup到底有什么规划缺点导致出现的史诗级缝隙呢?
咱们首先把方针放在org.apache.logging.log4j.core.pattern.MessagePatternConverter#format:
publicvoidformat(finalLogEventevent,finalStringBuildertoAppendTo){
Messagemsg=event.getMessage();
if(msginstanceofStringBuilderFormattable){
booleandoRender=this.textRenderer!=null;
StringBuilderworkingBuilder=doRender?newStringBuilder(80):toAppendTo;
intoffset=workingBuilder.length();
if(msginstanceofMultiFormatStringBuilderFormattable){
((MultiFormatStringBuilderFormattable)msg).formatTo(this.formats,workingBuilder);
}else{
((StringBuilderFormattable)msg).formatTo(workingBuilder);
}
if(this.config!=null&&!this.noLookups){
for(inti=offset;i<workingBuilder.length()-1;++i){
if(workingBuilder.charAt(i)==’$’&&workingBuilder.charAt(i+1)=='{‘){
Stringvalue=workingBuilder.substring(offset,workingBuilder.length());
workingBuilder.setLength(offset);
workingBuilder.append(this.config.getStrSubstitutor().replace(event,value));
}
}
}

}else{

}
}
26
咱们传入的message会经过MessagePatternConverter.format(),判断假如config存在而且noLookups为false(默以为false),然后匹配到${则经过getStrSubstitutor()替换原有的字符串,比如这儿的${java:runtime}。
由于这儿没有任何的白名单,那么咱们就能够结构任何的字符串,只要符合${就能够。
持续往下走,来到org.apache.logging.log4j.core.lookup.Interpolator#lookup
咱们能够看到处理event的时候根据前缀挑选对应的StrLookup进行处理,现在支持date,jndi,java,main等多种类型,假如结构的event是jndi,则经过JndiLoopup进行处理,从而结构缝隙。
3.Log4j缝隙
受影响的版别:
2.0-beta9<=ApacheLog4j<=2.15.0-rc1
Log4j1.x不受此缝隙影响。
受影响的结构或许组件:
Spring-boot-strater-log4j2
ApacheSolr
ApacheFlink
ApacheDruid
4.Log4j缝隙复现
咱们以RMI服务为例复现Log4j的缝隙,RMI是长途办法调用(RemoteMethodInvocation),能够让A电脑的java虚拟机上的目标调用B电脑的java虚拟机中的目标上的办法。可是客户端并不是直接调用服务器上的办法的,而是会凭借存根(stub)充任咱们客户端的代理,来访问服务端,一同骨架(Skeleton)是另一个代理,它与实在目标一同在服务端上,骨架将接受到的恳求交给服务器来处理,服务器处理完成之后将结果进行打包发送至存根,然后存根将结果进行解包之后的结果发送给客户端。
RMI包含三个部分:
Registry:供给服务注册与服务获取。即Server端向Registry注册服务,Client端从Registry获取长途目标的一些信息,如地址、端口等,然后进行长途调用。
Server:长途办法的供给者,并向Registry注册自身供给的服务。
Client::长途办法的消费者,从Registry获取长途办法的相关信息而且调用。

log4j漏洞攻击原理

1.JNDI接口
JNDI即JavaNamingandDirectoryInterface(JAVA命名和目录接口),它供给一个目录体系,并将服务称号与目标相关起来,然后使得开发人员在开发过程中能够运用称号来访问目标。
有一个类似于字典的数据源,你能够经过JNDI接口,传一个name进去,就能获取到目标了。
2.LDAP协议
LDAP称为轻量级目录访问协议,既是一种服务,也是一种协议,是JNDI的一种底层完成,主要功用是供给命名关键字到目标的映射目录,开发人员能够经过输入称号,获取到目标的内容。
有一个类似于字典的数据源,你能够经过LDAP协议,传一个name进去,就能获取到数据。
3.RMI协议
JAVA的一种长途接口调用协议,在TCP协议上传递可序列化的Java目标,即能够完成调用长途方法和调用本当地法一样简略。
4.Log4j
Log4j是由Apache供给的日志操作包,用于协助用户处理日志信息。经过Log4j,能够操控日志信息运送的目的地是操控台、文件、GUI组件、甚至是套接口服务器等各种当地。log4j
二.Log4j缝隙的成因
Log4j为了输出日志时能输出恣意方位的Java目标,引入了Lookup接口,这个Lookup接口能够看作是JNDI的一种完成,允许按照具体的称号逻辑查找目标的方位,并输出目标的内容,此目标能够经过Java的序列化或反序列化传输,从长途服务器上查找。
由于Lookup接口的原因,Log4j就暗含JNDI注入缝隙,能够联合运用JNDI+LDAP或者JNDI+RMI经过命名功用直接从长途服务器上调用文件并在本地履行。
Log4j在处理音讯转换时,会按照字符检测每条日志,当日志中包含${}时,则会将表达式的内容替换成真实的内容(即lookup接口查找得到的内容),运用LDAP或RMI协议,能从长途服务区上请求恶意的目标,目标在调用的过程中会被解析履行,导致了Log4j的缝隙。

赞(0)
未经允许不得转载:志达IT网站 » log4j漏洞(log4j漏洞攻击原理)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

志达IT网站 每天分享编程和互联网的IT技术博客

登录/注册联系我们