这篇文章展示了Microsoft Windows 10(以及11)的一个漏洞,该漏洞允许攻击者模拟先前配对的蓝牙低功耗(BLE, Bluetooth Low Energy) HID设备,特别是BLE键盘,从而向PC注入不需要经过加密的按键。
文章中设置的场景是,Windows系统作为BLE主设备,有一个之前配对过并合法连接的BLE键盘。在经过一段时间闲置后,该BLE键盘会断开以节省电量。这个漏洞可以此时在不破坏BLE加密保护的情况下模拟合法键盘向PC注入数据,下图将演示经过简化的攻击过程:
BLE键盘在这个阶段与Windows系统的主设备已经完成了配对连接,产生和交换了长期密钥(LTK)。
BLE键盘在用户停止活动几分钟后,终止BLE通道并进入睡眠状态,停止所有蓝牙通信,直到用户再次按下一个键。
在BLE键盘停止活动期间,攻击者伪装成该BLE键盘,向Windows系统的主设备发送不需要经过加密的自定义信息,并被Windows系统的主设备接收并处理。
这样的攻击能够成功是基于什么原理呢?下文将简单进行解释。
-
关于BLE的一些概念
BLE (Bluetooth Low Energy)是一种蓝牙协议,适用于节能、低通信要求的设备。有许多设备使用这种通信技术而不是常规蓝牙,BLE比起常规蓝牙也有非常大的不同。为了理解这个漏洞,我们需要了解BLE的一些概念,比如其配对过程和连接过程。
为此,我们必须了解BLE的协议栈,它分为两个部分:主机(Host)部分,包括ATT、GATT和SMP等高级协议;控制器(Controller)部分,包括链接管理器(Link Manager)和LE Radio(PHY)。每个部分既可以在单个物理设备中实现(例如BLE键盘),也可以在两个不同的物理设备中实现(例如笔记本电脑,在操作系统级实现主机部分,在固件级实现控制器部分)。这两个部分可以通过HCI接口(主机-控制器接口),使用命令(由主机发送到控制器)和事件(由控制器发送到主机)进行通信。
在BLE通信中有两个参与者:一个是向附近公告其存在的从设备,另一个是在接收到从设备的公告信息后启动连接的主设备。从设备具有向主设备公开的属性,通过使用这些属性,我们可以发送和接收信息。当连接启动时,设备可以选择首先执行配对过程(如果它们希望加密通信)或不进行配对直接开始传输数据(这将导致连接未加密)。文章假设场景中的Windows系统主设备和BLE键盘两个设备执行了配对过程。
BLE配对过程确定了主、从设备建立这对设备加密所需的通用密钥的步骤,这个过程是为BLE通信提供加密和认证所必需的,该过程获得的密钥被称为LTK(长期密钥)。BLE定义了两种配对方案:LE遗留(Legacy)配对和LE安全配对。执行这两个配对过程可以创建一个LTK,该密钥将被用于每次连接来产生会话密钥(SK)。LTK在主机层计算和存储,主机将其传递给链接控制器来产生SK。然后链接层将使用SK来加密通信。
下图展示了首次连接(在配对发生之前)的简化消息交换,以及配对完成后加密通道的建立。
-
发现漏洞
如果不需要进一步的通信,为了节能,大多数蓝牙低功耗设备就会断开连接。当两个之前配对过的设备想要重新连接时,它们将使用与配对完成后加密通道建立时相同的消息流,不再执行配对过程。我们发现的漏洞正可以在重新连接的阶段被利用。
在加密通道建立之前,蓝牙规范允许两个设备交换一些不经过加密的消息,例如:控制器级的LL_FEATURE_REQ或LL_VERSION_IND;主机级的GATT和ATT消息。每当配对的BLE设备发起连接时,可以使用LL_ENC_REQ和后续消息重新建立加密。蓝牙规范允许在从设备接收到LL_ENC_REQ后发送不经过加密的消息,从设备的控制器可以在发送LL_ENC_RSP之前清空缓冲区中不经过加密的数据。此处就是我们的机会,在加密过程启动之后加密通道建立之前,从设备控制器可以向主设备发送不经过加密的数据。下图展示了主机被允许处理这些消息的确切时机:
从设备在绿色箭头标出的时刻发送的数据必须由主设备控制器处理,然后发送给主设备主机。主设备主机需要决定是否要处理这些消息。漏洞正是在此:对于使用BLE并与Windows操作系统配对的HID设备,如键盘或鼠标,主设备主机将接受并处理这些不经过加密的消息,而不是等待表明加密通道最终建立的HCI_ENCRYPTION_CHANGE确认。攻击者可以通过模拟合法的HID设备来利用这个漏洞,并在不知道LTK的情况下,在这个窗口期模拟真正的HID设备,向主设备发送包含不经过加密的按键信息并被处理。
-
利用漏洞
文章进行了两次利用漏洞进行注入的尝试,首次尝试是在主机层发送按键信息,这次尝试并不能稳定成功;第二次尝试是在控制器层发送高级的HID报告信息,并捕获从设备控制器,阻止从控制器发送LL_ENC_RSP消息继续进行加密通道建立,在最好情况下,在通信终止前此方案可以写入超过13000个字符。
可以进行攻击的前提条件:
-
需要知道配对键盘发送的HID报告格式,这可以通过分析与被攻击电脑配对的键盘类型来获得。
-
需要知道配对键盘的蓝牙地址(BDADDR)。为此,我们需要在键盘重新连接时监听BLE通信(例如使用Sniffle)。
-
需要在受攻击电脑的BLE范围内。
原文始发于微信公众号(COMPASS Lab):Wireless Keystroke Injection via BLE