1. 项目概述与核心价值
最近在安全研究圈里,BleedingTooth这个系列漏洞的热度又起来了。这其实是一组存在于Linux内核蓝牙协议栈(BlueZ)中的高危漏洞,最早在2020年被披露。当时谷歌安全研究团队放出的细节,特别是CVE-2020-12351和CVE-2020-12352的组合利用,号称能在蓝牙4.0环境下实现“零点击”远程代码执行,听起来就挺吓人的。所谓“零点击”,意味着攻击者不需要目标用户进行任何交互,比如点击链接或接收文件,只要蓝牙开着且在有效范围内,就可能被悄无声息地攻破。
我之所以花时间重新折腾这个“老”漏洞的复现,原因有几个。首先,虽然漏洞披露已有几年,但受影响的设备基数庞大,从物联网设备到服务器,再到桌面Linux系统,只要使用了特定版本的BlueZ,都可能存在风险。其次,理解这类底层协议栈的漏洞,对于构建更稳固的系统安全认知非常有帮助。它不像Web漏洞那样有直观的界面,而是深入到操作系统内核和无线通信协议的交界处,复现过程能让你对蓝牙协议的工作机制、内核内存管理有更深刻的理解。最后,复现一个相对复杂的漏洞利用链,本身就是对研究能力的一次综合锻炼,涉及环境搭建、代码分析、调试技巧等多个环节。
这篇文章,我会以一个实践者的角度,带你从头到尾走一遍BleedingTooth漏洞的复现过程。我不会只给你几个命令了事,而是会详细解释每个步骤背后的“为什么”,分享我在搭建环境、编译利用代码、调试过程中踩过的坑和总结的技巧。目标读者是对系统安全、漏洞研究感兴趣的开发者或安全爱好者,你需要具备基本的Linux操作、C语言理解和编译调试能力。即使你是新手,跟着步骤走,也能在可控的实验室环境中,亲眼看到这个漏洞是如何从理论变成实际攻击的。
2. 漏洞原理深度解析
要成功复现一个漏洞,光会跑脚本是不够的,必须理解它到底“坏”在哪里。BleedingTooth实际上包含了多个CVE编号的漏洞,我们复现的重点是其中最危险的两个:CVE-2020-12351和CVE-2020-12352。它们组合起来,构成了一个从信息泄露到远程代码执行的完整攻击链。
2.1 CVE-2020-12351:越界读取漏洞
这个漏洞的本质是Linux内核蓝牙模块( net/bluetooth/hci_event.c )在处理L2CAP(逻辑链路控制和适配协议)信号时,存在一个越界读取(Out-of-Bounds Read)缺陷。攻击者可以精心构造一个畸形的L2CAP配置请求包,诱使内核的 l2cap_parse_conf_req 函数读取超出预定缓冲区范围的内存数据。
简单来说,想象一下内核有一张表格(缓冲区)用来记录蓝牙连接的各种参数。正常的数据包会告诉内核:“请把A信息填到表格的第1到第5格。”而恶意数据包可能会说:“请把A信息填到表格的第1到第100格。”但表格实际上只有50格,内核在忠实地执行这个“越界”读取指令时,就会把第51到第100格(这些格子可能存放着其他进程的敏感数据,甚至是内核地址)的内容也读出来,并通过蓝牙信号发回给攻击者。这就导致了内核内存信息的泄露。
泄露的信息里,最关键的是所谓的“内核指针”。你可以把它理解成内存中重要数据结构的“家庭住址”。拿到这个地址,攻击者就对内核内存布局有了一定的了解,为后续更精准的攻击(比如绕过安全防护机制)打下了基础。这个漏洞本身不会直接执行代码,但它为下一个漏洞提供了至关重要的“情报”。
2.2 CVE-2020-12352:堆溢出漏洞
在通过CVE-2020-12351拿到一些“情报”后,攻击者就可以利用CVE-2020-12352发起致命一击。这是一个位于 net/bluetooth/l2cap_core.c 文件中的堆缓冲区溢出漏洞,具体发生在处理L2CAP配置响应时。
蓝牙设备在建立连接或重新配置参数时,会交换配置请求和配置响应。内核在解析对方发来的配置响应时,需要根据响应中的选项类型和长度,将数据复制到内核中预先分配好的一块堆内存里。问题出在,内核代码没有充分验证一个名为 mtu (最大传输单元)的选项数据的长度。攻击者可以发送一个声称自己 mtu 值非常大的配置响应(比如65535),但实际跟随的数据却很短。内核在复制数据时,会按照声明的巨大长度去分配内存,但复制操作本身却可能因为逻辑错误,写入超出实际分配缓冲区大小的数据。
这就好比你去邮局寄包裹,你说要一个能装下冰箱的大箱子(声明大长度),邮局给了你一个对应的空位。但你实际只放进去一本书(实际数据很短),然而由于邮局内部处理单据的流程有bug,工作人员却按照“冰箱箱子”的尺寸,在你的包裹位和隔壁的包裹位里都塞满了无关的填充物(溢出数据),把隔壁包裹(其他内核数据结构)给破坏了。通过精心构造这些“填充物”(shellcode或ROP链),攻击者就能劫持程序执行流程,最终在内核态执行任意代码。
2.3 组合利用的逻辑链条
单独来看,CVE-2020-12352的堆溢出利用条件比较苛刻,因为攻击者需要知道精确的内存布局来布置攻击载荷。而CVE-2020-12351的越界读取恰好提供了泄露内存布局信息的能力。因此,典型的BleedingTooth攻击链是:
- 攻击者主动与目标设备建立蓝牙连接。
- 利用CVE-2020-12351发送恶意L2CAP配置请求,触发越界读取,从目标内核中泄露包含堆内存布局的关键地址信息。
- 根据泄露的地址信息,精心构造针对CVE-2020-12352的恶意L2CAP配置响应数据包。
- 发送该恶意响应包,触发堆缓冲区溢出,覆盖关键函数指针或返回地址,实现内核权限的代码执行。
注意 :漏洞影响特定版本的BlueZ(Linux蓝牙协议栈实现)和内核。通常,Linux内核版本在5.9之前且启用了蓝牙支持的系统都可能受影响。我们的复现环境需要精确匹配存在漏洞的版本。
3. 实验环境搭建与配置
漏洞复现的第一道坎,就是搭建一个合适且安全的实验环境。我们不建议在任何生产环境或日常使用的主
877




被折叠的 条评论
为什么被折叠?



