2021年夏天,缓冲安全研究员在戴尔SupportAssist组件里挖出一个BIOS漏洞,区溢编号CVE-2021-21551。出漏这个漏洞的缓冲本质是缓冲区溢出——攻击者可以往一个固定大小的内存区域里塞入超量数据,覆盖掉相邻的区溢内存结构,最终拿到系统最高权限。出漏戴尔随后发布了补丁,缓冲但问题的区溢根子比一个补丁要深得多。
具体来说,出漏出问题的缓冲是SupportAssist里一个叫dbutil_2_3.sys的驱动文件。这个驱动暴露了一个IOCTL接口,区溢任何本地用户都能调用。出漏它接收用户传入的缓冲缓冲区指针和长度,却没有认真校验长度是区溢否超出目标缓冲区容量。结果就是出漏经典的栈溢出场景:你给一个只能装256字节的桶倒512字节的水,多出来的部分漫到旁边的内存里。攻击者精心构造溢出的内容,就能改写函数返回地址,让CPU跳去执行自己的代码。
我翻过几份公开的分析报告,发现这个漏洞的利用门槛低得让人不安。不需要物理接触,不需要管理员密码,只要能在目标机器上运行一个普通程序就行。恶意软件一旦落地,调用这个驱动提权,几秒钟内就能从普通用户变成SYSTEM。更麻烦的是,这个驱动被预装在海量戴尔消费级和商用设备上——OptiPlex、Latitude、XPS、Alienware,几乎覆盖了戴尔整个产品线。受影响设备数量以亿计。
戴尔的处理方式也值得说两句。漏洞公开后,他们发了一个安全公告,建议用户卸载旧版SupportAssist并安装新版本。但很多企业环境里,这个驱动被IT部门打包进系统镜像,或者被其他管理软件静默安装。用户根本不知道它存在,更别提主动去更新。我见过一台2022年出厂的Latitude笔记本,出厂镜像里仍然带着有漏洞的驱动版本,直到用户手动运行了戴尔更新工具才被替换掉。这中间的时间差,足够攻击者做很多事情。
缓冲区溢出本身是个老问题,上世纪八十年代就有论文讨论。但老问题反复出现在BIOS配套软件里,说明厂商在开发底层驱动时对安全边界的重视程度仍然不够。驱动跑在内核态,一行校验代码的缺失就可能让整台机器的安全模型崩塌。戴尔后来在更新里加了长度检查,也引入了更严格的IOCTL访问控制,但这些都是事后补救。
普通用户能做什么?如果你用的是戴尔电脑,打开“程序和功能”看看有没有SupportAssist,有的话确认版本号。戴尔官网有专门的漏洞公告页面,输入服务标签就能查。实在不放心,直接卸载SupportAssist也不影响系统核心功能,只是少了自动更新和硬件诊断的便利。企业IT管理员更该检查一下自己的镜像里是否还残留着dbutil_2_3.sys这个文件,它在C:\Windows\System32\drivers\目录下,删掉之前记得先停掉相关服务。
这个漏洞不是孤例。同年惠普、联想也爆出过类似问题,都是OEM预装软件里的驱动提权漏洞。厂商为了提供“开箱即用”的体验,塞进去一堆常驻后台的驱动和服务,攻击面就这样一点点撑大了。安全圈有句话:每多一个内核驱动,就多一个可能被利用的入口。戴尔这次算是又验证了一遍。