Blueborne - Linux 内核 Bluetooth 子系统的远程拒绝服务(DoS)安全漏洞 - CVE-2017-1000251

Public Date: September 13, 2017, 10:01
已更新 September 13, 2017, 10:01 - English(英语) Japanese
Resolved 状态
Important Impact
红帽产品安全团队已了解到一个会影响到 Linux 内核的 Bluetooth Host L2CAP 协议的安全漏洞这个安全漏洞被记录为 CVE-2017-1000251。此安全漏洞在 2017 年 9 月 12 日被公布, 它的严重性级别被定为重要(Important)

背景信息

逻辑链路控制和适配协议(L2CAP)在 Bluetooth(蓝牙)堆栈中的数据链路层工作,它为上层协议(如蓝牙)提供连接多路复用、分段及数据包重新组合的服务。上层协议会使用它来接收和发送客户端的 L2CAP 数据包。

Linux 的 Bluetooth 子系统处理来自于客户端的待配置数据包的代码中存在一个堆栈缓冲区溢出的问题。一个客户端可以发送一组随意的 L2CAP 配置参数,它们会被保存在一个堆栈的缓冲对象中。这些参数可能会超过缓冲区的长度,从而造成对相邻的内核堆栈内容的覆盖。在建立一个蓝牙连接时,这种情况会在进行授权验证前发生。因此,如果没有启用内核堆栈保护功能(CONFIG_CC_STACKPROTECTOR=y),一个未授权的用户可以利用这个安全漏洞,在通过蓝牙连接到一个系统时对系统进行破坏,并可能在受影响的系统上运行恶意代码。

致谢

红帽借此机会感谢 Armis Labs 报告了这个安全漏洞。

受影响的产品

红帽产品安全团队把此安全漏洞的严重性级别定为重要(Important)

以下版本的产品会受到影响:
  • Red Hat Enterprise Linux 6
  • Red Hat Enterprise Linux 7
  • Red Hat Enterprise MRG 2
请特别注意,PPC64 架构上运行的 Red Hat Enterprise Linux 7 并没有内建的堆栈保护,因此攻击者可能会利用这个漏洞远程在相关系统上运行代码。内核堆栈保护功能可以减少远程执行代码的风险,如果没有使用这个功能,当 Red Hat Enterprise Linux 7 PPC64 服务器运行了 Bluetooth 服务,且相应的模块被加载,则未授权的攻击者就有可能在此系统上远程执行代码。因为 PPC 64 的 Red Hat Enterprise Linux 7 没有提供 RHEL 的 Workstation 版本,所以那些带有蓝牙硬件且安装了 bluez 软件包的服务器就需要特别注意这个问题。但是,默认的服务器安装并没有安装 bluez 软件包,因此 bluetooth.service 单元文件(以及 bluetoothd)并不存在。

不会受到影响的产品

利用此安全漏洞进行的安全攻击只有在,存在漏洞的 Bluetooth 模块被加载,且运行了 bluetoothd 服务的情况下才有可能成功。

以下版本的红帽产品不会受到影响:
  • RHEL Atomic Host。虽然它带有存在漏洞的 Bluetooth 模块,但它没有 bluetoothd 服务,因此不会受到此安全漏洞的影响。
  • Red Hat Enterprise Linux 7 s390x 版没有存在漏洞的 Bluetooth 模块,因此不会受到此安全漏洞的影响。
  • Red Hat Enterprise Linux 5 在内核中使用早期版本的、没有此漏洞的 Bluetooth 子系统,因此不会受到此安全漏洞的影响。
虽然红帽的 Linux Container 不会直接受到内核问题(此安全漏洞存在于内核的 Bluetooth 模块中)的影响,但是红帽还是推荐使用最新版本的容器镜像。Container Health Index(Red Hat Container Catalog的一部分)可以用来检查容器的安全状态。

安全攻击描述及可能的影响

Linux 内核的 Bluetooth(蓝牙)子系统在处理从一个客户端所发出的待定的 L2CAP 配置的过程中存在一个安全漏洞。如果系统的堆栈保护功能在内核中启用(CONFIG_CC_STACKPROTECTOR=y,它会在除 s390x 和 ppc64[le] 以外的所有系统中启用),一个未授权的用户可以利用这个安全漏洞,在通过蓝牙连到系统时对系统进行破坏。因为堆栈保护功能的特性,我们无法完全排除攻击者利用这个安全漏洞运行恶意代码的可能性(我们相信这种可能性存在的机会非常小)。在没有使用堆栈保护功能的系统上(ppc64[le]。蓝牙模块没有包括在 s390x 中),一个未授权的攻击者可以通过蓝牙连接到系统,并利用这个漏洞在系统上使用 ring 0 (kernel) 权限远程运行任意代码。这一类的安全漏洞通常被称为“缓冲溢出”问题,攻击者可以利用这个漏洞,通过运行超过所分配缓冲区范围的任意代码来使某个程序函数错误地返回一个指针。因为是通过蓝牙来进行攻击,所以攻击者需要位于存在漏洞的系统的附近。

诊断您的系统

如果您的系统中存在蓝牙硬件,而且 Bluetooth 服务被启用并运行,则可能会受此漏洞的影响。特别是,此漏洞存在于 bluetooth.ko 内核模块代码中,如果系统加载了此模块,则系统就可能会存在此安全漏洞。

确定您的系统是否有漏洞

使用以下脚本来检查您的系统是否因为这个安全漏洞而存在安全隐患。 您可以下载 GPG 签名来验证这个脚本的真实性。这个脚本的当前版本是 1.0。


采取行动

强烈建议所有运行受影响内核版本的红帽客户在补丁可用后尽快更新其内核。有关受影响软件包的详情以及推荐的缓解操作如下。需重启系统方可应用内核更新。

受影响产品的更新

现可为运行 Red Hat Enterprise Linux 7.2 或更高版本的用户提供 kpatch。 请创建一个支持问题单以便获取 kpatch。

有关 kpatch 的详情:RHEL 7 是否支持实时提供内核补丁(kpatch)?

产品软件包公告
Red Hat Enterprise Linux 7内核RHSA-2017:2679
Red Hat Enterprise Linux 7kernel-rt待发布
Red Hat Enterprise Linux 7.3 Extended Update Support*内核RHSA-2017:2680
Red Hat Enterprise Linux 7.2 Extended Update Support*内核待发布
Red Hat Enterprise Linux 6
内核RHSA-2017:2681
Red Hat Enterprise Linux 6.7 Extended Update Support*内核RHSA-2017:2682
Red Hat Enterprise Linux 6.6 Advanced Update Support**内核待发布
Red Hat Enterprise Linux 6.5 Advanced Update Support**内核待发布
Red Hat Enterprise Linux 6.4 Advanced Update Support**内核RHSA-2017:2683
Red Hat Enterprise Linux 6.2 Advanced Update Support**内核待发布
Red Hat Enterprise MRG 2kernel-rt待发布
*需要一个有效的 EUS 订阅才可以获得此补丁程序。

如果您还没有有效的 EUS 订阅,请联系红帽的销售人员,或您专门的销售代表。

**需要有效的 AUS 订阅才可获得在 RHEL AUS 中的这个补丁。

补救操作

通常情况下,在一个系统上,如果内核堆栈内存被破坏,攻击者就可以轻松地利用此问题以内核 ring 0(如 root)的权限运行任意代码。RHEL 内核使用 gcc 编译时间参数来保护内存不会被破坏。gcc -fstack-protector 选项在一个程序函数的开始以及返回地址前增加了一个 canary 值。-fstack-protector-strong 会把 canary 保护扩展到本地堆栈变量,包括任何类型和长度的数组。在把数据复制到这些堆栈变量时,内核会验证 canary 值来检测任何可能的内存破坏,并可以通过产生一个内核 panic 以阻止可能的安全攻击。

当系统启动且 Bluetooth 服务被启用时,Bluetooth 内核模块(bluetooth、btusb、bnep)会被自动加载。通过使用系统范围的 modprobe 规则可以防止特定内核模块被加载。运行以下命令来把 Bluetooth 模块放入黑名单,从而可以在有蓝牙硬件的情况下防止相关模块被加载:
# echo "install bnep /bin/true">> /etc/modprobe.d/disable-bluetooth.conf
# echo "install bluetooth /bin/true">> /etc/modprobe.d/disable-bluetooth.conf
# echo "install btusb /bin/true">> /etc/modprobe.d/disable-bluetooth.conf

另外,当内核模块被禁用后,如果安装了 bluez 软件包(蓝牙工具程序),则需要在启动时禁用 Bluetooth 服务。对于 RHEL 7,以 root 身份运行以下命令:

# systemctl disable bluetooth.service
# systemctl mask bluetooth.service
# systemctl stop bluetooth.service

对于 RHEL 6,以 root 身份运行以下命令:

# service bluetooth stop
# chkconfig bluetooth off

请注意:如果内核模块已被加载,您可以使用 rmmod 命令手工卸载这些模块。根据系统所检测到的蓝牙硬件的不同,加载的蓝牙模块可能也会有所不同。rmmod 命令会在试图使用它时显示额外加载的蓝牙模块的信息。如果有额外加载的蓝牙模块,您也需要使用 rmmod 卸载这些额外的蓝牙模块。以 root 的身份运行以下命令来从运行的内核中卸载这些模块:

# rmmod bnep
# rmmod bluetooth
# rmmod btusb
    如果需要额外的帮助,请参阅此解决方案,或联系红帽全球支持服务

    Ansible Playbook

    一个 Ansible playbook 被提供。为了验证脚本的真实性,您可以同时下载 GPG 签名

    这会通过以下方式缓解此安全漏洞的影响:在 /etc/modprobe.d/disable-bluetooth.conf 中创建一个黑名单文件,执行一个“假安装”来防止有安全漏洞的模块被加载。如果存在 Bluetooth 服务,它也会禁用 Bluetooth 服务。如果已有蓝牙模块被加载到运行的内核中,并且无法被删除,它会重启系统。因为存在了这个黑名单文件,相关的模块将不会被加载。在已解决此安全漏洞的软件包可用并被安装后,您就可以从 /etc/modprobe.d/disable-bluetooth.conf 中删除这个文件。

    playbook 在运行时使用一个名为 HOSTS 的变量来指定主机,它通过以下形式被调用(假设 'hostname' 已在 inventory 文件中定义):
    # ansible-playbook -e HOSTS=hostname cve-2017-1000251-mitigation.yml	
     这个 playbook 需要 root 权限并需要指定 'become: true',因此您需要使用一个 带有适当权限的账户。

    Comments