本帖最后由 图钉鱼 于 2025-8-31 02:02 编辑
https://nvd.nist.gov/vuln/detail/CVE-2020-14979
https://www.ijinshan.com/info/202003201525.shtml
https://ti.qianxin.com/blog/arti ... lready-been-cut-off
WinRing0x64.sys 驱动程序
WinRing0x64.sys这是一个被广泛使用的硬件访问库的内核驱动程序,许多合法的PC硬件监控和风扇控制软件(如雷蛇、赛睿、EVGA的产品)都使用它来访问I/O端口、MSR和PCI总线。
该驱动程序存在一个公开披露的安全漏洞,编号为 CVE-2020-14979。
漏洞描述:该漏洞允许本地用户,甚至是低完整性级别的进程,读取和写入任意内存位置。通过IDA分析发现的可通过IOCTL直接控制MmMapIoSpace函数参数的行为完全一致。
利用后果:攻击者可利用此漏洞将权限提升至最高级别的 NT AUTHORITY\SYSTEM 。
检测与定性:正因为这个已知的漏洞,会将其标记为威胁并进行隔离。
WinRing0x64.sys是漏洞驱动(BYOVD)攻击中的一个典型例子。攻击者在获得初始访问权限(如管理员权限)后,会将这个有合法签名但存在漏洞的驱动程序安装到受害者系统中,以此作为获取内核级权限的跳板。
具体的攻击实例是:在利用JetBrains TeamCity的漏洞(CVE-2024-27198)后,攻击者会植入XMRig加密货币挖矿程序,该挖矿程序会附带并利用WinRing0x64.sys来访问CPU的MSR以执行挖矿操作。在国内被勒索木马利用,金山和奇安信有介绍。
雷蛇已更新其Synapse软件,新版本不再包含此驱动程序。
导入表分析 :
IoCreateDevice, IoCreateSymbolicLink: 驱动会创建一个设备,并创建一个符号链接,使得用户空间的程序可以通过这个名称打开设备句柄,并与其通信。这是与驱动交互的入口,也是漏洞利用的起点。
MmMapIoSpace, MmUnmapIoSpace: (高危) 这组函数允许将任意物理内存地址映射到内核空间。如果用户能够控制传递给 MmMapIoSpace 的物理地址和长度参数,就能实现任意物理内存读写。这是一个可以完全接管系统的顶级漏洞。
HalGetBusDataByOffset, HalSetBusDataByOffset: (高危) 这组函数用于读写总线数据,例如PCI(e)设备的配置空间。如果用户能够控制总线类型、偏移和写入的数据,就可以修改硬件配置,可能导致系统不稳定(蓝屏),甚至在某些情况下,通过操纵DMA控制器实现任意内存访问。
KeBugCheckEx: (中危) 此函数用于主动触发蓝屏(BSOD)。如果驱动的输入验证不充分,攻击者可能通过发送一个畸形的IOCTL请求来触发这个函数,导致一个简单的拒绝服务(DoS)漏洞。
IofCompleteRequest: 用于完成来自用户空间的I/O请求(IRP)。
- NTSTATUS __stdcall DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
- {
- RtlInitUnicodeString(&DeviceName, L"\\Device\\rwdrv");
- Status = IoCreateDevice(DriverObject, 0, &DeviceName, 0x22u, 0, 0, &DeviceObject);
- RtlInitUnicodeString(&SymbolicLinkName, L"\\DosDevices\\rwdrv");
- Status = IoCreateSymbolicLink(&SymbolicLinkName, &DeviceName);
- DriverObject->MajorFunction[IRP_MJ_CREATE] = (PDRIVER_DISPATCH)DispatchCreateClose;
- DriverObject->MajorFunction[IRP_MJ_CLOSE] = (PDRIVER_DISPATCH)DispatchCreateClose;
- DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = (PDRIVER_DISPATCH)DispatchDeviceControl;
- DriverObject->DriverUnload = (PDRIVER_UNLOAD)DriverUnload;
- return Status;
- }
复制代码 DispatchDeviceControl 函数是所有潜在漏洞的入口。深入分析这个函数,查明它如何处理不同的IOCTL控制码,以及它是否将用户输入不安全地传递给了API (MmMapIoSpace, HalSetBusDataByOffset, KeBugCheckEx)。
设备名称: 驱动创建了一个名为 \\Device\\rwdrv 的设备对象。
符号链接: 驱动创建了一个名为 \\DosDevices\\rwdrv 的符号链接。
IOCTL处理函数: 所有发送到该设备的IOCTL请求(IRP_MJ_DEVICE_CONTROL)都由一个名为 DispatchDeviceControl 的函数处理。
- NTSTATUS __stdcall DispatchDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
- {
- PIO_STACK_LOCATION IrpStack;
- ULONG IoControlCode;
- PVOID InputBuffer;
- ULONG InputBufferLength;
- PVOID OutputBuffer;
- ULONG OutputBufferLength;
- NTSTATUS Status;
- IrpStack = IoGetCurrentIrpStackLocation(Irp);
- IoControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode;
- InputBuffer = Irp->AssociatedIrp.SystemBuffer;
- InputBufferLength = IrpStack->Parameters.DeviceIoControl.InputBufferLength;
- OutputBuffer = Irp->AssociatedIrp.SystemBuffer;
- OutputBufferLength = IrpStack->Parameters.DeviceIoControl.OutputBufferLength;
- Status = STATUS_SUCCESS;
- switch ( IoControlCode )
- {
- case 0x80002008:
- if ( InputBufferLength >= 8 )
- {
- PHYSICAL_ADDRESS PhysicalAddressToMap = *(PHYSICAL_ADDRESS*)InputBuffer;
- ULONG MappingSize = *(ULONG*)((char*)InputBuffer + 4);
-
- PVOID MappedAddress = MmMapIoSpace(PhysicalAddressToMap, MappingSize, MmNonCached);
-
- if (MappedAddress)
- *(PVOID*)OutputBuffer = MappedAddress;
- else
- Status = STATUS_INSUFFICIENT_RESOURCES;
- }
- else
- {
- Status = STATUS_INVALID_PARAMETER;
- }
- break;
- case 0x80002010: // 对应 KeBugCheckEx (蓝屏)
- // 漏洞: 无条件触发蓝屏
- KeBugCheckEx(0xDEADBEEF, 1, 2, 3, 4);
- break;
- ....
复制代码
任意物理内存映射 (权限提升)
IOCTL控制码: 0x80002008
当用户程序使用此IOCTL时,驱动程序会从输入缓冲区中直接读取一个64位的物理地址和一个32位的映射大小。驱动完全没有对这两个值进行任何验证,就将它们传递给了 MmMapIoSpace 函数。
攻击者可以构造一个请求,将任何物理内存区域(例如,包含进程令牌、内核代码或其他敏感数据结构)映射到内核空间。驱动随后会将映射后的内核虚拟地址返回给攻击者。这是一个严重的权限提升漏洞。
拒绝服务 (DoS)
IOCTL控制码: 0x80002010
当用户程序使用此IOCTL时,驱动程序会无条件地调用 KeBugCheckEx 函数。
任何能够打开 \\.\rwdrv 设备句柄的程序(就是低权限用户)都可以发送这个IOCTL请求,立即导致目标系统蓝屏死机(BSOD)。这是一个非常直接且稳定的拒绝服务漏洞。
漏洞利用:
权限提升: 攻击者发送 IOCTL 0x80002008,并提供一个精心挑选的物理地址。驱动程序将此物理内存映射后,攻击者便获得了读写该区域的能力,从而可以修改关键数据结构(如进程令牌)以将自身权限提升至SYSTEM。
拒绝服务: 攻击者发送 IOCTL 0x80002010,直接导致系统蓝屏崩溃。
驱动的漏洞源于对用户输入完全缺乏验证。盲目地相信从用户空间传递来的地址和大小参数,并直接在内核模式下使用。
|