浅析 windows cve-2023-21768

漏洞简介

cve-2023-21768 是一个 Windows 11 22H2 系统中的本地权限提升漏洞,该漏洞源于AFD.sys这个模块。

漏洞分析

首先我们要有一个Windows 11 22H2的系统(运行在虚拟机),找到AFD.sys并复制出来,另外要将对应的后向差分补丁取出(这里名为afd1.sys)

将其回退,

1
py C:\xxx\delta.py -i .\afd.sys -o .\afd_pathed.sys .\r\afd1.sys

打上cve-2023-21768的前向补丁,

1
py C:\xxx\delta.py -i .\afd_pathed.sys -o .\afd_pathed2.sys "C:\xxx\kb5022303\xxx\f\afd.sys"

使用Bindiff查看哪些函数被修改,

查看补丁后的AfdNotifyRemoveIoCompletion函数,

不难发现,

1
2
if ( a1 )
ProbeForWrite(*(volatile void **)(a3 + 24), 4ui64, 4u);

此处意为,如果a1为true(即从用户态进入该驱动),判断*(a3 + 24)的值是否为合法的用户态地址。

也就是说,在未打补丁的情况下,如果我们将*(a3 + 24)的值构造为内核态地址,我们就可以对内核中的数据进行修改。

另外需要注意的是,我们只能将其修改为0x01,因为v20固定为1。

漏洞利用

这里我们直接分析https://github.com/chompie1337/Windows_LPE_AFD_CVE-2023-21768之中的代码。

该exp中利用漏洞修改IoRing在内核中数据结构的RegBuffers、RegBuffersCount,将它们改为0x01000000和0x01。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
0: kd> dt nt!_IORING_OBJECT
+0x000 Type : Int2B
+0x002 Size : Int2B
+0x008 UserInfo : _NT_IORING_INFO
+0x038 Section : Ptr64 Void
+0x040 SubmissionQueue : Ptr64 _NT_IORING_SUBMISSION_QUEUE
+0x048 CompletionQueueMdl : Ptr64 _MDL
+0x050 CompletionQueue : Ptr64 _NT_IORING_COMPLETION_QUEUE
+0x058 ViewSize : Uint8B
+0x060 InSubmit : Int4B
+0x068 CompletionLock : Uint8B
+0x070 SubmitCount : Uint8B
+0x078 CompletionCount : Uint8B
+0x080 CompletionWaitUntil : Uint8B
+0x088 CompletionEvent : _KEVENT
+0x0a0 SignalCompletionEvent : UChar
+0x0a8 CompletionUserEvent : Ptr64 _KEVENT
+0x0b0 RegBuffersCount : Uint4B
+0x0b8 RegBuffers : Ptr64 Ptr64 _IOP_MC_BUFFER_ENTRY
+0x0c0 RegFilesCount : Uint4B
+0x0c8 RegFiles : Ptr64 Ptr64 Void

这样IoRing在处理数据是会使用地址0x01000000的数据,而该地址位于用户态,可以直接编写用户态程序进行修改,然后利用IoRing相关的API进行利用。