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 漏洞分析