驱动安全攻防战,数字签名成“纸老虎”

  • 来源:电脑报
  • 关键字:驱动,安全,数字
  • 发布时间:2024-08-23 11:34

  Cloud

  上个月CrowdStrike 驱动更新导致的Windows 全球蓝屏事件余波渐渐隐去,人们不禁感叹“世界是个草台班子”,也有很多人认为当今的信息安全比想象中要脆弱许多,但好奇的你肯定想知道,驱动程序既然如此关键,为什么系统厂商没有对它施加有效的防护措施呢?其实不然,驱动安全在Windows 系统里的级别很高,其中数字签名就是最关键的一环。

  抢占系统资源,大多驱动运行在内核态

  如果我们故意编译一个错误的程序在Windows 操作系统下运行,会出现什么情况呢?答案就是程序被强制退出,或弹窗提示运行错误,但无论如何你都不会看到系统蓝屏,这是因为对于普通应用程序来说,会被内存管理单元将其与操作系统内核隔离,也就是说普通应用程序是运行在“用户态”之下的,所以当单个进程或应用程序崩溃时只会返还系统资源,并不会影响到其他程序和操作系统内核。而真正能让系统蓝屏的原因往往是操作系统本身的缺陷,以及硬件设备的驱动程序故障,而恰巧这次事件就是因为错误函数运行在驱动程序里,所以最基本的解决方法就是删掉CrowdStrike 自动更新的错误驱动程序文件。

  那为什么驱动程序不像普通程序那样和系统内核之间进行隔离,运行在用户态呢?这是因为如果运行在内核态,驱动程序就会有很高的访问权限,可以扫描系统整个系统内存,包括其他应用程序使用的内存,并进行有针对性的资源分配。

  当然,现在也有相当多的驱动同时运行在内核态和用户态,比如显卡驱动,所以也有很多软件厂商会要求用户关闭内核隔离功能,比如一些游戏厂商的反作弊程序就需要借助内核态的驱动才能运行。但问题在于,程序运行在内核态就意味着,操作系统无法精准地将有故障的驱动程序和正在使用该驱动的应用程序强制退出,所以一旦出现问题就只能靠蓝屏来提醒用户了……

  数字签名阻止恶意驱动?用途其实也有限

  既然恶意驱动的威力如此巨大,如果你的动手能力足够强,写了一个恶意的.sys 驱动程序并创建了对应的服务,是不是就能让目标机器蓝屏了呢?在二十年前确实可以,由于Windows 的生态特性,当年并没有对开发者进行必要的限制,所以一天遭遇几次蓝屏都非常正常,但经过微软内部分析后发现,大部分蓝屏问题并不是Windows 的内核问题,而是各种驱动程序所导致,随后就推出了非常关键的一个审核机制——驱动程序数字签名。

  如果驱动带有“WHQL”后缀就证明经过了微软官方认证,这套认证要求所有驱动都需要经过必要测试才能发布,这样一来,当驱动程序出问题后微软很快就可以定位到驱动程序的责任人或企业,而历史证明正是因为这一通操作才让蓝屏的情况越来越少。

  正常情况下,数字签名的确可以阻止第三方恶意驱动,但问题在于这个数字签名检查是可以跳过的,我们可以在管理员身份下通过命令行命令,或者在高级启动的高级选项里更改启动设置来禁用驱动程序强制签名,重启电脑即可生效。当完成这一系列操作后,刚刚写好的恶意驱动和服务就能直接运行了,而在运行的一瞬间就会导致蓝屏,所以数字签名更像是一种“防君子不防小人”的安全措施。

  那么为什么Windows 不完全强制驱动程序数字签名呢?这是因为有很多用户还在使用较老的硬件,这些硬件的驱动程序也比较老,没有数字签名,所以不能“一杆子打死”。而且这次CrowdStrike 驱动故障事件也证明了驱动数字签名也并非牢不可破,但驱动开发商内部出现问题时就很可能牵一发动全身,此次事件最让人费解的就是这么一个看似很容易在校验阶段复现的Bug,居然能够畅通无阻地通过开发、校验、自动测试、代码合并、小范围推送、大范围推送等一系列的流程,的确让人匪夷所思。

关注读览天下微信, 100万篇深度好文, 等你来看……