CVE-2024-0107 NVIDIA GPU 编译器驱动 OOB read 漏洞分析

渗透技巧 1个月前 admin
108 0 0
2024年7月23日
CVE 编号

CVE-2024-0107

摘要

NVIDIA GPU 编译器驱动 551.61,31.0.15.5161 的着色器功能存在越界读取漏洞。一个特别制作的可执行文件/着色器文件可能导致越界读取。攻击者可以提供特别制作的着色器文件来触发此漏洞。

确认存在漏洞的版本

以下版本已被 Talos 测试或验证为存在漏洞,或由供应商确认存在漏洞。

NVIDIA GPU 编译器驱动 551.61,31.0.15.5161

产品网址

GPU 编译器驱动 – https://nvidia.com

详细信息

此漏洞可能会被运行虚拟化环境的客机(如 VMware、qemu、VirtualBox 等)触发,以执行客机到主机的逃逸,就像之前演示的那样(TALOS-2018-0533,TALOS-2018-0568 等)。理论上,此漏洞也可能通过网络浏览器触发(使用 webGL 和 webassembly)。我们能够通过使用 RemoteFX 功能的 HYPER-V 客机触发此漏洞,导致在 HYPER-V 主机上执行漏洞代码(在 rdvgm.exe 进程内)。虽然 RemoteFX 最近被 Microsoft 弃用,但一些旧机器可能仍在使用此软件。

此漏洞可通过提供一个格式错误的着色器来触发。这导致 NVIDIA 驱动中的越界内存读取问题。

为了触发此漏洞,我们修改并损坏了与 “SINCOS” 指令对应的 shaderbyte 代码

(按组件的 sin(theta) 和 cos(theta),theta 以弧度表示。sincos[_sat] destSIN[.mask], destCOS[.mask], [-]src0[_abs][.swizzle])。

这导致了越界内存读取情况:

	00007FF93F6C3560 | 48:8B81 00020000         | mov rax,qword ptr ds:[rcx+200]          |
00007FF93F6C3567 | 48:63D2 | movsxd rdx,edx |
00007FF93F6C356A | 8B0490 | mov eax,dword ptr ds:[rax+rdx*4] | * (RAX pts to

有效内存区域,RDX 从堆内存中获取) 00007FF93F6C356D | C3 | ret |

	引起任意读取的函数在此执行:

00007FF93F92315A | 48:8B4D 50 | mov rcx,qword ptr ss:[rbp+50] |
00007FF93F92315E | 41:8B50 6C | mov edx,dword ptr ds:[r8+6C] | * edx = taken

从堆内存中获取(超出有效区域)

	00007FF93F923162 | 48:8B09                  | mov rcx,qword ptr ds:[rcx]              |
00007FF93F923165 | 81E2 FFFFFF00 | and edx,FFFFFF |
00007FF93F92316B | 83F8 08 | cmp eax,8 |
00007FF93F92316E | 75 07 | jne nvgpucomp64.7FF93F923177 |
00007FF93F923170 | E8 AB05DAFF | call nvgpucomp64.7FF93F6C3720 |
00007FF93F923175 | EB 07 | jmp nvgpucomp64.7FF93F92317E |
00007FF93F923177 | E8 E403DAFF | call nvgpucomp64.7FF93F6C3560 | * caller

源内存地址是从 shader bytecode 间接计算得出的(RDX 从堆内存中获取 – 超出边界,这是由修改的 shaderbyte 代码引起的)。攻击者可以修改 shaderbyte 代码以强制 nvgpucomp64.dll 读取任意内存区域。

崩溃信息

	0:013> !analyze -v
*******************************************************************************
* *
* Exception Analysis *
* *
*******************************************************************************


KEY_VALUES_STRING: 1

Key : AV.Fault
Value: Read

Key : Analysis.CPU.mSec
Value: 921

Key : Analysis.Elapsed.mSec
Value: 1330

Key : Analysis.IO.Other.Mb
Value: 1

Key : Analysis.IO.Read.Mb
Value: 0

Key : Analysis.IO.Write.Mb
Value: 3

Key : Analysis.Init.CPU.mSec
Value: 405

Key : Analysis.Init.Elapsed.mSec
Value: 16674

Key : Analysis.Memory.CommitPeak.Mb
Value: 75

Key : Failure.Bucket
Value: INVALID_POINTER_READ_c0000005_nvgpucomp64.dll!Unknown

Key : Failure.Hash
Value: {4d039e7f-a53a-c8fd-f064-3b97e816c031}

Key : Timeline.OS.Boot.DeltaSec
Value: 4240213

Key : Timeline.Process.Start.DeltaSec
Value: 16

Key : WER.OS.Branch
Value: vb_release

Key : WER.OS.Version
Value: 10.0.19041.1


NTGLOBALFLAG: 70

APPLICATION_VERIFIER_FLAGS: 0

EXCEPTION_RECORD: (.exr -1)
ExceptionAddress: 00007ff93f6c356a (nvgpucomp64!destroyFinalizer+0x0000000000ab389a)
ExceptionCode: c0000005 (Access violation)
ExceptionFlags: 00000000
NumberParameters: 2
Parameter[0]: 0000000000000000
Parameter[1]: 0000017b3e9f7c14
Attempt to read from address 0000017b3e9f7c14

FAULTING_THREAD: 0000506c

PROCESS_NAME: POC_EXEC11.exe

READ_ADDRESS: 0000017b3e9f7c14

ERROR_CODE: (NTSTATUS) 0xc0000005 - Instrukcja w 0x%p odwo a a si do pami ci pod adresem 0x%p. Pami

nie mo e by %s.

	EXCEPTION_CODE_STR:  c0000005

EXCEPTION_PARAMETER1: 0000000000000000

EXCEPTION_PARAMETER2: 0000017b3e9f7c14

STACK_TEXT:
00000008`9e74e418 00007ff9`3f92317c : 00000000`00000000 0000017b`3be1b3c8 0000017b`3be8ff18

0000017b`3be1bc78 : nvgpucomp64!destroyFinalizer+0xab389a 00000008`9e74e420 00007ff9`3f91896d : 00000008`9e74e898 00000008`9e74e898 0000017b`3be7cb50

00000008`9e74e750 : nvgpucomp64!destroyFinalizer+0xd134ac 00000008`9e74e570 00007ff9`3f91b055 : 0000017b`3be1b3c8 00000000`0000000a 00000008`9e74e6c0

00000000`00000007 : nvgpucomp64!destroyFinalizer+0xd08c9d 00000008`9e74e5c0 00007ff9`3f92170a : 0000017b`3be1b3c8 0000017b`3be1b3c8 0000017b`3be3a068

0000017b`3be1ba00 : nvgpucomp64!destroyFinalizer+0xd0b385 00000008`9e74e870 00007ff9`3f739be0 : 00000000`000003e7 00000000`000003e7 00007ff9`3ffd71e0

00000000`00000017 : nvgpucomp64!destroyFinalizer+0xd11a3a 00000008`9e74ec10 00007ff9`3f739cc7 : 00007ff9`4032d520 00000008`9e74eda0 00000008`9e74ee10

00007ff9`3ffd7e00 : nvgpucomp64!destroyFinalizer+0xb29f10 00000008`9e74eca0 00007ff9`3f59c859 : 0000017b`3be0fb80 0000017b`3be1fc70 0000017b`3be1b3c8

00000000`0000ff98 : nvgpucomp64!destroyFinalizer+0xb29ff7 00000008`9e74edd0 00007ff9`3f59c925 : 0000017b`0008001f 0000017b`3be1b3c8 0000017b`3be1b3c8

00000008`9e74f060 : nvgpucomp64!destroyFinalizer+0x98cb89 00000008`9e74eeb0 00007ff9`3f028a20 : 00000008`9e74f058 00000008`9e74f058 0000017b`34f08500

0000017b`34f08500 : nvgpucomp64!destroyFinalizer+0x98cc55 00000008`9e74eee0 00007ff9`3f029465 : 0000017b`3be0fe00 00000008`9e74f040 0000017b`3be0fc80

00000000`00000000 : nvgpucomp64!destroyFinalizer+0x418d50 00000008`9e74ef40 00007ff9`3f015838 : 4cf5ad43`2745937f 00000008`9e74f3c0 0000017b`34f083d0

00000000`00000000 : nvgpucomp64!destroyFinalizer+0x419795 00000008`9e74f260 00007ff9`3f0159d0 : 00000000`00000000 00000000`00000000 00000000`00000000

0000017b`34efbc10 : nvgpucomp64!destroyFinalizer+0x405b68 00000008`9e74f2a0 00007ff9`28969311 : 884c0fa0`5ed4aea0 0000017b`34f07b48 00000000`00000000

00007ff9`297a1e02 : nvgpucomp64!destroyFinalizer+0x405d00 00000008`9e74f2d0 00007ff9`29174b70 : 00000000`00000000 884c0fa0`5ed4aea0 00000000`00000000

f2dba825`ac2d180b : nvwgf2umx+0x89311 00000008`9e74f340 00007ff9`28ce6045 : 00000000`00000000 00000000`00000000 00000008`9e74f410

00000008`9e74f479 : nvwgf2umx!OpenAdapter12+0x149f70 00000008`9e74f3c0 00007ff9`28bf9717 : 0000017b`32d36080 0000017b`34f077c0 0000017b`34f077c0

00007ff9`28bf73ed : nvwgf2umx!NVAPI_Thunk+0x1393f5 00000008`9e74f4c0 00007ff9`28b9d209 : 0000017b`32d36080 00000000`00000000 0000017b`34f077c0

00000000`00000000 : nvwgf2umx!NVAPI_Thunk+0x4cac7 00000008`9e74f560 00007ff9`2899b460 : 0000017b`34e5a950 00000000`00000000 00000008`9e74f690

00000000`00000000 : nvwgf2umx!NVENCODEAPI_Thunk+0x13cbd9 00000008`9e74f590 00007ff9`291d2e93 : 00000000`00000000 0000017b`34e4a240 0000017b`34f7d040

00000000`00000000 : nvwgf2umx!NVAPI_DirectMethods+0x29bc0 00000008`9e74f870 00007ff9`291d2bb8 : 00000000`00000000 0000017b`34f7d040 00000000`00000000

0000017b`34faab10 : nvwgf2umx!NVDEV_Thunk+0x3afd3 00000008`9e74f980 00007ff9`29200983 : 00000000`00000000 00000000`00000000 0000017b`34e4c8e0

00000000`00000000 : nvwgf2umx!NVDEV_Thunk+0x3acf8 00000008`9e74fa30 00007ff9`2920087f : 00000000`00000000 0000017b`34e33750 00000000`00000000

00000000`00000000 : nvwgf2umx!NVDEV_Thunk+0x68ac3 00000008`9e74fa80 00007ff9`297a8d8e : 0000017b`34e33750 00000000`00000000 00000000`00000000

00000000`00000000 : nvwgf2umx!NVDEV_Thunk+0x689bf 00000008`9e74fab0 00007ff9`ad7d7344 : 00000000`00000000 00000000`00000000 00000000`00000000

00000000`00000000 : nvwgf2umx!NVDEV_Thunk+0x610ece 00000008`9e74fae0 00007ff9`af7a26b1 : 00000000`00000000 00000000`00000000 00000000`00000000

00000000`00000000 : KERNEL32!BaseThreadInitThunk+0x14 00000008`9e74fb10 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000

00000000`00000000 : ntdll!RtlUserThreadStart+0x21

SYMBOL_NAME: nvgpucomp64+ab389a

MODULE_NAME: nvgpucomp64

IMAGE_NAME: nvgpucomp64.dll

STACK_COMMAND: ~13s ; .cxr ; kb

FAILURE_BUCKET_ID: INVALID_POINTER_READ_c0000005_nvgpucomp64.dll!Unknown

BUCKET_ID_MODPRIVATE: 1

OS_VERSION: 10.0.19041.1

BUILDLAB_STR: vb_release

OSPLATFORM_TYPE: x64

OSNAME: Windows 10

IMAGE_VERSION: 31.0.15.5161

FAILURE_ID_HASH: {4d039e7f-a53a-c8fd-f064-3b97e816c031}

Followup: MachineOwner
---------
时间线

2024-03-15 – 供应商披露
2024-07-09 – 供应商补丁发布
2024-07-23 – 公开发布


原文始发于微信公众号(3072):CVE-2024-0107 NVIDIA GPU 编译器驱动 OOB read 漏洞分析

版权声明:admin 发表于 2024年8月6日 上午10:09。
转载请注明:CVE-2024-0107 NVIDIA GPU 编译器驱动 OOB read 漏洞分析 | CTF导航

相关文章