本文经授权转自公众号CSDN(ID:CSDNnews)
距离「719 微软蓝屏事件」刚过去一个月,诸多企业还没有从这场“史上最大规模 IT 故障”的影响中彻底走出,如今又有一个核弹级的 Linux 内核重大安全漏洞被曝出:著名系统内核专家、《软件调试》作者张银奎发表了一篇文章,在技术圈内引起了广泛关注——《是谁在 LINUX 内核中开了这个大洞?》。
据张银奎表示,若该漏洞被黑客利用并爆发,其造成的后果将“超过 719 大蓝屏”。
1、一个“诡异的 oops”,引起注意
在介绍漏洞之前,有一点需明确:由于该漏洞尚处于 0day 阶段,相关细节敏感,因此张银奎仅分享了漏洞的可公开信息,并未公开敏感的技术细节部分。
根据张银奎在文中提到的内容,这个漏洞最初能被注意到,是因为他们的内核开发团队在测试专门为程序员打造的移动计算平台“幽兰”的系统镜像时,将内核升级到 6 + Ubuntu 24.04 之后,出现了一个随机的内核 oops(指 Linux 内核发生不正确的行为并生成错误报告),这个 “oops” 一旦发生,就会导致声音无法播放、reboot 失败等一系列问题——张银奎将其形容为:“一个诡异的 oops”。
本质上来说,这个 oops 与造成 719 蓝屏事件的原因类似,也是非法访问内存,即越界。但它的奇怪之处在于,这个越界访问的内存地址很长:003a72656c646e69。
图源:格友公众号
凭借多年经验,张银奎很快看出这个长地址中包含了很多可读的 ASCII 字符。稍作解释一下,内存地址的数据是由程序执行的代码或存储的数据决定的,它们往往是二进制格式,不容易直接读取为有意义的文本字符串。倘若出现了这种情况,可能会暴露程序的漏洞。攻击者可以利用这些漏洞进行恶意攻击,如通过缓冲区溢出注入恶意代码、执行任意代码、或窃取敏感数据。
为了搞清楚其中到底发生了什么,张银奎用 windbg 的 .formats 命令转换后,得到了以下结果:错误地址刚好对应的是「 :reldni」这 8 个字符。将这 8 个字符的顺序调整后,就是"indler: "(注意冒号后面还有一个空格)——为了方便描述,暂且把该漏洞称为 indler 漏洞。
0:000> .formats 203a72656c646e69
Evaluate expression:
Hex: 203a7265`6c646e69
Decimal: 2322294337798696553
Octal: 0200723446255431067151
Binary: 00100000 00111010 01110010 01100101 01101100 01100100 01101110 01101001
Chars: :reldni
Time: Wed Jan 23 00:02:59.869 8960 (UTC + 8:00)
Float: low 1.10463e+027 high 1.57927e-019
Double: 1.9725e-153
据张银奎介绍,这个 oops 是随机的,而根据 oops 提供的函数地址,发生崩溃的内核函数名叫 sysfs_file_ops,源代码如下:
static const struct sysfs_ops *sysfs_file_ops(struct kernfs_node *kn)
{
struct kobject *kobj = kn->parent->priv;
if (kn->flags & KERNFS_LOCKDEP)
lockdep_assert_held(kn);
return kobj->ktype ? kobj->ktype->sysfs_ops : NULL;
}
对此,张银奎笃定:“对于这样的内存溢出问题,这肯定不是第一现场。这只是一个受害者。”
为了找到这个“第一现场”,即造成内存溢出的元凶,张银奎及其内部团队试了很多办法都不能有效定位,张银奎决定采用最直接的方式:用集成在 Linux 内核中的内存错误检测工具 KASAN(Kernel Address Sanitizer),这款工具由 Google 工程师开发。
团队成员把启用了 KASAN 的内核成功运行后,很快就找到了一个内存越界写(又称为缓冲区溢出)。张银奎仔细查看了内核消息:
内核时间戳 25 秒时,KASAN 报告初始化完毕。
[ 25.146063] kasan: KernelAddressSanitizer initialized (generic)
到了 33 秒时,KASAN 抓到越界写。
[ 33.918201] ==================================================================
[ 33.918234] BUG: KASAN: slab-out-of-bounds in __memcpy_fromio+0x8c/0x100
[ 33.918259] Write of size 8 at addr ffffff8101838afc by task systemd/1
[ 33.918283] CPU: 5 PID: 1 Comm: systemd Not tainted 6.1.43-rockchip-rk3588-taiyi #1.0.8
[ 33.918300] Hardware name: YourLand CodeBook (DT)
[ 33.918312] Call trace:
[ 33.918324] dump_backtrace+0xd0/0x130
[ 33.918338] show_stack+0x20/0x30
[ 33.918350] dump_stack_lvl+0xac/0xe0
[ 33.918368] print_report+0x164/0x464
[ 33.918384] kasan_report+0xc8/0x1a0
[ 33.918400] __asan_store8+0x80/0xa4
由于涉及到敏感的安全问题,张银奎省略了代码中很多的调用栈。在关于这次非法方法的详细细节中,他也省略了一些具体函数名:
[ 33.919049] The buggy address belongs to the object at ffffff8101838000
which belongs to the cache kmalloc-4k of size 4096
[ 33.919061] The buggy address is located 2812 bytes inside of
4096-byte region [ffffff8101838000, ffffff8101839000)
[ 33.919082] The buggy address belongs to the physical page:
[ 33.919094] page:00000000663e5886 refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x101838
[ 33.919109] head:00000000663e5886 order:3 compound_mapcount:0 compound_pincount:0
[ 33.919123] flags: 0x8000000000010200(slab|head|zone=2)
[ 33.919146] raw: 8000000000010200 0000000000000000 dead000000000122 ffffff8100002a80
[ 33.919159] raw: 0000000000000000 0000000000040004 00000001ffffffff 0000000000000000
[ 33.919172] page dumped because: kasan: bad access detected
[ 33.919192] Memory state around the buggy address:
[ 33.919205] ffffff8101838a00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[ 33.919218] ffffff8101838a80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[ 33.919234] >ffffff8101838b00: 01 fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
[ 33.919246] ^
[ 33.919255] ffffff8101838b80: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
[ 33.919270] ffffff8101838c00: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
[ 33.919282] ==================================================================
2、隐藏 12 年之久的“ indler 漏洞”浮出水面
发现 indler 漏洞后,张银奎团队对其进行初步分析,得出了该漏洞的三大关键特征:
该漏洞至少在 2012 年就已经存在,且至今仍在 Linux 内核主代码树,即从 2012 年至今的所有 Linux 内核中都有这个漏洞,从终端到云数以亿计的计算机系统都存在这个漏洞代码,所有的云上服务器也都是易感的。
该漏洞可在用户空间通过 Linux 的虚文件机制触发,即黑客可以通过用户空间的某个应用做跳板,进而攻击内核。
该漏洞可能导致的溢出可以非常大,甚至长达数千字节。
更值得一提的是,张银奎还查看了这个 indler 漏洞代码的来源:它来自 Google。
基于以上特征,indler 漏洞若被黑客利用,势必将引发不堪设想的后果:通过这个漏洞,黑客能实施多种攻击,包括向内核空间注入代码实现远程代码执行(RCE),进行 DOS 攻击促发溢出,从而让内核崩溃、停止工作。
3、启示录
虽然 Linux 是知名的开源项目,但现实应用中这些开源软件并非完全不受安全漏洞的影响。值得注意的是,根据 CSDN 发布的《2024 中国开发者调查报告》数据显示,46% 的开发者表示自己在使用开源软件时遇到过安全漏洞,这些漏洞可能被恶意用户或攻击者利用,从而带来潜在风险和损失。
在本次事件中,若按照张银奎的说法,那么 indler 漏洞被黑客利用,其引发的后果将不亚于至今仍令人心有余悸的「719 微软蓝屏事件」,要知道就在不久前:
微软遭遇重大服务中断,全球用户无法访问云计算平台,导致航空公司取消航班。
随着数千台机器开始离线,澳大利亚的银行、航空公司和电视广播公司发出警报。
欧洲最大的航空公司之一瑞安航空也表示,遇到了“第三方”IT 问题,影响了航班起飞。
监测机构 DownDetector 显示,美国许多平台和企业也出现了断网问题,包括 Amazon Web Services、Instagram、eBay、Visa、ADT 和 PlentyOfFish。
……
事后,根据保险机构 Parametrix 的估算,719 蓝屏事件引发的全球技术中断,使得美国财富 500 强企业(不包括微软)面临 54 亿美元的经济损失,全球经济损失总额可能达到 150 亿美元左右。直至目前,很多公司还在向罪魁祸首 CrowdStrike 追责中,这一影响并未完全结束。
张银奎透露,由于 indler 漏洞目前是 0day 状态,他们正在与专业的安全团队合作,考虑如何做好缓解方案,负责任的报告漏洞细节,防止被黑客利用。
而对于使用开源软件的组织和个人来说,及时更新并审查代码以确保安全性至关重要。同时,考虑采用专业的安全工具来降低潜在风险也是必要的。
相关阅读:
本文转自公众号“CSDN”,ID:CSDNnews
---END---