## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-H1BANA-CVE-2023-21768
# CVE-2023-21768
## Windows Ancillary Function Driver for WinSock
CVE-2023-21768 рдХреЗ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЬреЛ Microsoft Security Response Center (MSRC) рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рднреЗрджреНрдпрддрд╛ `Ancillary Function Driver (AFD)` рдореЗрдВ рдореМрдЬреВрдж рд╣реИ, рдЬрд┐рд╕рдХрд╛ рд╕рд┐рд╕реНрдЯрдо рдлрд╝рд╛рдЗрд▓ рдирд╛рдо `afd.sys` рд╣реИред `AFD` рдореЙрдбреНрдпреВрд▓ `WinSock API` рдХрд╛ рдХрд░реНрдиреЗрд▓ рдПрдВрдЯреНрд░реА рдкреЙрдЗрдВрдЯ рд╣реИред рдЗрд╕ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдореЗрдВ рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рдВрдбреЛрдЬ 11 рдкрд░ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рд╡реГрджреНрдзрд┐ (LPE) рдХреЗ рд▓рд┐рдП рдХрд░реВрдВрдЧрд╛ред
## Patch Diff and Root Cause Analysis
рджреЛ рд╕рдВрд╕реНрдХрд░рдг `afd.sys` рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ `Winbindex` рд╕реЗ, рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдкреИрдЪ рд╕реЗ рдкрд╣рд▓реЗ рдХрд╛ рдирд╡реАрдирддрдо, рдФрд░ рдПрдХ рдкреИрдЪ рдХреЗ рдмрд╛рдж рдХрд╛ рд╕рдВрд╕реНрдХрд░рдгред рдлрд┐рд░ рдЗрди рджреЛ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `Bindiff` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред 
рджреЛ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рд╕рд╛рдорд╛рдиреНрдп рддреБрд▓рдирд╛ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЕрдВрддрд░ рд╣реИ, рд╡рд╣ рд╣реИ `AfdNotifyRemoveIoCompletion`ред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рджреЛ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреЛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рджреЗрдЦреЗрдВред 
рджреЛрдиреЛрдВ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдмреАрдЪ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИред рдкреЛрд╕реНрдЯ-рдкреИрдЪ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдФрд░ `ProbeForWrite` рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрд╕реЗрдВрдмрд▓реА рдирд┐рд░реНрджреЗрд╢ рдЬреЛрдбрд╝реЗ рдЧрдП рд╣реИрдВред Microsoft рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдкрддрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпреВрдЬрд╝рд░-рдореЛрдб рдХрд╛ рд╣реИ, рдЙрд╕рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ, рдФрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрд░реЗрдЦрд┐рдд (aligned) рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЗрд╕ рдХреЛрдб рдХрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг:
* pre-patch `afd.sys version 10.0.22621.608` 
-post-patch `afd.sys version 10.0.22621.1105` 
рджреЛрдиреЛрдВ `r15_1` рдХреЗ рдорд╛рди рдХреА рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╣реИрдВ, рдпрджрд┐ рдпрд╣ `0` рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ рддреЛ `var_304` рдХреЗ рдорд╛рди рдХреЛ `struct_1` рдХреЗ рдПрдХ рдлрд╝реАрд▓реНрдб рдкрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреЙрдЗрдВрдЯрд░ рдкрд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдпрджрд┐ рдпрд╣ `0` рдирд╣реАрдВ рд╣реИ, рддреЛ `ProbeForWrite` рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рддрд╛рдХрд┐ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рдкреЙрдЗрдВрдЯрд░ рдПрдХ рд╡реИрдз рдкрддреЗ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИред `pre-patch` рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА `var_304` рдХрд╛ рдорд╛рди рдкреЙрдЗрдВрдЯрд░ рдкрд░ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдЬрд╛рдБрдЪ рдЧрд╛рдпрдм рдереАред рдЗрд╕ рдкреИрдЪ рд╕реЗ, рд╣рдо рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо `arg3_1->field_18` рдХреЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдорд╛рди рдХреЗ рд╕рд╛рде рдЗрд╕ рдХреЛрдб рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рд╣рдо `field_18` рдкрд░ рдПрдХ рдХрд░реНрдиреЗрд▓ рдкрддрд╛ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо `var_304` рдХреЛ рдХрд░реНрдиреЗрд▓ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдХреЗ рдкрддреЗ рдкрд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
=> bug type: **arbitrary kernel Write-Where**
рдЕрдм рдмрдЧ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдЦреЛрдЬрдирд╛ рд╣реЛрдЧрд╛ред рдлрд╝рдВрдХреНрд╢рди `AfdNotifyRemoveIoCompletion` рдХреЛ рд╕реАрдзреЗ `AfdNotifySock` рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред 
рдЗрд╕реА рддрд░рд╣, `AfdNotifySock` рдХрд╛ рдХреНрд░реЙрд╕ рд░реЗрдлрд░реЗрдВрд╕ рдвреВрдВрдврдиреЗ рдкрд░ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╕реАрдзреЗ рдХреЙрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрддрд╛ `.rdata` рдореЗрдВ рдПрдХ рдкрддреЗ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред 
рдпрд╣ рдкрддрд╛ `AfdIrpCallDispatch` рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ рд╕реНрдерд┐рдд рд╣реИред 
рдмрдЧ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ `DeviceIoControl` рдХреЛ `IOCTL_AFD_NOTIFY_SOCK` рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░реВрдВрдЧрд╛ рдФрд░ `AfdNotifySock` рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
root@kitploit:~
BOOL DeviceIoControl(
[in] HANDLE hDevice,
[in] DWORD dwIoControlCode,
[in, optional] LPVOID lpInBuffer,
[in] DWORD nInBufferSize,
[out, optional] LPVOID lpOutBuffer,
[in] DWORD nOutBufferSize,
[out, optional] LPDWORD lpBytesReturned,
[in, out, optional] LPOVERLAPPED lpOverlapped
);
### reverse and debug
рдкреНрд░рддреНрдпреЗрдХ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рд▓рд┐рдП, рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдПрдХ `DRIVER_OBJECT` рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
root@kitploit:~
typedef struct _DRIVER_OBJECT {
CSHORT Type;
CSHORT Size;
PDEVICE_OBJECT DeviceObject;
ULONG Flags;
PVOID DriverStart;
ULONG DriverSize;
PVOID DriverSection;
PDRIVER_EXTENSION DriverExtension;
UNICODE_STRING DriverName;
PUNICODE_STRING HardwareDatabase;
PFAST_IO_DISPATCH FastIoDispatch;
PDRIVER_INITIALIZE DriverInit;
PDRIVER_STARTIO DriverStartIo;
PDRIVER_UNLOAD DriverUnload;
PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
} DRIVER_OBJECT, *PDRIVER_OBJECT;
рдЕрдВрддрд┐рдо рдШрдЯрдХ `MajorFunction` рдПрдХ рд╕рд░рдгреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рдбрд┐рд╕реНрдкреИрдЪ рдлрд╝рдВрдХреНрд╢рди рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд░реНрдиреЗрд▓ рдФрд░ рдпреВрдЬрд╝рд░рдореЛрдб рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░ рдХреЛ рд╕рдВрднрд╛рд▓рддреЗ рд╣реИрдВред `DeviceIoControl` рдХреЙрд▓ рдХреЗ рдЕрдиреБрд░реВрдк рдбрд┐рд╕реНрдкреИрдЪ рдлрд╝рдВрдХреНрд╢рди `MajorFunction[IRP_MJ_DEVICE_CONTROL]` рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддрд╛ рд╣реИред
root@kitploit:~
#define IRP_MJ_DEVICE_CONTROL 0x0e
afd.sys рдХреЗ `DriverEntry` рдлрд╝рдВрдХреНрд╢рди рд╕реЗ, рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдбреНрд░рд╛рдЗрд╡рд░ рдиреЗ рдбрд┐рд╡рд╛рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ "\Device\Afd" рдмрдирд╛рдпрд╛ рд╣реИ: 
рдпрд╣ `MajorFunction[IRP_MJ_DEVICE_CONTROL]` = `AfdDispatchDeviceControl` рдЕрд╕рд╛рдЗрди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬрдм рдХрд░реНрдиреЗрд▓ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `DeviceIoControl` рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред 
`AFD` рдореЗрдВ рджреЛ рдбрд┐рд╕реНрдкреИрдЪ рдЯреЗрдмрд▓ рд╣реИрдВ: `AfdIrpCallDispatch` рдФрд░ `AfdImmediateCallDispatch`ред  
рдпрд╣ рджреЗрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ `AfdDispatchDeviceIoControl` IoControlCode рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдмрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ IoControlCode рджреНрд╡рд╛рд░рд╛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП AfdIoctlTable рд╕реЗ рд╕рдмрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЕрдиреБрд░реВрдк рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред 
`AfdImmediateCallDispatch` рдХреЗ рдкреНрд░рд╛рд░рдВрдн рдкрддреЗ рдФрд░ `AfdNotifySock` рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрддреЗ рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рд╕реЗ, рд╣рдо рдЗрдВрдбреЗрдХреНрд╕ 73 рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдирд┐рдпрдВрддреНрд░рдг рдХреЛрдб `0x12127` рд╣реИред 
root@kitploit:~
int main() {
WSADATA WSAData;
SOCKET s;
SOCKADDR_IN sa;
int ierr;
WSAStartup(0x2, &WSAData);
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
memset(&sa, 0, sizeof(sa));
sa.sin_port = htons(135);
sa.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
sa.sin_family = AF_INET;
ierr = connect(s, (const struct sockaddr*)&sa, sizeof(sa));
char outBuf[100];
DWORD bytesRet;
DWORD inbuf1[100];
memset(inbuf1, 0, sizeof(inbuf1));
DeviceIoControl((HANDLE)s, 0x12127, (LPVOID)inbuf1, 0x30, outBuf, 0, &bytesRet, NULL);
return 0;
}
it works!

рдЬреИрд╕рд╛ рдХрд┐ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рднреЗрджреНрдпрддрд╛ рддрдм рд╣реЛрддреА рд╣реИ рдЬрдм рд╣рдо рдПрдХ struct рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдЕрдорд╛рдиреНрдп (unvalidated) рдкреЙрдЗрдВрдЯрд░ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ struct рд╕реАрдзреЗ usermode рд╕реЗ `DeviceIoControl` рдХреЗ `lpInBuffer` рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд┐рд░ рдЗрд╕реЗ рдЪреМрдереЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ `AfdNotifySock` рдореЗрдВ рдФрд░ рддреАрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ `AfdNotifyRemoveIoCompletion` рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  
рдЪреВрдВрдХрд┐ struct рдореЗрдВ рдХреНрдпрд╛ рд╣реИ рдпрд╣ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ IDA рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ struct рдмрдирд╛рдиреЗ рджрд┐рдпрд╛ред рдЕрдм рдЗрд╕ struct рдореЗрдВ рдбреЗрдЯрд╛ рдкрд╛рд╕ рдХрд░рдиреЗ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдБрдЪреЛрдВ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдЦреЛрдЬрдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдмрдЧ рдХреЛрдб рддрдХ рдкрд╣реБрдВрдЪрд╛ рдЬрд╛ рд╕рдХреЗред `AfdNotifySock` рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, struct рдХрд╛ рдЖрдХрд╛рд░ 0x30 рдмрд╛рдЗрдЯреНрд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╡реЗ рдорд╛рди рдЬреЛ рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП:

рдПрдХ рдФрд░ рдмрд╛рдд, рдбреАрдмрдЧ рдХрд░рддреЗ рд╕рдордп рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдпрд╣ рдкрд┐рдЫрд▓реЗ UserBuffer рдЪреЗрдХ рдкрд░ рд╡рд┐рдлрд▓ рд╣реЛ рд░рд╣рд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП `DeviceIoControl` рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдЗрд╕ рдорд╛рди рдХреЛ NULL рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдКрдкрд░ рджрд┐рдП рдЧрдП рдорд╛рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдЪреЗрдХ2 рдХреЛ рдкрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реБрдЖред
 
рдЕрдЧрд▓реА рдЬрд╛рдБрдЪ рдЬрд┐рд╕реЗ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдирд╛ рд╣реИ:

`ObReferenceObjectByHandle` рдХреЛ рдЗрд╕ рдЪреЗрдХ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `STATUS_SUCCESS` рд▓реМрдЯрд╛рдирд╛ рд╣реЛрдЧрд╛ред рдЕрд░реНрдерд╛рдд, рдореБрдЭреЗ рдПрдХ рд╡реИрдз рд╣реИрдВрдбрд▓ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдореИрдВрдиреЗ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд▓реЗрдХрд┐рди `IoCompletionObjectType` рдмрдирд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рдорд┐рд▓реАред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛: https://securityintelligence.com/posts/patch-tuesday-exploit-wednesday-pwning-windows-ancillary-function-driver-winsock/. `NtCreateIoCompletion` рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ `IoCompletionObjectType` рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕рдХрд╛ рд╣реИрдВрдбрд▓ `ObReferenceObjectByHandle` рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВред
рдЗрд╕ рдЬрд╛рдБрдЪ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдкреНрд░рд╡рд╛рд╣ рдПрдХ рд▓реВрдк рдореЗрдВ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд▓реВрдк рдореЗрдВ рдРрд╕реА рдХреЛрдИ рдЬрдЧрд╣ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╡рд┐рдлрд▓рддрд╛ рдкреНрд░рд╡рд╛рд╣ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рдП, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдмрд╕ `dword20` рдкрд░ рдорд╛рди рдХреЛ 0x1 рд╕реЗрдЯ рдХрд░ рджрд┐рдпрд╛ рддрд╛рдХрд┐ рд▓реВрдк рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рд╕рдХреВрдВред

рд▓реВрдк рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рдмрд╛рдж, рдкреНрд░реЛрдЧреНрд░рд╛рдо `AfdNotifyRemoveIoCompletion` рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред `AfdNotifyRemoveIoCompletion` рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЬрд╛рд░реА рд░рдЦреЗрдВ:

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо struct рдХреЗ рдПрдХ рдЕрдиреНрдп рдлрд╝реАрд▓реНрдб рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдлрд┐рд░ рдЗрд╕реЗ 0x20 рд╕реЗ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ struct рдХреЗ рдПрдХ рдЕрдиреНрдп рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде `ProbeForWrite` рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдХреЗрд╡рд▓ рдПрдХ user-mode рдореЗрдореЛрд░реА рдкрддреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реЛ рдФрд░ dwLen = 1 рд╣реЛред рдмрдЧ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдВрддрд┐рдо рдЬрд╛рдБрдЪ рдпрд╣ рд╣реИ рдХрд┐ `IoRemoveCompletion` рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдорд╛рди `STATUS_SUCCESS` рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЦреЛрдЬрдиреЗ рдкрд░ рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ `NtRemoveIoCompletion` рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░ `IoRemoveCompletion` рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рдЕрдиреБрд╕рд╛рд░, `NtRemoveIoCompletion` рдлрд╝рдВрдХреНрд╢рди рдПрдХ "рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЙрд▓" (waiting call) рд╣реИ рдФрд░ рдпрд╣ рддрдм рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдХрд┐рд╕реА рдирд┐рд░реНрджрд┐рд╖реНрдЯ `Io Completion Object` рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдкреВрд░реНрдг рд░рд┐рдХреЙрд░реНрдб рд╣реЛрддрд╛ рд╣реИред рд░рд┐рдХреЙрд░реНрдб рддрдм рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм I/O рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреВрд░реА рд╣реЛрддреА рд╣реИред
root@kitploit:~
NtRemoveIoCompletion(
IN HANDLE IoCompletionHandle,
OUT PULONG CompletionKey,
OUT PULONG CompletionValue,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN PLARGE_INTEGER Timeout OPTIONAL );
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ `Timeout` рд╣реИ, рдЬрдм рдЯрд╛рдЗрдордЖрдЙрдЯ рдорд╛рди рдкрд╣реБрдВрдЪ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдлрд╝рдВрдХреНрд╢рди рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреЗрд╡рд▓ рдЯрд╛рдЗрдордЖрдЙрдЯ = 0 рд╕реЗрдЯ рдХрд░рдирд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╡рд╛рдкрд╕ рд▓реМрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдпрд╣ рдЯрд╛рдЗрдордЖрдЙрдЯ рддреНрд░реБрдЯрд┐ рдХреЛрдб рд▓реМрдЯрд╛рдПрдЧрд╛ред рд╣рдо `NtSetIoCompletion` рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ `IoCompletionObjectType` рдореЗрдВ рд▓рдВрдмрд┐рдд IO рдХреА рдЧрдгрдирд╛ рдХреЛ 1 рд╕реЗ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЯрд╛рдЗрдордЖрдЙрдЯ рд╕реЗ рдкрд╣рд▓реЗ `NtRemoveIoCompletion` рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХрдИ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдорд╛рди рд╣рдореЗрд╢рд╛ 0x1 рд╣реЛрддрд╛ рд╣реИред
## exploit - LPE with IORING
рдХрд░реНрдиреЗрд▓-рдореЛрдб рдкрддреЗ рдкрд░ рдорд╛рди 0x1 рд▓рд┐рдЦрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде, рд╣рдо I/O рд░рд┐рдВрдЧ (Microsoft рджреНрд╡рд╛рд░рд╛ рдЬрд╛рд░реА рдПрдХ рдирдпрд╛ I/O рддрдВрддреНрд░) рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдХрд░ рдЗрд╕ рдмрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдордирдорд╛рдиреЗ рдкрддреЗ рдХреЛ рдкрдврд╝рдиреЗ/рд▓рд┐рдЦрдиреЗ рдХреА рдкреВрд░реНрдг рдХреНрд╖рдорддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред `Yarden Shafir` рдиреЗ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд▓рд┐рдЦрд╛ рд╣реИ, рдЖрдк рдЗрд╕реЗ рдпрд╣рд╛рдБ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдХреНрд░рд┐рдпрд╛ рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд╡рд╣ рд╣реИ рдЕрдкрдиреЗ рднрд╡рд┐рд╖реНрдп рдХреЗ I/O рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рд╕рднреА рдмрдлрд╝рд░реНрд╕ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛, рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ I/O рд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ред рдкреВрд░реНрд╡-рдкрдВрдЬреАрдХреГрдд рдмрдлрд╝рд░реНрд╕ I/O рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ:
root@kitploit:~
typedef struct _IORING_OBJECT
{
USHORT Type;
USHORT Size;
NT_IORING_INFO UserInfo;
PVOID Section;
PNT_IORING_SUBMISSION_QUEUE SubmissionQueue;
PMDL CompletionQueueMdl;
PNT_IORING_COMPLETION_QUEUE CompletionQueue;
ULONG64 ViewSize;
ULONG InSubmit;
ULONG64 CompletionLock;
ULONG64 SubmitCount;
ULONG64 CompletionCount;
ULONG64 CompletionWaitUntil;
KEVENT CompletionEvent;
UCHAR SignalCompletionEvent;
PKEVENT CompletionUserEvent;
ULONG RegBuffersCount;
PVOID RegBuffers;
ULONG RegFilesCount;
PVOID* RegFiles;
} IORING_OBJECT, *PIORING_OBJECT;
рдпрджрд┐ рдХреЛрдИ рд╕реБрд░рдХреНрд╖рд╛ рднреЗрджреНрдпрддрд╛, рдЬреИрд╕реЗ рдХрд┐ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд, рдЖрдкрдХреЛ `RegBuffersCount` рдФрд░ `RegBuffers` рдлрд╝реАрд▓реНрдб рдХреЛ рдЕрдкрдбреЗрдЯ/рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рддреЛ рдорд╛рдирдХ I/O рд░рд┐рдВрдЧ API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд░реНрдиреЗрд▓ рдореЗрдореЛрд░реА рдХреЛ рдкрдврд╝рд╛ рдФрд░ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, `NtQuerySystemInformation` рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `Medium IL` рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред `Low IL` рд╕реЗ LPE рдХреЗ рд▓рд┐рдП, рдХрд░реНрдиреЗрд▓ рдкрддреЗ рдХреЛ рд▓реАрдХ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдЬрдм IoRing->RegBuffers рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдирд┐рдпрдВрддреНрд░рд┐рдд рдлрд╝реЗрдХBuffer рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╕рд╛рдорд╛рдиреНрдп I/O рд░рд┐рдВрдЧ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рднреА рдкрддреЗ рдХреЛ рдкрдврд╝ рдФрд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд╕ рдлрд╝реЗрдХ рдореЗрдВ рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдЬрд┐рд╕реЗ рдмрдлрд╝рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ:
* Read operation + kernel address: рдХрд░реНрдиреЗрд▓ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЪреБрдиреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реНрдиреЗрд▓ рдкрддреЗ рдкрд░ "рдкрдврд╝реЗрдЧрд╛", рдЬрд┐рд╕рд╕реЗ рдордирдорд╛рдирд╛ рд▓реЗрдЦрди рд╣реЛрдЧрд╛ред
* Write operation + kernel address: рдХрд░реНрдиреЗрд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкрддреЗ рдкрд░ рдбреЗрдЯрд╛ рдХреЛ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЪреБрдиреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ "рд▓рд┐рдЦреЗрдЧрд╛", рдЬрд┐рд╕рд╕реЗ рдордирдорд╛рдирд╛ рдкрдврд╝рдирд╛ рд╣реЛрдЧрд╛ред
рдЕрдзрд┐рдХ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк `Yarden Shafir` рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдКрдкрд░ рджрд┐рдП рдЧрдП рд▓рд┐рдВрдХ рдкрд░ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
### issue
рдКрдкрд░ рджрд┐рдП рдЧрдП POC рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ IO Ring рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, `DeviceIOControl` рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдВрдбреЛрдЬ рдХреНрд░реИрд╢ рд╣реЛ рдЧрдпрд╛ /_ \ рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╕реАрдзреЗ Ntfunction рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдЕрдкрдирд╛рдпрд╛ (╦Шя╜е_я╜е╦Ш)
## Affect range
* рд╡рд┐рдВрдбреЛрдЬ 11 21H1/22H2 OS build 22000.1455/22621.1105 рд╕реЗ рдкрд╣рд▓реЗ
* рд╡рд┐рдВрдбреЛрдЬ рд╕рд░реНрд╡рд░ 2022 OS build 20348.1487 рд╕реЗ рдкрд╣рд▓реЗ
## The patch
* рдкреИрдЪ рдореЗрдВ `ProbeForWrite` рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛
* рдкреИрдЪ рд╕рдВрд╕реНрдХрд░рдг:
* рд╡рд┐рдВрдбреЛрдЬ 11 21H1: KB5022287 (OS Build 22000.1455)
* рд╡рд┐рдВрдбреЛрдЬ 11 22H2: KB5022303 (OS Build 22621.1105)
* рд╡рд┐рдВрдбреЛрдЬ рд╕рд░реНрд╡рд░ 2022: KB5022291 (OS Build 20348.1487)
## POC