设备驱动审计:保障系统安全的关键环节
1. 引言
过去,像冲击波(Blaster)和SQL Slammer这样的蠕虫造成了大规模的互联网中断,将网络安全问题推到了普通消费者的视野中。尤其是Slammer蠕虫,它甚至破坏了ATM机与其所属金融机构之间的通信。而2005年年中,Zotob蠕虫导致美国有线电视新闻网(CNN)部分运营能力瘫痪,更是让安全问题深入人心。
操作系统供应商开始投入更多时间、精力和资金来消除其产品中的安全问题。攻击者也需要适应这种变化,寻找新的攻击途径。他们有两个选择:一是攻击运行在操作系统之上的应用程序,如网络服务器、办公应用、图像查看器和即时通讯客户端;二是针对操作系统运行的核心——设备驱动。
2. 为何要关注设备驱动漏洞
长期以来,人们认为虽然设备驱动存在编程错误,但由于大多数设备驱动处理的不可信输入较少,且难以利用,即使能执行代码也难以保证可靠性,所以威胁较低。然而,随着WiFi和蓝牙等技术的应用,攻击者有了新的攻击途径。这些协议的驱动相对较新,测试不够充分,且处理的协议复杂,容易存在漏洞。
如今,内核和设备驱动利用技术有了很多进展,包括教授如何编写Windows内核级shell代码的论文和专门针对驱动的新漏洞利用程序。大多数供应商无法控制操作系统中使用的驱动,第三方设备驱动是操作系统安全架构中的严重薄弱环节。
在开始设备驱动审计之前,你需要了解自己操作系统中的设备驱动数量:
-
Linux
:在终端中输入
lsmod
命令。
-
Windows
:使用Windows驱动开发工具包中的DeviceTree工具。
-
OS X
:在终端中输入
kextstat
命令。
需要注意的是,由于无线技术的采用,设备驱动的危险性正在改变。802.11和蓝牙等新通信媒体的驱动没有经过像以太网驱动那样多年的严格测试,仍然存在很多漏洞,再加上现代无线协议的复杂性,存在大量可被远程利用的漏洞。
3. 什么是设备驱动
3.1 操作系统与内核
操作系统(OS)就像一个交通警察,管理计算机上的硬件和软件,决定运行哪些进程,并处理大多数用户不知道的后台任务。内核是操作系统的核心,它管理和抽象硬件,为进程提供启动和停止的通用接口,管理进程使用的内存,提供安全保障和标准的系统调用,还定义了内存模型。常见的x86硬件操作系统将内存分为ring0(内核空间)和ring3(用户空间),内核运行在ring0,具有最高权限,而应用程序如Web浏览器和文字处理器运行在ring3。
3.2 设备驱动的作用
设备驱动是操作系统供应商抽象硬件支持或低级操作的一种方式。它不仅可以驱动硬件,还可以执行一些低级任务,如访问特定类型的文件系统和执行反盗版操作。设备驱动通常以某种方式加载到内核中,但不同操作系统的加载方式不同。
驱动程序通常遵循操作系统与设备之间的数据传输方式,并根据请求执行任务。它们提供控制设备或资源访问、处理中断和处理I/O请求的通用例程。
3.3 不同操作系统的设备驱动
| 操作系统 | 特点 | 开发方式 |
|---|---|---|
| Windows | 通常不允许用户直接与硬件通信,通过硬件抽象层(HAL)作为操作系统与底层硬件之间的屏障。有多种类型的驱动,如控制设备的驱动、解码特定协议的驱动和基于任务优先级实现特定功能的驱动。 | 使用驱动开发工具包(DDK),通过Windows驱动基础框架确保创建高质量的驱动,并符合定义的规范。 |
| OS X | 内核XNU在内存管理和进程处理方面与Windows内核有很大不同。使用I/O Kit框架开发和实现设备驱动,允许开发者用C++编写驱动,具有速度快和代码可重用的优点。不同类型的驱动完成不同任务,驱动通常按家族组织以实现代码重用。 | 使用I/O Kit框架。 |
| Linux | 驱动通常称为模块,可以比Windows更直接地访问硬件。内核源代码是免费分发的,构建Linux驱动相对简单。Linux内核架构允许在运行时轻松加载和卸载模块,但Linux不提供验证驱动的功能,找到合适的驱动可能需要一些尝试和错误。 | 基于内核源代码构建。 |
4. 设置测试环境
4.1 选择测试环境
设置不同类型驱动的测试环境是一项复杂的任务,通常设置环境的时间比找到实际漏洞的时间还要长。在设置测试环境时,首先要确定测试的目标。许多不同类型的驱动处理不可信代码,如USB、FireWire、WiFi和蓝牙驱动。最快、最简单的测试驱动漏洞的方法是模糊测试(fuzzing),因此构建一个适合模糊测试的环境是首要目标。
最好的测试环境是基于Linux的机器。Linux可以进行WiFi测试的原始数据包注入,并操作不同的驱动(如USB)以产生所需的结果。这里选择Fedora Core 5(FC5),因为它对硬件的支持良好,并且可以通过yum包管理器轻松添加新包。
4.2 选择硬件
在笔记本电脑上进行安装,方便使用和携带。虽然笔记本电脑内置了WiFi和蓝牙硬件,但选择第三方卡,原因如下:
- 可以将第三方设备从一台机器移动到另一台机器,确保使用相同的硬件,消除硬件和固件实现中的细微差异,避免影响测试结果的重现性。
- 可以选择更适合模糊测试的特定硬件。
这里选择NETGEAR WG511U用于WiFi测试,Linksys USBBT100 version 2适配器用于蓝牙测试。这两种设备在Fedora Core 5下都有很好的支持,容易找到且价格相对较低,即使测试导致硬件故障,更换也很方便。
4.3 安装软件包
安装基础操作系统并准备好与目标设备通信的第三方硬件后,需要添加一些软件包。由于构建许多测试工具需要内核源代码,因此首先要安装最新的内核及其源代码,以便可以随意重新编译模块。可以通过yum安装,也可以直接下载内核源代码并从头构建内核,或者使用现有内核的.config文件确保相同的硬件支持。
4.4 WiFi测试环境设置
-
安装驱动
:使用第三方开源驱动MadWiFi驱动基于Atheros的NETGEAR卡。可以使用lorcon对MadWiFi进行补丁,以允许创建和注入原始数据包。补丁过程很简单,只需应用相关版本的补丁文件,然后在MadWiFi的顶级源代码目录中输入
make命令进行编译。 -
检查安装结果
:如果安装成功,模块将在
/lib/modules/<running kernel version>/net目录中创建。如果安装失败,可以参考MadWiFi文档获取帮助。可以使用iwconfig或iwlist ath0 scan命令检查网卡是否正常工作。 -
启用原始接口
:要进行原始流量注入和嗅探,需要启用ath0的原始接口。在终端中输入
sysctl –w dev.ath0.rawdev=1,然后输入ifconfig ath0raw up。此时,ath0raw可以用于网络嗅探器,查看通常不可见层的原始流量。 -
模拟接入点
:为了进行某些阶段的测试,测试机器需要模拟接入点。可以编写一个脚本
setup.sh来快速设置:
#!/bin/bash
ifconfig ath0 up
ifconfig ath0 10.0.0.1
iwconfig essid "syngressForceAudit"
iwconfig ath0 mode Master
iwpriv ath0 mode 2
iwconfig ath0 channel 1
sysctl –w dev.ath0.rawdev=1
ifconfig ath0raw up
4.5 蓝牙测试环境设置
-
安装软件包
:如果系统中没有安装BlueZ Linux蓝牙栈的软件包,需要进行安装。可以使用预构建的软件包,也可以从源代码编译。需要注意的是,构建蓝牙模糊测试代码需要开发库和头文件,这些文件通常位于
/usr/include/Bluetooth目录中。 -
检查和启动服务
:安装软件包时会安装一个初始化脚本,可以使用
/etc/init.d/Bluetooth status命令检查蓝牙卡的状态。如果蓝牙服务没有运行,可以使用/etc/init.d/Bluetooth start命令启动。可以使用hcitool命令验证蓝牙连接是否正常工作,例如hcitool –dev可以获取当前安装设备的信息,hcitool –scan可以扫描附近的蓝牙设备。 -
捕获流量
:可以使用
hcidump工具捕获蓝牙流量并了解蓝牙协议。该工具支持许多与网络嗅探器相同的功能,包括协议解码、将流量捕获到文件以及显示蓝牙流量的头部和有效负载。
5. 测试驱动
5.1 模糊测试方法
在建立好测试环境后,可以使用模糊测试方法对不同类型的驱动和协议进行测试。模糊测试是指生成大量畸形流量,以检查驱动是否能够正确处理错误情况。高级模糊测试工具通常用C语言编写,以保证速度和稳定性,但开发时间长,小的修改也需要重新编译。对于快速简单的模糊测试,可以使用Python等解释型语言,例如
scapy
工具,它可以方便地创建和注入数据包。
为了确保模糊测试的有效性,需要对目标驱动进行分析,找出代码中的薄弱环节,例如使用过多内存操作函数(如
memcpy
)、字符串处理不当或错误处理能力差的代码。在Windows下,可以使用
dumpbin
命令的
/IMPORT
选项查看二进制文件导入的函数,以确定是否使用了不安全的函数(如
sprintf
和
strcpy
)。
5.2 WiFi驱动测试
5.2.1 了解802.11协议
在进行WiFi模糊测试之前,最好先阅读802.11的请求评论(RFC)文档,了解所有有效的流量,包括数据包的格式、发送和接收顺序以及协议的实现方法。这有助于发现未明确定义的情况,例如如果先收到类型b的数据包再收到类型a的数据包会发生什么。
5.2.2 WiFi状态及重要性
WiFi有三种重要状态,在进行模糊测试时需要对每种状态都进行测试:
-
未关联(Unassociated)
:机器已启动但未连接到任何接入点(AP),可能正在扫描信任列表中的AP以加入。如果发现只能在这种模式下利用的漏洞,可能需要采取一些额外的操作,如强制机器断开网络并寻找新的网络,或模拟它正在搜索的信任AP。
-
关联(Associated)
:机器已连接到AP并可以正常通信。这是最容易利用的状态,因为在这种模式下接受的数据包类型更多。利用这种状态可能需要模拟AP。
-
Ad-Hoc
:机器可以直接相互连接,无需中间的AP。利用这种状态可能比较棘手,但幸运的是,大多数驱动在无法找到信任的AP时会默认进入这种模式。
需要注意的是,模糊测试只有在设备处于正确的目标状态时才有效。发送大量畸形数据可能会导致网卡改变状态,开始寻找更好的连接,从而忽略你的数据包。可以在受害机器上运行一个代理脚本来确保它保持在正确的状态。在Linux中,可以使用
iwconfig
命令编写脚本,在OS X中,可以使用
airport
命令实现相同的功能。
5.2.3 Scapy工具介绍
Scapy支持创建多种不同类型的数据包。要获取所有支持的数据包类型列表,可以运行scapy脚本,然后输入
ls()
命令。对于无线模糊测试,
Dot11
类型可以创建正确的数据包,蓝牙数据包可以使用
L2CAP
类型创建。可以使用
ls()
命令查看特定类型的参数信息。
Scapy的
fuzz()
函数非常有用,将任何类型用
fuzz()
函数包裹,未提供的参数将随机生成。结合循环发送数据包,基本的模糊测试逻辑就完成了。使用
sendp()
命令发送数据包,并可以指定是否循环发送。例如:
sendp(frame, loop=1)
以下是一些使用Scapy进行WiFi模糊测试的示例代码:
-
模糊信标数据包中的ssid标签
:
#!/usr/bin/python
import sys
from scapy import *
import time
conf.iface="ath0raw"
attacker=RandMAC()
victim=sys.argv[1]
frame=Dot11(addr1=victim ,addr2=attacker,addr3=attacker)/
Dot11Beacon(cap="ESS")/
Dot11Elt(ID="SSID",info=RandString(RandNum(100,255)))/
Dot11Elt(ID="Rates",info='\x82\x84\x0b\x16')/
Dot11Elt(ID="DSset",info="\x03")/
Dot11Elt(ID="TIM",info="\x00\x01\x00\x00")
while 1:
sendp(frame)
运行命令:
#./beacon.py <victim mac addr>
- 模糊扫描结果 :
#!/usr/bin/python
import sys
from scapy import *
victim=sys.argv[1]
attacker=RandMAC()
conf.iface="ath0raw"
frame=Dot11(subtype=5, addr1=victim, addr2=attacker, addr3=attacker)/
Dot11ProbeResp(timestamp=1, cap=0x411)/
Dot11Elt(ID=0,info=RandString(RandNum(1,50)))/
Dot11Elt(ID="Rates", len=8, info="\x82\x84\x0b\x16")/
Dot11Elt(ID=3, len=1, info="\x01")/
Dot11Elt(ID=42, len=1, info="\x04")/
Dot11Elt(ID=47, len=1, info="\x04")/
Dot11Elt(ID=50, len=4, info="\x0c\x12\x18\x60")/
Dot11Elt(ID=221, len=6, info="\x00\x10\x18\x02\x01\x05")/
Dot11Elt(ID=221, info=RandString(RandNum(1, 250)))
while 1:
sendp(frame)
- Ad-Hoc模式下模糊认证数据包 :
#!/usr/bin/python
import sys
from scapy import *
conf.iface="ath0raw"
attacker=RandMAC()
victim=sys.argv[1]
frame=Dot11(addr1=victim ,addr2=attacker,addr3=victim)/
fuzz(Dot11Auth())
sendp(frame, loop=1)
5.3 蓝牙驱动测试
5.3.1 确定目标
从审计的角度来看,蓝牙和WiFi类似。首先要将目标设备设置为可发现模式,这样运行
hcitool scan
命令时就能找到它。
5.3.2 参考RFC文档
和WiFi一样,应该查看蓝牙的RFC文档,寻找可能的测试起点。一个很好的起点是在L2cap层进行简单的模糊测试,过去,乱序数据包和超大请求已经取得了很好的效果。
5.3.3 蓝牙数据包结构及测试代码
可以在
l2cap.h
文件中找到蓝牙数据包结构的更多信息,该文件还包含L2cap命令代码的定义。以下是L2cap命令代码的定义:
/* L2CAP command codes */
#define L2CAP_COMMAND_REJ 0x01
#define L2CAP_CONN_REQ 0x02
#define L2CAP_CONN_RSP 0x03
#define L2CAP_CONF_REQ 0x04
#define L2CAP_CONF_RSP 0x05
#define L2CAP_DISCONN_REQ 0x06
#define L2CAP_DISCONN_RSP 0x07
#define L2CAP_ECHO_REQ 0x08
#define L2CAP_ECHO_RSP 0x09
#define L2CAP_INFO_REQ 0x0a
#define L2CAP_INFO_RSP 0x0b
可以使用以下简单的代码片段循环遍历每个命令代码:
>>> cmd=1
>>> while cmd!=12:
... frame=L2CAP_Hdr()/L2CAP_CmdHdr(code=cmd)
... cmd=cmd+1
如果运气好,在WiFi或蓝牙模糊测试中可能会导致系统蓝屏,例如在对常见笔记本电脑的蓝牙实现进行模糊测试时就可能出现这种情况。需要注意的是,不要将模糊测试仅限于计算机,越来越多的设备如手机、PDA和WiFi路由器等都集成了蓝牙和WiFi,这些设备虽然更难被攻破,但也更有可能存在漏洞。而且这些设备的补丁更新通常比较困难,漏洞可能会长期存在。
6. 展望未来
6.1 物理层测试的进展
目前进行的模糊测试大多在物理层之上进行,因为即使在Linux审计平台提供的访问级别下,在物理层进行模糊测试通常仍不可行。不过,该领域正在取得进展,例如软件定义无线电(SDR)技术。SDR允许在物理层对无线进行测试,能够创建几乎任何数据包和信号强度,这不仅可以审计操作系统运行的驱动,还能审计设备本身的固件。
6.2 供应商采取的措施
供应商正在采取多种措施来帮助消除驱动问题:
-
NX技术
:近期的x86处理器及其运行的操作系统开始利用NX(非可执行内存)等功能,该功能使某些内存区域无法执行代码,旨在降低缓冲区溢出的有效性。
-
虚拟机管理程序(Hypervisors)
:虚拟机管理程序旨在允许不同的操作系统在同一物理硬件上运行。由于虚拟机管理程序对周边设备和物理内存访问拥有最终控制权,攻击者若要进行设备驱动利用,就需要绕过它。
然而,这些方法只是防止利用的障碍,实际上几乎所有防止利用的障碍都可以被绕过,真正修复这个漏洞的唯一方法是实施更好的编码实践,并只允许使用遵循这些实践的驱动。
6.3 现实中的攻击场景:数字地雷
想象一下这样的场景:攻击者使用数字地雷进行攻击。数字地雷是一种小型单板计算机,可以隐藏在人流量大且适合使用笔记本电脑的区域。这台单板计算机配备了能够进行原始数据包注入的无线网卡、蓝牙模块和可利用这些硬件的操作系统,并加载了针对不同操作系统的各种漏洞利用程序。
攻击者通过各种方法(如指纹识别驱动)远程确定目标操作系统。当发现易受攻击的机器时,漏洞利用程序就会启动,如果成功,将安装一个包含僵尸程序的恶意有效负载,该僵尸程序在有互联网访问时可以登录命令和控制网络。如果受攻击的设备不是计算机,而是如启用蓝牙的手机,数字地雷还可以捕获电话簿等信息,供垃圾邮件发送者使用。
例如,在机场、咖啡店、火车站、会议场所等地方放置针对流行笔记本电脑和移动设备内置无线网卡的数字地雷,每周可能会收获数百个新的僵尸程序,以及无数用于垃圾邮件目的的电话号码和电子邮件地址。
6.4 防御困境
设备驱动攻击的可怕之处在于防御困难。由于驱动程序在如此低的级别运行,个人防火墙和基于主机的入侵防御系统(IPS)设备可能无法阻止甚至检测到这些类型的攻击。如果在驱动级别发现漏洞,除了禁用受影响驱动对应的设备外,几乎没有其他有效的保护措施。这意味着,若要避免WiFi漏洞带来的风险,在不可信区域就不能使用WiFi。而且,许多攻击可以在最终用户不知情或不参与的情况下发生。
下面是一个简单的mermaid流程图,展示了数字地雷攻击的大致流程:
graph LR
A[隐藏数字地雷] --> B[扫描目标设备]
B --> C{设备是否脆弱?}
C -- 是 --> D[启动漏洞利用程序]
D --> E[安装恶意负载]
E --> F[控制僵尸程序]
C -- 否 --> B
7. 总结
设备驱动审计是保障系统安全的重要环节。随着网络安全形势的变化,设备驱动成为攻击者的新目标,尤其是WiFi和蓝牙等新兴技术的驱动,由于其相对较新且测试不充分,存在较多漏洞。
通过本文介绍的方法,我们可以对设备驱动进行有效的审计和测试,包括设置测试环境、使用模糊测试方法对WiFi和蓝牙驱动进行测试等。然而,我们也看到,防御设备驱动攻击面临诸多挑战,供应商虽然采取了一些措施,但真正解决问题还需要从编码实践入手。
在日常生活中,当我们身处充满笔记本电脑的拥挤区域,且出现异常多的系统崩溃时,就要警惕可能存在的设备驱动攻击。我们应该增强安全意识,尽量避免在不可信区域使用可能存在漏洞的设备和网络。同时,开发者和供应商也应该加强对设备驱动的安全管理,提高驱动的质量和安全性。
以下是一个总结表格,对比不同操作系统的设备驱动特点和测试方法:
| 操作系统 | 设备驱动特点 | 测试环境设置 | 测试方法 |
| ---- | ---- | ---- | ---- |
| Windows | 有硬件抽象层(HAL),多种类型驱动,使用DDK开发 | 使用DeviceTree工具查看驱动,可通过DDK相关工具构建测试环境 | 用dumpbin查看导入函数,结合模糊测试 |
| OS X | 内核XNU不同,用I/O Kit框架开发,驱动按家族组织 | 用kextstat命令查看驱动,搭建基于XNU特性的测试环境 | 参考官方文档,使用合适工具进行模糊测试 |
| Linux | 驱动称模块,可直接访问硬件,内核开源 | 用lsmod命令查看驱动,选择合适发行版(如FC5)搭建环境 | 利用现有工具(如MadWiFi、scapy)进行模糊测试 |
总之,设备驱动审计是一个复杂但至关重要的领域,我们需要不断关注其发展,采取有效的措施来保障系统的安全。
超级会员免费看
984

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



