You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

设置线程安全描述符阻止OpenThread调用未生效问题求助

问题分析与解决

你遇到的核心问题是无法通过修改安全描述符拦截自身线程的OpenThread调用,主要原因和修复点如下:

1. 错误使用伪句柄修改安全描述符

GetCurrentThread()返回的是当前线程的伪句柄,它仅能代表调用线程自身,并非真正的线程对象句柄,无法用于修改线程对象的安全属性。必须先将伪句柄复制为真实句柄,再传递给SetSecurityInfo:

HANDLE hRealThread;
DuplicateHandle(GetCurrentProcess(), GetCurrentThread(), GetCurrentProcess(), &hRealThread, 0, FALSE, DUPLICATE_SAME_ACCESS);
// 用真实句柄设置安全信息
SetSecurityInfo(hRealThread, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, pAcl, NULL);
CloseHandle(hRealThread); // 使用完毕关闭真实句柄

2. WinLocalSid未正确初始化

代码中WinLocalSid未完成初始化,导致拒绝ACE无法匹配到目标主体。需要正确获取对应组的SID,比如获取本地内置用户组的SID:

SID_IDENTIFIER_AUTHORITY auth = SECURITY_NT_AUTHORITY;
PSID pLocalSid;
if (!AllocateAndInitializeSid(&auth, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_USERS, 0, 0, 0, 0, 0, 0, &pLocalSid)) {
    // 处理初始化错误
}
// 将ACE的受信者指向该SID
ea.Trustee.ptstrName = (LPTSTR)pLocalSid;
// 使用完毕释放SID
FreeSid(pLocalSid);

3. ACL初始化逻辑冗余且存在风险

你手动初始化空ACL后调用SetEntriesInAcl,但SetEntriesInAcl会自动创建新的ACL并返回,之前的LocalAlloc和InitializeAcl属于冗余操作,且可能因内存大小不足导致问题。可以直接简化为:

PACL pAcl = NULL;
SetEntriesInAcl(1, &ea, NULL, &pAcl);
// 使用pAcl后记得调用LocalFree(pAcl);释放内存

4. 自身线程的权限豁免

即使修复上述问题,当前线程调用OpenThread打开自身时,系统可能因进程上下文匹配直接授予权限(内核级权限豁免逻辑)。若要验证拦截效果,建议创建另一个线程,在新线程中尝试打开当前线程,或用其他进程进行测试。


内容的提问来源于stack exchange,提问作者897uiaua8

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 11:55:17