Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(四)—漏洞修复原理(2.15.0-RC1、2.15.0、2.16.0)

2023-10-30

系列文章

2.15.0之前版漏洞相关文章

Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(一)—开篇与基础知识

Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(二)—漏洞原理

Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(三)—复现步骤(攻击方法)

Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(四)—漏洞修复原理

2.15.0版漏洞相关文章

Log4j2中2.15.0版存在的漏洞(CVE-2021-45046)的注入原理、复现步骤和如何修复(2.16.0修复原理)

2.16.0版漏洞相关文章

Log4j2中2.16.0版中DOS攻击(CVE-2021-45105)的漏洞原理、复现步骤和修复方法(2.17.0修复原理)

一、前言

通过前面一些列的文章,我们已经熟悉了Log4j2本次漏洞的原理,同时也基于该漏洞实现进行了模拟攻击,作为本系统作为一篇文章,我们就一起来看看官方是如何修复该漏洞的。

二、Log4j2漏洞修复原理

1、修复原理(官方如何修复)

其实查看Log4j2最新提交的代码(https://github.com/apache/logging-log4j2),咱们很容易就能看到其修复方法。

官方主要通过两个途径来修复该问题:新增jndi开关(默认关闭)和新增jndi相关域名、协议和Class白名单。

A、新增消息的Lookup开关(默认关闭)

在消息处理类MessagePatternConverter中增加了Lookup开关,通过lookups参数来控制。默认为false。 即默认消息中不解析${}配置。在2.15.0之前的版本,默认MessagePatternConverter会对消息进行lookup操作(具体请参考2.14.1的MessagePatternConverter类实现)。

但是我们可以通过在日志patter中新增lookups来开启消息中的lookup功能。

B、新增白名单

如果使用者通过配置lookups主动开启了消息查找功能。官方也为我们提供了另外一道屏障来解决该注入漏洞。官方使用了一个比较简单的办法,即给协议、class和域名都添加白名单。这样只要使用者合理的使用都不会有问题。

默认白名单的协议:JAVA、LDAP、LDAPS

默认白名单的域名:localhost

默认白名单支持的类:基本类型对应的对象。

 在JndiManager执行lookup的时候,其会校验对应的白名单。

官方修复方案的介绍就到这里。这里我们只讲解了核心代码,具体逻辑大家可以下载Log4j2的源码,查看从5号开始的改动即可。 

2、2.15.0-RC1版本为何会被绕过

这个版本的绕过其实很有意思。原因是因为在JndiManager.lookup的方法中,当执行各类白名单过滤操作中,如果抛出异常。在RC1的版本中,其没有做任何处理,导致只要抛出异常就能够正常的执行后续的lookup逻辑。从而绕过了白名单检测。

于是后续做了修正,只要抛出异常就直接返回null。

那么我们可以如何绕过呢? 这里我们参考了文章安全漏洞之Log4j2漏洞复现绕过分析。通过URI中不进行URL编码会报报错URISyntaxException,在URL中添加一个空格即可触发,比如:${jndi:ldap://127.0.0.1:1389/ badClassName}。如下是对URI构造函数做空格测试的结果: 

虽然对空格做编码导致异常,但是lookup时候会去掉这个空格。所以异常之后后续的lookup也能够正常执行。

3、JVM参数formatMsgNoLookups的修复原理(不建议)

这个比较简单,就是通过JVM设置一个参数formatMsgNoLookups=true。让Log4j2在处理${}消息的时候,不执行lookup操作。

 其实这种方式也是可以解决漏洞的。但是存在一个问题:如果服务本身就需要利用Log4j2的jndi功能。配置参数后就无法使用。所以作为官方解决方案来说,该方法还是存在不妥之处。

于是官方最终采用了jdni开关+白名单的方式来解决了该问题。

4、2.16.0发布与解决问题

这是因为在Thread Context Map场景下,也可以通过ldap方式实现注入。于是官方考虑到除此之后可能还有其他类似潜在漏洞,于是决定将消息中的Lookup功能去掉了,即在消息中填${}占位符,其不会在解析,也就不会执行Jndi相关的任何逻辑了。

 源码:MessagePatternConverter

至此Log4j2漏洞的深入剖析就和大家分享完了。如果你喜欢本文或觉得本文对你有所帮助,欢迎一键三连支持,非常感谢。

三、惯例

如果你喜欢本文或觉得本文对你有所帮助,欢迎一键三连支持,非常感谢。

如果你对本文有任何疑问或者高见,欢迎添加公众号lifeofcoder共同交流探讨(添加公众号可以获得楼主最新博文推送以及”Java高级架构“上10G视频和图文资料哦)。

系列文章

Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(一)—开篇与基础知识

Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(二)—漏洞原理

Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(三)—复现步骤(攻击方法)

Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(四)—漏洞修复原理

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(四)—漏洞修复原理(2.15.0-RC1、2.15.0、2.16.0) 的相关文章

  • 在 mvn 命令中指定 pom.xml 并混合其他项目的目标

    我有多个问题 我可以在 mvn 命令中指定 pom xml 吗 在当前项目上执行 mvn 命令时 我可以混合另一个项目的目标吗 例如 mvn clean otherproject comple otherproject install ot
  • 从 java sdk 向对等方发送提案时出现访问被拒绝错误

    我正在尝试使用以下代码查询区块链并收到访问被拒绝错误 我也遇到同样的错误sendTransactionProposal方法也是如此 UserContext adminUserContext RegisterEnrollUser regist
  • 存根方法时出现 InvalidUseOfMatchersException

    我有这个 TestNG 测试方法代码 InjectMocks private FilmeService filmeService new FilmeServiceImpl Mock private FilmeDAO filmeDao Bef
  • 如何将 javax.persistence.Column 定义为 Unsigned TINYINT?

    我正在基于 MySQL 数据库中的现有表创建 Java 持久性实体 Bean 使用 NetBeans IDE 8 0 1 我在这个表中遇到了一个字段 其类型为 无符号 TINYINT 3 我发现可以执行以下操作将列的类型定义为 unsign
  • 如何将画廊意图中的“打开”更改为“完成”?

    我使用以下意图打开画廊来选择多个图像和视频 Intent intent new Intent intent setType image video intent putExtra Intent EXTRA ALLOW MULTIPLE tr
  • Java:无法从同一包中的不同类访问静态变量

    这很奇怪 因为我有一个可以访问 Frame dimension getWidth 的 Character 类 及其伙伴 getHeight 但是当我想在 Map 类中使用它时 Eclipse 强调了它并且无法给我反馈 运行该程序最终会出现
  • 如何在 Firebase 远程配置中从 JSON 获取值

    我是 Android 应用开发和 Firebase 的新手 我想知道如何获取存储在 Firebase 远程配置中的 JSONArray 文件中的值 String 和 Int 我使用 Firebase Remote Config 的最终目标是
  • org.hibernate.QueryException:无法解析属性:文件名

    我正在使用休眠Criteria从列中获取值filename在我的桌子上contaque recording log 但是当我得到结果时 它抛出异常 org hibernate QueryException 无法解析属性 文件名 com co
  • ConcurrentHashMap 内部是如何工作的?

    我正在阅读有关 Java 并发性的 Oracle 官方文档 我想知道Collection由返回 public static
  • 需要使用 joda 进行灵活的日期时间转换

    我想使用 joda 解析电子邮件中的日期时间字符串 不幸的是我得到了各种不同的格式 例如 Wed 19 Jan 2011 12 52 31 0600 Wed 19 Jan 2011 10 15 34 0800 PST Wed 19 Jan
  • 自动生成Flyway的迁移SQL

    当通过 Java 代码添加新模型 字段等时 JPA Hibernate 的自动模式生成是否可以生成新的 Flyway 迁移 捕获自动生成的 SQL 并将其直接保存到新的 Flyway 迁移中 以供审查 编辑 提交到项目存储库 这将很有用 预
  • 从 GitHub 上托管的 Spring Cloud Config Server 访问存储库的身份验证问题

    我在 GitHub 上的存储库中托管配置 如果我将回购公开 一切都好 但如果我将其设为私有 我将面临 org eclipse jgit errors TransportException https github com my user m
  • 了解joda时间PeriodFormatter

    我以为我明白了 但显然我不明白 你能帮我通过这些单元测试吗 Test public void second assertEquals 00 00 01 OurDateTimeFormatter format 1000 Test public
  • 读取电子邮件的文本文件转换为 Javamail MimeMessage

    我有一个电子邮件原始来源的文本文件 直接从 gmail 复制 如果您单击 查看原始文件 您就会看到它 我想读入该文件并将其转换为 MimeMessage 如果您好奇为什么 我设置了 JavaMaildir 并且需要用电子邮件填充它的收件箱以
  • HashMap 值需要不可变吗?

    我知道 HashMap 中的键需要是不可变的 或者至少确保它们的哈希码 hashCode 不会改变或与另一个具有不同状态的对象发生冲突 但是 HashMap中存储的值是否需要与上面相同 为什么或者为什么不 这个想法是能够改变值 例如在其上调
  • 在 SWT/JFace RCP 应用程序中填充巨大的表

    您将如何在 SWT 表中显示大量行 巨大是指超过 20K 行 20 列的东西 不要问我为什么需要展示那么多数据 这不是重点 关键是如何让它尽可能快地工作 这样最终用户就不会厌倦等待 每行显示某个对象的实例 列是其属性 一些 我想使用 JFa
  • QuerySyntaxException:无法找到类

    我正在使用 hql 生成 JunctionManagementListDto 类的实际 Java 对象 但我最终在控制台上出现以下异常 org hibernate hql internal ast QuerySyntaxException
  • 返回 Java 8 中的通用函数接口

    我想写一种函数工厂 它应该是一个函数 以不同的策略作为参数调用一次 它应该返回一个函数 该函数根据参数选择其中一种策略 该参数将由谓词实现 嗯 最好看看condition3为了更好的理解 问题是 它没有编译 我认为因为编译器无法弄清楚函数式
  • Java中HashMap和ArrayList的区别?

    在爪哇 ArrayList and HashMap被用作集合 但我不明白我们应该在哪些情况下使用ArrayList以及使用时间HashMap 他们两者之间的主要区别是什么 您具体询问的是 ArrayList 和 HashMap 但我认为要完
  • 在浏览器刷新中刷新检票面板

    我正在开发一个付费角色系统 一旦用户刷新浏览器 我就需要刷新该页面中可用的统计信息 统计信息应该从数据库中获取并显示 但现在它不能正常工作 因为在页面刷新中 java代码不会被调用 而是使用以前的数据加载缓存的页面 我尝试添加以下代码来修复

随机推荐

  • mybatis中 #{}和${}的区别

    简明的解释 是预编译处理 是字符串替换 当做占位符来用 mybatis在处理 时 会将sql中的 替换为 号 调用PreparedStatement的 set方法来赋值 mybatis在处理 时 就是把 替换成变量的值 使用 可以有效的防止
  • AD20元件重叠绿色报错的解决方法,距离太近绿色报错

    有时因为元件靠的太近而导致绿色的报错 但在实际中这样使用是没有问题的 可以人为的消除掉元件间距离检查 距离太近报错的修改方法 设计 规则 将 ComponentClearance 中的 最小间距 都改为 0 最小间距设置为0后 要人为仔细检
  • 四、mybatis第四节

    一 分页插件PageHelper 在我们日常使用中 缺少不了分页查询 就好比你百度时 那么多的数据 肯定需要分页来处理 那么我们就可以用分页插件来帮我们快速实现分页查询操作 首先了解一下分页查询的sql语句 select from 表名 w
  • Docker入门教程(非常详细)从零基础入门到精通,看完这一篇就够了

    目录 一 Docker概述 1 1 Docker 为什么出现 1 2 Dorker历史 1 3 能做什么 虚拟机技术 通过 软件 模拟的具有完整 硬件 系统功能的 运行在一个完全 隔离 环境中的完整 计算机系统 容器化技术 容器化技术不是模
  • PCB走线线宽电流对照表

    在PCB设计的过程中 大电流电路需要特别留意其参数 其几个个决定性因数包括 材质 厚度和宽度 下表为普通铜电路板计算参考
  • LayUI框架——选项卡

    目录 前言 1 动态实现选项卡 1 1 优化dao类 1 2 优化前端JSP页面 1 3 引入头部hand jsp页面 1 4 优化后台主界面js 2 运行效果图 前言 首先效果展示 1 动态实现选项卡 继 上篇博客 实现的导航栏 本篇实现
  • c语言分支结构程序设计教学设计 赛课,《分支结构程序设计》教学设计.doc

    分支结构程序设计 教学设计 潮州市饶平县华侨中学 邮编515700 张远航 Email zyuanhang 教学分析与教学设计思路 一 教学对象分析与教学设计 本教案适用于高中二年级学生 这一阶段的学生具备一定的数学基础和具有一定的比较 归
  • 利用python编程,制作自己的游戏“外挂”!

    Python简介及应用领域 Python是一种解释型脚本语言 可以应用于以下领域 Web 和 Internet开发 科学计算和统计 人工智能 教育 桌面界面开发 软件开发 后端开发 网络爬虫 编程用的好 不仅可以提高工作效率 还能让玩游戏变
  • FastAPI学习(二)——FastAPI+Jinjia2模板渲染网页(跳转返回渲染页面)

    文章目录 一 简单实现 1 依赖库安装 2 建立目录 3 item html文件代码 4 main py文件代码 5 浏览器输入 二 借用bootstrap模板 1 目录结构与名称 2 index html代码 3 main py代码 4
  • 值得收藏 Modbus RTU 协议详解

    值得收藏 Modbus RTU 协议详解 目录 值得收藏 Modbus RTU 协议详解 Modbus是什么 Modbus分类 Modbus通讯过程 Modbus RTU协议数据帧结构 功能码01 读线圈状态 功能码02 读离散量输入 功能
  • matlab 锐化降噪,matlab 图形锐化 滤波

    help imread help fspecial imfilt 帮助稳定中有较多的示例 fspecial 函数 功能 产生预定义滤波器 格式 H fspecial type H fspecial gaussian n sigma 高斯低通
  • 精密全波整流电路

    精密全波整流电路 单运放型 利用单运放构成的精密全波整流电路主要有两种 一种称之为 T 型 另一种称为 型 T 型精密全波整流电路的原理图如下 图1 T型精密全波整流电路 上面电路中 R1 R3 2 R2 当输入为正电压时 D1 导通D2截
  • HarmonyOS“一次开发,多端部署“优秀实践——玩机技巧,码上起航

    随着终端设备形态日益多样化 分布式技术逐渐打破单一硬件边界 一个应用或服务 可以在不同的硬件设备之间按需调用 互助共享 让用户享受无缝的全场景体验 作为应用开发者 广泛的设备类型也能为应用带来广大的潜在用户群体 一个应用要在多类设备上提供统
  • 【vscode安装以及c++环境配置】

    TOC vscode安装以及c 环境配置 VScode安装 安装vscode vscode官方下载 C 环境配置 安装c 环境 MinGw官方下载网址 下载版本选择 Architecture 如果电脑系统是64位就选x86 64 如果电脑系
  • 论文笔记之CentripetalNet

    提出使用向心偏移来对同一实例中的角点进行配对 此外又设计了一个 corner star deformable convolution network 十字星可变形卷积网络来适应corner特征 CVPR2020接收 论文地址 https a
  • 斐波那契数列的两种解题思路:递归VS迭代

    一 问题描述 要求输入一个整数n 请你输出斐波那契数列的第n项 二 算法分析 给出一系列斐波拉契数列 0 1 1 3 5 8 13 21 通过观察 很容易发现 1 n 0 1 f n f n 1 f n 2 n gt 1 三 算法设计 递归
  • 如何将数据从Activity返回到Fragment——onActivityResult

    一段时间没有写了 背景是这样的 MainActivity中启动Fragment Fragment启动OtherActivity 在OtherActivity中的数据需要返回到Fragment中 关于数据是怎么传输的 可以看这里 传送门 An
  • spring-boot-configuration-processor问题

    spring boot configuration processor问题 配置 application yml 时没有关联提示 配置好的属性提示 Cannot resolve configuration property xxxx 解决方
  • 【Mybatis】mysql插入记录后返回自增主键id的方法和注意事项

    插入记录后返回自增主键id mapping文件的insert标签中加入如下标签 指明主键名 keyProperty 执行方式 order 为新增完再返回执行 因为只有插入完成后获取的id才是最新的 返回值是Integer类型 也就是新增后返
  • Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(四)—漏洞修复原理(2.15.0-RC1、2.15.0、2.16.0)

    系列文章 2 15 0之前版漏洞相关文章 Log4j2注入漏洞 CVE 2021 44228 万字深度剖析 一 开篇与基础知识 Log4j2注入漏洞 CVE 2021 44228 万字深度剖析 二 漏洞原理 Log4j2注入漏洞 CVE 2