Web网络安全-----Log4j高危漏洞原理及修复

2023-11-19

系列文章目录

Web网络安全-----红蓝攻防之信息收集



什么是Log4j?

Log4j 即 log for java(java的日志) ,是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。


一、Log4j漏洞

在这里插入图片描述

2021年12月8号爆出的log4j2的远程代码执行漏洞【cve-2021-44228】被称作“史诗级核弹漏洞”,其具有以下特点:

触发方式 远程
用户认证 不需要用户认证
配置方式 默认
影响版本 Apache Log4j 2.0-alpha1 到 2.14.1(包括这些版本) Apache Log4j 1.2.19 到 1.2.20(包括这些版本)
利用难度 极低,无需授权即可远程代码执行
威胁等级 严重,能造成RCE

(该漏洞的范围可能会随着时间的推移而有所变化)
在了解了Log4j的基本特点后,就知道最高级的漏洞,往往采取最朴素的“烹饪方式”,简单、危害大、利于操作。

二、漏洞产生原因

在Log4j2中提供了Lookups机制,Lookups提供了一种在Log4j配置文件任意位置添加值的方法;而Lookups机制中,存在JNDI,在Log4j日志输出时,未对字符合法性进行严格的限制,造成JNDI协议加载的远程恶意脚本被执行,从而造成RCE。
在这里插入图片描述

下面将详细介绍什么是Lookups和JNDI

1.什么是Lookups机制

“ Lookups provide a way to add values to the Log4j configuration at arbitrary places. They are a particular type of Plugin that implements the StrLookup interface. ”
以上內容复制于log4j2的官方文档lookup - Office Site。其清晰地说明了lookups的主要功能就是提供另外一种方式以添加某些特殊的值到日志中,以最大化松散耦合地提供可配置属性供使用者以约定的格式进行调用。(lookups是实现StrLookup接口的特定类型的插件)lookups给开发者提供了更加方便的后端开发过程中的调试效率

lookups可以通过 {$xx} 的方式来执行一些命令和操作,log4j支持在日志中使用该表达式执行命令。下面是log4j使用lookup的简单示例,可以打印系统os信息。

public void test() {
        log.info("{$java:os}");
} 

这样就能理解,为什么常见的Log4j漏洞的playload是以下格式的:

${jndi:ldap}
${jndi:ldaps}
${jndi:rmi}
${jndi:iiop}
${jndi:iiopname}
${jndi:corbaname}
${jndi:dns}
${jndi:nis}

观察上面的palyload就能发现,每个playload里面都有jndi,下面将介绍JNDI的作用

2.怎么利用JNDI进行注入

JNDI简介

JNDI(Java Naming and Directory Interface–Java)命名和目录接口 是Java中为命名和目录服务提供接口的API,通过名字可知道,JNDI主要由两部分组成:Naming(命名)和Directory(目录),其中Naming是指将对象通过唯一标识符绑定到一个上下文Context,同时可通过唯一标识符查找获得对象,而Directory主要指将某一对象的属性绑定到Directory的上下文DirContext中,同时可通过名字获取对象的属性同时操作属性。
在这里插入图片描述JNDI主要由JNDI API和JNDI SPI两部分组成,Java应用程序通过JNDI API访问目录服务,而JNDI API会调用Naming Manager实例化JNDI SPI,然后通过JNDI SPI去操作命名或目录服务其如LDAP, DNS,RMI等,JNDI内部已实现了对LDAP,DNS, RMI等目录服务器的操作API。

通过上面可以知道,JNDI可以实现对LADP、RMI等服务的操作,所以攻击者只需要构建一个LADP或RMI远程服务即可,让远程服务器返回恶意class

LADP

什么是LDAP(Lightweight Directory Access Protocol):顾名思义,一个轻量级的目录访问协议,用来访问目录服务(Directory Service)。
那么LDAP协议作为一个访问协议,它在技术架构的表现上是一个CS架构模式:以IDaaS为例,IDaaS产品要解决的三个问题,都是会作为LDAP Client去访问LDAP Server(这里LDAP Server和Directory Service等同了),来实现功能
在这里插入图片描述

RMI

RMI(即Remote Method Invocation)是Java平台一个分布式应用程序的应用编程接口(API),它是Java Remote Method Protocol(JRMP)的实现,这个协议代表了Java语言特有的远程过程调用(RPC)系统。

RMI允许一个对象通过一个网络在另外一个虚拟机上被调用,这些对象称之为远程对象
在这里插入图片描述
在了解了上面这些东西后,画了一个图帮助理解
攻击者定义一个接口,在接口中定义数据库操作等。
攻击者携带lookup支持表达式进行请求服务器。
服务器通过log4j打印出请求信息。
log4j打印完成后会执行JNDI操作。
这样就解释了漏洞的产生,极其高危!

在这里插入图片描述

三、Log4j漏洞修复

1.升级到受影响版本的修复版:
(1)对于Apache Log4j 2.x 用户,建议升级到2.17.0版本以上。这些版本修复了漏洞,并包含其他安全增强措施。
(2)对于Apache Log4j 1.x 用户,目前官方并未针对1.x版本提供官方修复版。建议升级到Log4j 2.x版本,或者考虑使用其他日志记录库。

2.阻止使用JNDI来加载远程资源:
如果您无法立即升级到修复版本,可以通过在Log4j配置中禁用使用JNDI来加载远程资源来减少风险。可以通过在log4j2.xml文件中将JndiLookup类从配置中移除或设置为安全的FallbackJndiLookup或DummyLookup来实现。

3.启用安全策略:
为了进一步减少潜在的风险,应该考虑启用安全策略来限制代码执行。可以通过在log4j2.xml文件中添加安全策略配置来实现。

4.清除受影响系统的缓存:
Log4j有一个缓存机制,可以存储已解析的XML配置。为了确保新的配置生效,您可能需要清除缓存。可以通过清除 Log4j 的上下文选择器缓存来实现。

除了以上方法外,了解并关注官方发布的漏洞修复和更新是非常重要的,因为该漏洞的细节和修复程度可能会发生变化。推荐遵循安全最佳实践,并随时关注官方漏洞通告和安全更新。

总结

Log4j漏洞能造成RCE等危害,所谓是为所欲为,虽然现在大部分系统早已经安装补丁进行修复升级,但仍有部分老系统未进行修复,这是在安全测试中我们不可忽视的一个重大漏洞,任然需要对Log4j版本等进行排查修复。

未经授权请勿盗用,转发请指明

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

Web网络安全-----Log4j高危漏洞原理及修复 的相关文章

  • 将 logback.xml 转换为 log4j.properties

    如何将此 logback xml 转换为等效的 log4j properties
  • 来自 Kafka Producer 的控制台消息过多

    如何控制 Kafka 生产者或消费者的控制台日志记录级别 我在 Scala 中使用 Kafka 0 9 API 每次send on the KafkaProducer被调用时 控制台给出如下输出 这是否表明我没有KafkaProducer设
  • 使用 JAR 加载 log4j.properties [重复]

    这个问题在这里已经有答案了 我有一个包含以下清单的 jar 文件 Manifest Version 1 0 Created By 1 7 0 07 Oracle Corporation Main Class test Main Class
  • 为什么选择 XML 而不是属性文件来进行 Log4J 配置?

    是否有任何理由在 Log4J 配置中使用 XML 而不是属性文件 有一个有趣的讨论这篇博客中两者的优点 http www laliluna de log4j tutorial html 以下部分摘自该博客 属性可以由属性文件或 XML 文件
  • log4j 不打印异常的堆栈跟踪

    我正在使用 log4j 和 tomcat 当我在 JSP Servlet 中记录异常时 private Logger log Logger getLogger this getClass try catch Exception e log
  • 如何在 log4j 中启用包级别日志记录

    谁能告诉我 log4j 中的包级别日志记录是什么 以及如何实现这一点 今天我的面试问题无法回答 即使我在谷歌中也没有找到好的解决方案 太感谢了 包级别日志记录是 log4j 的标准日志记录 使用 log4j 配置 您可以指定包和关联的级别
  • 在 Spark java 应用程序中使用 log4j2

    我正在尝试使用 log4j2我的 Spark 工作中的记录器 基本要求 log4j2 配置位于类路径之外 因此我需要明确指定其位置 当我直接在 IDE 中运行代码而不使用spark submit log4j2效果很好 但是 当我使用以下命令
  • 如何使用 Log4cxx 或 log4j 记录进程 ID

    我正在使用 log4cxx 我的项目 我可以使用 t 标记记录当前线程 id 如何在其中记录进程 id 或 log4j 我正在使用 ConversionPattern 和基于 xml 的配置文件 谢谢 基于以上答案 我将在 log4j 中执
  • 如何缓解 Apache Log4j 反序列化 RCE (CVE-2019-17571)

    我已将 log4j core 依赖项升级到 2 15 0 以防止任何潜在的 Log4Shell 攻击 话虽如此 我无法从 1 2 17 升级 slf4j log4j12 的间接 log4j 依赖项 因为 slf4j log4j12 的最新稳
  • 压缩 Log4j 文件

    是否可以压缩日志文件 我通过 RollingFileAppender 进行 log4j 附加功能 http logging apache org log4j extras 对此表示支持 只需将以下内容添加到您的RollingFileAppe
  • grails 中的 log4j:如何登录文件?

    我的 grails config groovy 中有这个 log4j 配置 log4j error org codehaus groovy grails web servlet controllers org codehaus groovy
  • Log4j2 ThreadContext 映射不适用于parallelStream()

    我有以下示例代码 public class Test static System setProperty isThreadContextMapInheritable true private static final Logger LOGG
  • 记录类名、方法名和行号的性能影响

    我正在我的 java 应用程序中实现日志记录 以便我可以调试应用程序投入生产后可能出现的潜在问题 考虑到在这种情况下 人们不会奢侈地使用 IDE 开发工具 以调试模式运行事物或单步执行完整代码 因此在每条消息中记录类名 方法名和行号将非常有
  • 如何使用 Jboss AS 7.1 启用自定义 log4j

    我尝试了几种选择 但一切对我都不起作用 以前 我在 Tomcat 6 7 中使用了相同的 log4j xml 简单的通用配置 并且我可以通过更新 log4j xml 来控制根日志记录和应用程序日志记录 当我使用 JBoss AS 7 1 部
  • Java日志查看器[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 不幸的是 有时调试程序的唯一方法是查看其长日志文件 我寻找一个像样的日志查看器已经有一段时间了 但还没有
  • 使用控制台和滚动文件附加器的非常简单的 log4j2 属性配置文件

    我想要一个带有控制台的 log4j2 属性文件配置和一个使用 log4j2 的滚动文件附加器 可以用于不同的应用程序 日志配置应在生产环境中轮换日志 我认为没有这样的日志记录或行业标准log4j2配置 每个人都根据应用程序的需要更改配置 下
  • log4j:ERROR 在 tomcat 7 中部署 war 时无法创建自定义 Appender

    我的 log4j xml 中有以下标签
  • java.lang.Class: 在 java 程序中初始化 log4j 属性文件时出错

    我正在尝试使用 log4j 运行独立的 java 程序 但在调试时收到以下消息 控制台上没有 log4j 相关日志 log Logger 1343 java lang Class ERROR in 18b4aac2 有人可以建议这里出了什么
  • 记录时何时出现致命错误?

    在 log4j 和 log4net 等日志框架中 您可以记录各种级别的信息 大多数级别都有明显的意图 例如 调试 日志与 错误 日志是什么 然而 我一直害怕的一件事是将我的日志记录归类为 致命 哪种类型的错误如此严重以至于应被归类为致命错误
  • 如何将log4j日志文件更改为utf8

    我收到了一个使用 log4j 作为记录器应用程序的代码 如何为其生成 UTF8 日志文件 log4j 创建的日志文件目前为 ASCII 格式 我已经尝试过以下操作 按照以下说明设置日志文件的文件编码 vi current set bomb

随机推荐

  • 【统一身份认证】详细讲解

    一 什么是统一身份认证 二 统一身份认证的构成 1 角色模型 用户 角色 权限 2 实现 前言
  • win10使用vscode+anaconda+Python环境配置(解决无法加载文件 \WindowsPowerShell\profile.ps1,因为在此系统上禁止运行脚本)

    win10使用vscode anaconda Python环境配置 解决无法加载文件 WindowsPowerShell profile ps1 因为在此系统上禁止运行脚本 安装anaconda 为conda设置环境变量 conda 环境初
  • Linux文件权限

    Linux用户分为 拥有者 组群 Group 其他 other Linux系統中 预设的情況下 系統中所有的帐号与一般身份使用者 以及root的相关信息 都是记录在 etc passwd文件中 每个人的密码则是记录在 etc shadow文
  • C++11 标准新特性: 右值引用与转移语义

    新特性的目的 右值引用 Rvalue Referene 是 C 新标准 C 11 11 代表 2011 年 中引入的新特性 它实现了转移语义 Move Sementics 和精确传递 Perfect Forwarding 它的主要目的有两个
  • Linux服务器中查看进程的四种方法

    查看进程的四种方法 1 使用ps aux命令来查看 能以简单列表的形式显示出进程信息 ps aux用于报告当前系统的进程状态 可以搭配kill指令随时中断 删除不必要的程序 ps命令是最基本同时也是非常强大的进程查看命令 使用该命令可以确定
  • PTA乙级题目练习-卡拉兹(Callatz)猜想

    卡拉兹 Callatz 猜想 对任何一个正整数 n 如果它是偶数 那么把它砍掉一半 如果它是奇数 那么把 3n 1 砍掉一半 这样一直反复砍下去 最后一定在某一步得到 n 1 卡拉兹在 1950 年的世界数学家大会上公布了这个猜想 传说当时
  • 静态编译 java_动态编译和静态编译及Java执行

    静态编译就是在编译的时候把你所有的模块都编译进exe里去 当你启动这个exe的时候所有模块都加载进来了 你写小程序没问题 但程序一大 加载的过程 就是当你运行程序时初始化的过程 就比较费力了 大多数ppc的硬件配置还是很一般的 动态编译就不
  • 新书《活用UML-需求分析高手》详细大纲(持续更新中)

    本书目前正在编写中 大纲可能会随时调整 欢迎各位朋友提出宝贵意见 欢迎到umlonline网站学习 活用UML 需求分析高手 课程在线版本 http www umlonline org school forum 26 1 html 目 录第
  • vs添加对dll的引用

    我们在使用vs进行开发调试的时候经常会遇到一个问题 就是当我们的主工程引用到其他工程更新的dll 我们经常采用copy到工程目录的方法 亦或者当我们的多个工程引用到同一个dll文件的时候 我们怎么来配置 1 将dll配置到环境变量 这种方法
  • 以渲染和ue独立游戏为接下来的主要学习任务。(独立游戏就是为单干做准备,不为跳槽涨薪,目标就是单干,找另外一种可能。)

    这段时间工作不好找 即使招聘网站上找我聊的 薪水也没有什么吸引力 所以不考虑跳槽 直接把精力放在渲染上 说不准还能涨涨薪 拿个年终奖 这条被哥们否定了 内部涨薪很困难 即使以前确实是从1万七涨到2万 也可能是因为人力看过流水 知道我是从两万
  • 微信小程序游戏怎么开发入门教程

    微信小程序游戏开发是现在比较热门的小程序类型开发项目 对于开发人员而言 怎么开发微信小程序游戏呢 今天小编分享一篇小游戏的入门开发教程 希望对微信小程序制作开发人员提供参考 第一步 注册一个小程序账号 在官方注册一个微信小程序账号 注册申请
  • springboot+thymeleaf+mybatis简单获取数据库数据

    1 数据库准备 建好需要的表 这里我的表是info list 2 文件创建 实体类Info public class Info private int id private String name public int getId retu
  • Android平台RTMP

    我们需要怎样的直播播放器 很多开发者在跟我聊天的时候 经常问我 为什么一个RTMP或RTSP播放器 你们需要设计那么多的接口 真的有必要吗 带着这样的疑惑 我们今天聊聊Android平台RTMP RTSP播放器常规功能 如软硬解码设置 实时
  • 5V转±12V无变压器双boost电路

    最近有个新项目 需要 10V范围的模拟量输出 非隔离 对于5V以下供电的控制板而言单端输出绝对没问题 可现在需要有正负输出 是少不了正负电源的 因此准备设计一个5V转 12V的电源 然后选择一个双向供电的运放 来实现单端模拟量信号向双向模拟
  • Blob类型介绍以及查看

    最近看到一个字段的类型是Blob有点懵逼 从Navigate上看只能看到一个 Blob 实际你去仔细看的话 分线字段大小不为空 而且每个大小不一样 说明该字段不仅不为空而且还有值且不一样 那这个Blob是什么呢 大名叫做binary lar
  • 程序员如何乘风破浪?从数据库历史看技术人发展

    2009 年我国数据库软件市场规模为 35 03 亿元 2017 年我国数据库软件市场规模增长至 120 00 亿元 8年时间内 我国数据库软件市场始终保持平稳增长 年均复合增长率为 17 5 且增速呈现递增趋势 根据中研产业研究院估计 到
  • 深入浅出Spring AOP面向切面编程实现原理方法

    1 什么是AOP AOP Aspect Oriented Programming 意为 面向切面编程 通过预编译方式和运行期动态代理实现在不修改源代码的情况下 给程序动态统一添加功能的一种技术 可以理解成动态代理 是Spring框架中的一个
  • Web前端学习(六)HTML5列表标签

    列表标签 ul li 语法 ul li 精彩少年 li li 美丽突然出现 li li 触动心灵的旋律 li ul 有序列表 ol li 语法 ol li 前端开发面试心法 li li 零基础学习html li li JavaScript全
  • Linux内存逆向映射(reverse mapping)技术的前世今生

    本文来自于微信公众号Linux阅码场 一 前言 数学大师陈省身有一句话是这样说的 了解历史的变化是了解这门学科的一个步骤 今天 我把这句话应用到一个具体的Linux模块 了解逆向映射的最好的方法是了解它的历史 本文介绍了Linux内核中的逆
  • Web网络安全-----Log4j高危漏洞原理及修复

    系列文章目录 Web网络安全 红蓝攻防之信息收集 文章目录 系列文章目录 什么是Log4j 一 Log4j漏洞 二 漏洞产生原因 1 什么是Lookups机制 2 怎么利用JNDI进行注入 JNDI简介 LADP RMI 三 Log4j漏洞