
您是否知道完全合法的驱动程序可以使攻击者有机会在您的系统中进行长时间注册,甚至在重新安装后仍保留在系统中? 还是将您的计算机变成砖头? 例如,某些无害的看似受信任(签名)的驱动程序是用于覆盖BIOS的工具。 经过这样的攻击,只有程序员会保存。
在Windows中,存在受信任的应用程序/脚本/库以及其他 有趣的 危险的功能,例如执行任意代码,下载文件,绕过UAC等。 如果在内核组件中发现了这样的附加功能,它将变得更加有趣。
从Windows Vista x64开始,将应用驱动程序签名强制(DSE)策略-必须对所有内核级驱动程序进行签名。 如果侵入系统的攻击者(具有用户/管理员权限)想要获得最大访问权限(安装内核rootkit / bootkit / SMM-rootkit / BIOS-rootkit),则他将不得不以某种方式绕过驱动程序的签名要求。 在内核模式下从内核模式调用某些功能或指令的能力可以为攻击者提供提升特权,泄露信息或导致拒绝服务的工具。 我们将此功能称为双重用途功能(在某些情况下,这可以称为漏洞或后门,但是,关于正确定义的讨论不在本文讨论范围之内)。
DSE解决方法
让我们看看攻击者通常必须绕过DSE的选项(您必须以某种方式穿透ring0)。 下表总结了绕过DSE的方法及其优点和缺点(对于攻击者,请注意安全防护)。 值得注意的是,此信息从Vista开始适用于Windows x64。
从表中可以看出,具有双重用途的签名驱动程序是绕过攻击者DSE的最有吸引力的方法。
危险或双重用途功能
让我们看看攻击者在具有危险双重用途功能的驱动程序的存在下出现的恶意功能的示例。
- BIOS条目。 Lojax是一个例子。 攻击者使用了著名的RwDrv.sys并将其用于肮脏的目的:他们读取BIOS,进行修改并写回。 由于恶意代码位于SPI闪存上的固件中,因此重新安装Windows将无济于事。 如果BIOS覆盖失败(或被专门覆盖),那么它也将是令人不快的。 无论如何,您将不得不驱使程序员解决烦人的后果。
- 调用SMI处理程序。 首先,并不是所有的BIOS都对ring0模式下的代码同样无能为力:有多种读/写保护机制,因此可能需要降低安全性-进入SMM模式(最特权)。 从内核模式到达那里的一种方法是拉出SMI处理程序(很多情况下它们之间经常存在漏洞)。 要调用SMI处理程序,您必须能够写入I / O端口,并且只能使用ring0特权来完成。 也就是说,具有写I / O端口能力的驱动程序能够检测到易受攻击的SMI处理程序,该处理程序可以使攻击者以SMM模式执行代码。 在示例中,作者使用RwDrv.sys驱动程序。
- 有关系统的信息。 在某些情况下,读取内核内存(通过读取物理内存),读取BIOS,有关系统设置,连接的设备和启用/禁用的保护机制的信息(通过读取MSR,控制寄存器,访问输入/输出端口),可以检测到已知的管理程序(例如通过MSR的 VirtualBox)。 对于此任务,即使是只能读取而不一定要写入的驱动程序,也是最合适的。 例如,Belkasoft的RamCaptureDriver64.sys适合读取物理内存。
如果我们分析有关CVE的各种文章和注释,则可以从驱动程序中的ring3函数访问时区分一些潜在危险类别。 下表列出了危险功能及其相关信息的来源。
这还不是潜在危险功能的全部清单。 您还可以讨论读/写内核虚拟内存,读/写MMIO,访问PCI设备等。
前三个功能是最感兴趣的,也是最大的危险(也是最有可能检测到具有此类功能的驱动程序):读/写MSR寄存器,读/写I / O端口,读/写物理内存。 使用控制寄存器,您可以绕过某些保护机制,写入标志寄存器可以使您启用ring3中的读/写输入/输出端口(顺便说一下,本文在哈布雷(Habré)中提到),成功攻击第三方通道(通过访问缓存,监视计数器)性能/周期)是最有可能的。
在拉斯维加斯举行的DEFCON 27会议上创建该材料的过程中,研究人员Jesse Michael和Mickey Shkatov提出了题为“如果不能开车就离开内核”的工作 ,它也讨论了这个问题,我们建议您研究此材料以完成图片。 使用此类驱动程序的场景非常简单明了,并提供了负责最关键功能的代码段示例。 并且还提供用于工作和查找相似驱动程序的代码 。
总的来说,值得注意的是,此主题长期以来一直与安全研究人员有关。 早在2018年,研究员Alexander Matrosov在他的文章“是什么使OS驱动程序对BIOS构成危险?” 提出了这个问题,并演示了利用BIOS的简单性。
双功能驱动程序
以下是具有双重功能的驾驶员最著名的代表。
RwDrv.sys是一个非常受欢迎的驱动程序(随RWeverything实用程序一起提供)。 读写物理内存,I / O端口,MSR和控制寄存器。 它已在各种PoC中反复使用,然后在之前提到的Lojax rootkit中使用。 接口是用C ++ 为其编写的 ,并且还用于chipsec 。
cpuz / gpuz
读取和写入物理内存,端口和MSR。 有多个PoC实用程序正在使用它( 此处和此处 )。
pcdsrvc_x64-Dell驱动程序,有关更多信息,请联系此职位。 允许您在I / O端口中读取/写入物理内存。
AsIO64.sys

它提供了读取/写入物理内存和I / O端口的功能,并且还带有用于执行这些请求的便捷dll。
Asmmap64.sys是ASUS的另一个驱动程序,可让您读取/写入物理内存,I / O端口和MSR。 对于攻击者而言,这尤其令人愉悦,因为可以由没有管理员权限的普通用户访问驱动程序。 好奇的人可以求助于源头 。
来自MSI的ntiolib_x64.sys / winio64.sys驱动程序,在前面提到的文章中进行了详细描述。 使用ntiolib_x64.sys可以读写物理内存,I / O端口和MSR,winio64.sys提供了所有这些功能,但MSR除外。
通常,如果用户在没有管理员权限的情况下即可访问驱动程序(错误的ACL),或者当该驱动程序允许直接执行任意代码时(如bandainamcoonline.sys),这些危险功能将被视为漏洞。 在其他情况下,这仅仅是功能,并且由于用户具有管理员权限,因此他可以使用所有驱动程序功能,这是规范。
如果您认为这样的驱动程序不多于12个,那么您就大错特错了。 您可以看到一系列有趣的驱动程序。 此列表包含来自ASUS,AVAST,Razer,LG,American Megatrends和其他知名公司的驱动程序。 因此,它们很多,您只需要搜索即可。 因此,它们构成了真正的威胁。
Microsoft员工也理解此威胁。 他们将不胜感激有关此类驱动程序的信息;)

推荐建议
对于用户:
- 您不应不必要地坐在管理员帐户下并禁用UAC(尽管不难解决 )。
- 您可以安装检测器以尝试安装驱动程序(例如, 此处 )。
- 如果有必要将实用程序与此类驱动程序一起使用(诊断程序,用于更新BIOS等),请在使用后删除这些驱动程序。
- 设置Device Guard (如果您是Windows 10的所有者)。 使用此技术,您可以创建自己的代码完整性策略,并添加程序和证书的白名单。 例如,将任何内核模式驱动程序必须具有Microsoft WHQL签名的要求添加到策略中。 在本文中 ,您可以更好地熟悉为此目的设置Device Guard。
制造商最好不要签署此类驱动程序。 如果用户需要更新BIOS,检查系统是否存在漏洞(hello,chipsec),测量性能或执行其他一些需要安装此类驱动程序的操作,那么他很可能进入测试模式,执行所有这些操作然后退出。 可用性将下降,但安全性将提高。
结论
如果已签名,则无论如何您都无法信任它。 首先,您可以签署类似的签名,其次,攻击者可以利用此签名的签名(即使它来自受信任的制造商)。
信息安全专家不应从威胁模型中排除攻击者需要具有危险功能的驾驶员进行攻击的情况。 这样的驱动程序足够多;执行此操作非常简单。 如果不是使用RwEverything这样的流行驱动程序来进行攻击,而是使用一些鲜为人知的驱动程序来进行攻击,则检测起来将更加困难。 因此,您需要保持警惕,监视此类情况,并且不允许每个驱动程序启动到系统中。
作者:Elizaveta Khomenko