颤抖吧 Javaer, log4j 史诗级漏洞

2021-12-10 09:16:39 +08:00
 eviladan0s

漏洞预警: https://mp.weixin.qq.com/s/WBbAthHY36qY0w9e4UUl4Q

本质上是 log4j 里的 lookup 方法存在 jndi 注入(看图): https://adan0s-1256533472.cos.ap-nanjing.myqcloud.com/uPic/20211210091200YOXTYd.jpg

百度、谷歌、苹果的框全都沦陷了: https://adan0s-1256533472.cos.ap-nanjing.myqcloud.com/uPic/202112100913225Wncr7.png

修复措施: 在 log4j2.component.properties 配置文件中设置 log4j2.formatMsgNoLookups=true ,可以暂时缓解避免受漏洞的影响。

之所以是史诗级,是因为不仅 log4j 使用范围广,而且日志数据你不知道流到哪里的 log4j 就会触发

34545 次点击
所在节点    Java
189 条回复
chawuchiren
2021-12-10 23:13:21 +08:00
@Bromine0x23 logback, 我按照网上的漏洞测试,从结果看是不在影响范围内
2i2Re2PLMaDnghL
2021-12-10 23:26:55 +08:00
@aguesuka 顺便,我稍微 digging 了一下,写这个 bug 的是 Woonsan Ko (这种拼写法应该是韩国人或者朝鲜人),rgoers 并未仔细检查直接把 patch 并入。
Bromine0x23
2021-12-11 00:29:15 +08:00
@chawuchiren 是不存在,本身就是两个不同的日志库,runtime 下是用不到的。

漏洞能被利用的一个前提似乎是消息本身直接被拼接到 message 参数中,而不是使用占位符从 params 传入。看起来和 SQL 注入异曲同工
aguesuka
2021-12-11 01:07:21 +08:00
@2i2Re2PLMaDnghL 看 134 和 53 楼
coolwind1981
2021-12-11 01:15:53 +08:00
apache-log4j-2.15.0-bin 已经发布了,可以从下面页面下载并使用新版 log4j-api-2.15.0.jar & log4j-core-2.15.0.jar
https://logging.apache.org/log4j/2.x/download.html
coolwind1981
2021-12-11 01:19:29 +08:00
ysc3839
2021-12-11 01:23:54 +08:00
@Bromine0x23 我也认为这是类似 SQL 注入的情况。log4j 的锅大概是文档没有明确表示传入的应该是可信的 format ,以及默认开启高风险功能。
aguesuka
2021-12-11 01:39:21 +08:00
@2i2Re2PLMaDnghL 我追踪 git 历史的时候没注意到重命名, 你是对的
ysc3839
2021-12-11 01:47:39 +08:00
@Bromine0x23 我去问了下搞 Java 开发的朋友,情况不是这样的,而是所有传进去的参数都是 format string 。
lxml
2021-12-11 02:05:33 +08:00
我看见 git 仓库震惊了,都说 Java 裹脚布又臭又长,这个日志框架代码量能有这么多???
Bromine0x23
2021-12-11 02:05:52 +08:00
@ysc3839 确实,这有点离谱了,试了下传个 ${env:PATH} 啥的进去都转换,按直觉来说应该只在 pattern 里起作用
xiadong1994
2021-12-11 02:29:19 +08:00
@powerman #114 这个漏洞跟内存没有任何关系
plko345
2021-12-11 08:15:13 +08:00
@cwyalpha 内网的是不是不用担心这个
frankies
2021-12-11 08:49:16 +08:00
B 站一个 up 主抢先发了复现视频,还声称全网第一并应以为傲,简直了!
https://www.bilibili.com/video/BV1FL411E7g3
Cbdy
2021-12-11 09:17:37 +08:00
spring boot 默认用的 logback ,不会引入 log4j 依赖,logback 只是测试时依赖了 log4j ,估计是为了性能对比之类,编译 /运行时不会引入 log4j

如果用的 spring boot 默认的日志配置,没有手动修改实现,是不要紧的

依赖传递树:

org.springframework.boot:spring-boot-starter:2.6.1 -> org.springframework.boot:spring-boot-starter-logging:2.6.1 -> ch.qos.logback:logback-classic:1.2.7
Esec
2021-12-11 09:37:32 +08:00
aaa5838769
2021-12-11 10:44:05 +08:00
@frankies 脸皮挺厚的,阿里都没说话。。
guyeu
2021-12-11 11:52:53 +08:00
对大多数 Java 应用来说,直接使用的应该都是 slf4j ,实在不行换一种实现呗,Java 的好处就是工程体系特别完备,永远都有 Plan B
powerman
2021-12-11 12:07:08 +08:00
@xiadong1994 我知道跟内存没什么关系,我只是想说 C/C++是因为历史原因,没有做边界检查,才出那么多问题,本来照理说 Java 都不应该出现 RCE 这种问题的,因为作为高级语言已经屏蔽了边界检查这种历史问题,不应该开历史的倒车,出比 C/C++更低级的错误跟问题
seliote
2021-12-11 12:19:32 +08:00
@aguesuka 作者是 Apache

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/821241

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX