| Advisory NTIADV1004 | |
| KV 2010 Multiple Local Denial of Service Vulnerabilities | |
| Vendor | Jiangmin Co. Ltd. |
| Affected Software | KV 2010 < 13.0.10.111 |
| Affected Driver | Trojan and Registry Monitor - KRegEx.sys < 13.0.10.427 |
| Date Reported | 2010-02-04 |
| Release Date | 2010-05-04 |
| Status | Fixed - KV 2010 - 13.0.10.111 |
| Exploit | KRegEx_DoS.zip - Local Denial of Service Exploit (unavailable) |
| Disclosure Timeline |
2010-02-04 - Vulnerability reported to vendor 2010-02-05 - Vulnerability reported to vendor (once again) 2010-02-05 - Vendor confirmed reported vulnerability 2010-02-09 - Vendor released first incomplete update (KRegEx.sys - 13.0.10.208) 2010-02-10 - Vendor released second incomplete update (KRegEx.sys - 13.0.10.210) 2010-03-19 - Status update request 2010-04-18 - Status update request 2010-04-23 - Vendor released third incomplete update (KRegEx.sys - 13.0.10.412) 2010-04-28 - Vendor relased fixed version (KRegEx.sys - 13.0.10.427) 2010-05-04 - Full technical details released to general public |
| Description | |
|
Device driver KRegEx.sys shipped with KV 2010 doesn't properly validate certain parameters passed to hooked services (NtCreateKey, NtOpenKey, NtDeleteKey, NtSetValueKey, NtDeleteValueKey), which allows local users to cause a Denial of Service. Device drivers doesn't check if the kernel function ExAllocatePool returns valid address. If user supplied parameters passed to the IOCTL handler will be maliciously crafted the ExAllocatePool will return null instead of valid allocated pool pointer.
| |
| Fixed in KRegEx.sys - 13.0.10.208 | |
...
.text:00011D17 __ioctl_0x88008068:
.text:00011D17 push [ebp+InputBuffer]
.text:00011D1A call GetUpperCaseString
.text:00011D1F jmp __return_true
...
| |
| Fixed in KRegEx.sys - 13.0.10.427 | |
.text:0001149E ; int __stdcall HookNtOpenKey(int KeyHandle, int DesiredAccess, int ObjectAttributes)
.text:0001149E HookNtOpenKey proc near
.text:0001149E
.text:0001149E Object = dword ptr -4
.text:0001149E KeyHandle = dword ptr 8
.text:0001149E DesiredAccess = dword ptr 0Ch
.text:0001149E ObjectAttributes = dword ptr 10h
.text:0001149E
.text:0001149E mov edi, edi
.text:000114A0 push ebp
.text:000114A1 mov ebp, esp
.text:000114A3 push ecx
.text:000114A4 and [ebp+Object], 0
.text:000114A8 push esi
.text:000114A9 mov esi, [ebp+ObjectAttributes]
.text:000114AC test esi, esi
.text:000114AE jnz short __parameter_exists
.text:000114B0 push esi
.text:000114B1 push [ebp+DesiredAccess]
.text:000114B4 push [ebp+KeyHandle]
.text:000114B7 call RealNtOpenKey
.text:000114BD jmp short __exit
.text:000114BF
.text:000114BF __parameter_exists:
.text:000114BF push ebx
.text:000114C0 push edi
.text:000114C1 mov edi, offset Lookaside
.text:000114C6 push edi ; Lookaside
.text:000114C7 call ExAllocateFromNPagedLookasideList
.text:000114CC mov ebx, eax
.text:000114CE test ebx, ebx
.text:000114D0 jnz short __check
.text:000114D2 push esi
.text:000114D3 push [ebp+DesiredAccess]
.text:000114D6 push [ebp+KeyHandle]
.text:000114D9 call RealNtOpenKey
.text:000114DF jmp short __restore_regs
.text:000114E1
.text:000114E1 __check:
.text:000114E1 push ebx
.text:000114E2 push dword ptr [esi+8] ; SourceString
.text:000114E5 push dword ptr [esi+4] ; Handle
.text:000114E8 call ReferenceObject
...
| |