WebUSB:一个网页是如何从你的手机中盗窃数据的(含PoC)

介绍
今年9月15日,Chrome61发布,它启用了WebUSB作为其默认功能。而WebUSB是一个Javascript API,可以允许网页访问已连接的USB设备。这里的USB设备是指系统和工业的USB设备,所以不支持常见的USB设备(比如网络摄像头,HID或大容量储存设备)。然而通过WebUSB API,很多其他的USB设备可以被访问,且当用户授权给网页时,自己可能根本不了解网页获取的访问权限级别。
这篇文章探寻WebUSB的功能,以深入了解其工作原理,攻击方法及隐私问题。我们会解释访问设备所需的过程,以及浏览器是如何处理权限的,然后我们会讨论一些安全隐患,并演示一个网站如何使用WebUSB来建立ADB连接来入侵安卓手机。
基础
当USB设备插入主机时,浏览器会读取设备发送的描述符,然后将其储存在内部USB设备储存器中。此过程由Chrome的浏览器内核Blink处理。日志可以在chrome://device-log(GET参数“refresh = 1”非常有用)中查看。
根据规范,设备可以在其二进制 对象存储 中的平台描述符中明确地声明对WebUSB的支持。
Offset |
Field |
Size |
Value |
Description |
---|---|---|---|---|
0 |
bLength |
1 |
Number |
Size of this descriptor. Must be set to 24. |
1 |
bDescriptorType |
1 |
Constant |
DEVICE CAPABILITY descriptor type. |
2 |
bDevCapabilityType |
1 |
Constant |
PLATFORM capability type. |
3 |
bReserved |
1 |
Number |
This field is reserved and shall be set to zero. |
4 |
PlatformCapabilityUUID |
16 |
UUID |
Must be set to {3408b638-09a9-47a0-8bfd-a0768815b665}. |
20 |
bcdVersion |
2 |
BCD |
Protocol version supported. Must be set to 0x0100. |
22 |
bVendorCode |
1 |
Number |
bRequest value used for issuing WebUSB requests. |
23 |
iLandingPage |
1 |
Number |
URL descriptor index of the device’s landing page. |
浏览器将每个USB设备存储在自己的设备存储器中。WebUSB的可访问性由本机驱动程序支持所决定。在Windows上,我们可以通过浏览器访问由WinUSB驱动程序处理的每个USB设备。其他的诸如大容量存储设备,网络摄像头或HID等就无法通过网络访问了,因为它们具有处理这些设备的专用驱动程序。
根据规范(和本博客文章),一旦设备注册,浏览器就会显示一条通知。看起来像这样:

但是,这种行为不容易重现。我们在以下系统上尝试过:
Windows 7, Chrome 61 Windows 10, Chrome 61