本文分析了针对USB接口的多种攻击方法及原理,并提出了相应的安全测试手段和防御途径,可为后续USB接口安全测试工具的研究和测试工作的开展提供指引。
USB已经成为计算机与智能设备的必备接口之一,广泛应用于社会的各个场景。近年来各类硬件产品的安全事件层出不穷,出现了多种针对USB接口的攻击手段,导致相关系统面临着严重的安全风险。开展USB接口的安全测试方法研究,能有效评估设备的安全强度,降低系统安全隐患,提升整体防护能力。通过分析针对USB接口的多种攻击要点,提出了相应的安全测试方法及防护手段。
通用串行总线(Universal Serial Bus,USB)是一种具备热插拔、体积小、成本低、扩展性好等优点的总线接口技术,其应用包括鼠标键盘、打印机、智能手机及网卡等多种设备,经过多年的发展已经升级为3.0版本,理论速度可达5.0 Gb/s。
USB提供了多种设备协议规范,包括USB MSC(大容量存储)、USB HID(人机接口设备)、USB PowerDelivery(快速充电规范)以及USB OTG(On-The-Go)等。
USB接口具备跨平台的特性,各个系统平台都遵循一致的USB标准,因此一旦遭受到恶意攻击,将影响大量设备的正常运行。USB接口面临着不同层次的恶意攻击方向,部分敏感数据在通信过程中存在着信息泄露的风险,相关协议和驱动也存在着安全隐患。
USB接口的数据通信
USB总线接口由USB主机、USB设备和两者之间的互连组成。USB通信过程中,通过调用Windows API函数,系统I/O管理器将主机请求构造成一个I/O请求包(I/O Request Packet,IRP),并把它传递给USB功能驱动。
USB功能驱动接收到IRP以后,根据数据载荷包含的操作指令构造出相应的URB请求块(USB Request Block),并将此URB放入一个新的IRP中,然后把这个IRP向下传递给USB总线驱动。USB总线驱动根据该IRP中URB的数据执行相应的操作,操作完成后把结果返还给USB功能驱动。USB功能驱动将包含结果数据的IRP返还给I/O管理器,最后I/O管理器将此IRP操作结果返还给应用程序。USB接口的数据通信流程如图1所示。
USB主机和USB设备之间的通信是由USB控制器控制的。主机侧和设备侧的USB控制器分别称为主机控制器和设备控制器。主机控制器驱动和USB设备驱动构成了USB总线驱动,其中前者用于控制插入接口中的USB设备,后者用于控制USB设备与主机之间通信,从而实现具体的业务。USB的驱动结构如图2所示。
USB主机控制器驱动由USB核心驱动(USBCore Driver,USBD)和USB主机控制器驱动(USB Host Controller Driver,HCD)组成,协议相关的操作由两部分共同处理完成。
其中,HCD实现了主机控制器的硬件抽象,向下管理和检测主控制器硬件的各种行为,向上接受USBD的调用和管理,主要功能包括主机控制器初始化、根HUB设备配置、相应接口函数提供以及完成数据传输等。
USBD是USB主机驱动的核心,是USB设备驱动与HCD通信的唯一通道。USBD一方面接收来自上层驱动传递的非USB格式数据流,按协议进行数据处理后传递给HCD,另一方面处理来自下层的HCD数据,传递给上层的设备驱动程序。
根据USB接口协议规范,USB总线上的所有数据传输都是由USB主机发起的。当USB设备连接到集线器时,集线器会将状态变化信息传递给USB主机,此后USB主机通过根集线器向USB设备发送命令、获取USB设备的各种信息,包括USB设备传输类型、USB速度及设备ID号等。
USB事务是USB主机和USB设备之间数据传输的基本单位,每次事务过程以2~3个数据包的形式进行USB总线传输。每个数据包均包含以下2~3个步骤:
(1)USB主机控制器向USB设备发出相应操作指令;
(2)USB主机控制器和USB设备之间传递读写请求,其方向取决于第一部分的命令是读还是写;
(3)数据的接收方向发送方报告此次数据是否传输成功。
通过对USB接口通信过程的分析,可以从交互数据的产生、分发及处理等途径对USB接口开展攻击测试。
USB接口设备与主机进行交互时,攻击者可以通过监听USB接口的方式,将线路中的数据流旁路出来,然后按照USB总线协议格式解析数据包,以此获取USB接口设备与主机的交互数据。
部分具有身份认证功能的设备如认证key、加密U盘等,在使用过程中需要输入账号密码等敏感信息,如果在交互过程中没有对数据进行保护,则可能导致关键信息的泄露。
USB功能驱动由开发者编写,实现了USB设备与主机之间通信的基本操作。由图2可知,在USB驱动结构层次中,USB功能驱动位于HCD上方,不与实际的硬件打交道,而USB功能驱动实现对硬件设备的控制是通过向USBD发送包含URB的IRP来实现的。
URB作为描述与USB设备通信所用的基本载体和核心数据结构,根据驱动的需要发送或接受的数据。USB设备中的每个端点都会处理一个URB队列,当URB被USB设备驱动创建后,承载了主机与USB接口产品的指令数据,会被安排给USB设备的特定端点。
因此,实现监听USB接口的一种方式是在设备进行敏感数据操作时,采用软件或硬件的方式旁路出操作系统发送给驱动程序的IPR包,然后解析IRP包中承载的URB数据,根据上下文即可获得所需的敏感数据。
反编译技术通过对低级语言代码进行分析转化,可以得到等价的高级语言代码。通过反编译可以实现对USB接口设备重要功能函数的定位和分析,从而获取相关的敏感代码信息。
在USB驱动体系中,设备功能驱动主要负责处理I/O请求,用户模式下所有驱动程序的I/O请求全部由操作系统化为IRP类型的数据结构,而大部分请求是在派遣函数(DispatchFunction)中处理的。
IRP的基本属性包括MajorFunction和MinorFunction,分别记录了IRP的主类型和子类型。驱动程序在接收到不同类型的IRP后,操作系统会根据MajorFunction将IRP分发到不同的派遣函数中。在派遣函数中IRP得到处理,同时也可以确定这个IRP属于哪种MinorFunction。
对具有认证、加密及交互等功能函数的USB接口设备,可以采用反编译软件对驱动和dll等文件进行反编译,通过分析反编译后的源代码或伪代码,以此获得目标程序中派遣函数或关键处理函数的信息如函数名、参数值、处理逻辑及输入输出路径等,为后续的数据读取、权限控制等做准备。
当USB接口设备与主机进行通信时,通过拦截交互的数据包并对数据包进行篡改,可能会破坏设备的正常功能;或者采用构造异常数据、重放指令数据包的方式,使USB接口产品接收到错误的指令,则可能返回部分敏感信息,从而实现对USB接口设备的攻击。
IRP传输时首先会被传递到设备栈最顶层的地方,然后逐步传递到下面的驱动程序。操作系统在构造设备栈时,I/O管理器可以使一个设备对象附加到另一个初始驱动程序创建的设备对象上,与初始设备对象相关的驱动程序决定的IRP,也将被发送到附加的设备对象相关的驱动程序上,这个被附加的驱动程序称为过滤驱动程序。
过滤驱动可以在设备栈的任何层次中插入,过滤驱动创建的关键代码为Device类。其中,AddDevice函数构造过滤器的实例,将创建的设备通过IoAttachDeviceToDeviceStack绑定到被过滤的设备上。对应不同的过滤功能,需要拦截的IRP也不同。在这个类里通过把过滤器插入设备栈实现IRP的拦截功能,进而可以使用自定义的完成例程来实现特定的功能。
因此,可以通过在USB接口设备的功能驱动上添加过滤驱动,使用过滤驱动程序来检查、修改和完成它接收到的IRP,或者构造自己的IRP,从而达到修改数据的目的,实现对USB接口产品的有效攻击测试。
对于具备USB接口的主机类设备,可以通过控制用户的键盘获取操作权限。采用人机接口设备(HumanInterface Device,HID)攻击可以将一个USB接口设备模拟成为键盘,让主机将其识别为键盘类型,然后可以对主机进行脚本模拟按键攻击。
HID攻击属于物理层面攻击。在驱动程序中,所有HID定义的设备驱动程序提供了对应数据类型和格式的自我描述包,计算机上的HID驱动程序可以解析数据和实现数据I/O与应用程序功能的动态关联。
由于一般主机对HID设备缺少严格的检测措施,只是简单识别设备类型(HID设备标识符),计算机无法区分哪些是合法用户设备,哪些是恶意设备。通过插入带有攻击代码的USB设备,随着恶意代码的加载执行,便可实现HID攻击。
所以,通过修改设备反馈信息让电脑将其他设备误认为HID设备,就可以利用计算机和用户输入的外围设备之间的基本信任实现攻击,从而获取控制权限。
结合针对USB接口的多种攻击测试手段,相应的安全检测方法可以从以下几个方面开展。
检测数据传输过程是否加密的方法可以通过采用Bushound、Usbtrace等USB接口监听软件,或者USB协议分析仪等硬件设备捕获USB设备与USB主机之间的交互信息。
开展安全测试时,首先开启监听工具,插入被测设备。待主机上的应用程序输入账号密码等敏感信息时,监听工具旁路线路上的通信数据包,然后将数据进行分析比对,若发现旁路数据与输入数据一致,则说明该USB设备存在明文数据传输的隐患。
检测数据存储过程是否加密的方法可以通过读写USB接口设备的存储空间验证。首先读取USB产品的存储空间数据,写入特定数据后再次读取存储空间,最后比对前后存储空间数据列表,验证是否存在可识别的输入指令。若发现一致的数据,则说明该USB接口设备存在敏感数据明文存储的隐患。
检测敏感文件保护可以通过查看设备软件是否采取了反逆向工程技术,防范攻击者对设备文件的反编译分析。测试过程中可以采用IDA等反编译软件对驱动和dll等文件进行反编译,通过分析反编译的文件代码,查看是否可以获取到如加密函数、数据存储位置、参数设置等一些敏感代码的信息。若未进行反编译处理,则说明该USB接口设备存在敏感数据泄露的隐患。
检测USB接口设备能否正确应对错误的指令数据。开展测试时,通过采用过滤驱动挂载的方式篡改USB接口设备的通信数据,并观察该设备的反应。若篡改数据可导致设备产生不正常的响应,则说明该设备未对错误信息进行有效处理。
检测USB接口设备能否正确应对重放的指令数据。采用过滤驱动软件对USB接口设备的通信数据进行捕获和重放,并观察该设备的反应。若重放数据能导致USB接口设备再次返回相同的敏感数据,则说明该USB设备未对重放信息进行有效处理。
检测USB接口设备能否识别并阻止恶意设备。当插入外部设备时,查看被测设备能否通过在系统的安全事件日志中收集相应事件,并通过分析设备名称和ID识别恶意设备。若未对外部设备的信息进行判断,则说明该USB接口设备不能识别恶意设备。
具有敏感数据传输需求的USB接口设备应在传输过程中对数据进行加密处理。采用认证协议或者加密算法对需要传输的关键信息进行处理,保证数据包即使被攻击方捕获也无法从中获取敏感数据。
具有敏感数据存储需求的USB接口设备应在存储过程中对数据进行加密处理。采用加密算法对需要存储的敏感信息进行加密,使得攻击方无法通过读取地址空间的方式获取敏感数据。
具有敏感信息交互功能的USB接口设备的相关代码文件应进行安全加固。通过加壳、混淆等技术手段对相关文件进行保护,使得攻击方无法通过反编译、脱壳的方式,利用设备文件获取敏感代码信息。
USB接口设备应具备判断并处理异常数据的能力。通过完善USB接口产品对异常指令的处理机制,使得攻击方在发送异常数据时,产品能够做出正确的响应,避免进入异常状态。
USB接口设备应具备判断并处理重放数据的能力。通过采用时间戳、序列号等方式对数据包进行保护,使得攻击方在发送相同数据包时,USB接口产品能够根据标志屏蔽恶意数据包。
随着USB接口的广泛应用,相关设备面临的安全形势越来越严峻。本文分析了针对USB接口的多种攻击方法及原理,并提出了相应的安全测试手段和防御途径,可为后续USB接口安全测试工具的研究和测试工作的开展提供指引。
作者简介
陈肖(1989—),男,硕士,工程师,主要研究方向为网络信息安全与安全测评;
黄钟(1979—),女,硕士,高级工程师,主要研究方向为网络信息安全与安全测评;
余静(1978—),女,学士,工程师,主要研究方向为网络信息安全与安全测评。
选自《通信技术》2020年第一期 (为便于排版,已省去原文参考文献)
声明:本文来自信息安全与通信保密杂志社,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。