Win32 SeCreateClientSecurityFromSubjectContext未复制调用方PrimaryGroup问题
设备驱动模拟调用方时主组未被捕获的问题
问题描述
我尝试在设备驱动中通过捕获并存储安全上下文来模拟调用方,但主组未被捕获(即TOKEN_PRIMARY_GROUP始终返回默认组,而非进程中设置的主组)。相关代码如下:
SECURITY_QUALITY_OF_SERVICE sec_qos; SeCaptureSubjectContext(&sec_ctx); sec_qos.ContextTrackingMode = SECURITY_DYNAMIC_TRACKING; sec_qos.ImpersonationLevel = SecurityImpersonation; sec_qos.Length = sizeof(SECURITY_QUALITY_OF_SERVICE); sec_qos.EffectiveOnly = 0; status = SeCreateClientSecurityFromSubjectContext(&sec_ctx, &sec_qos, 1, &new_sec_ctx);
请问这是Bug还是我操作有误?
问题分析与解决
这不是Bug,是你调用SeCreateClientSecurityFromSubjectContext时的参数设置错误。
- 你传入的第三个参数
CreateFullToken为1(TRUE),此时函数会创建仅包含有效权限和默认主组的简化令牌,不会保留原调用方的主组信息,这就是问题根源。 - 要完整保留原调用方的主组属性,需将该参数改为
0(FALSE),函数会生成包含完整身份属性的模拟安全上下文。
修改后的代码:
SECURITY_QUALITY_OF_SERVICE sec_qos; SeCaptureSubjectContext(&sec_ctx); sec_qos.ContextTrackingMode = SECURITY_DYNAMIC_TRACKING; sec_qos.ImpersonationLevel = SecurityImpersonation; sec_qos.Length = sizeof(SECURITY_QUALITY_OF_SERVICE); sec_qos.EffectiveOnly = 0; // 将CreateFullToken参数设为0以保留完整身份属性 status = SeCreateClientSecurityFromSubjectContext(&sec_ctx, &sec_qos, 0, &new_sec_ctx);
补充说明:
- 当
CreateFullToken为TRUE时,系统会忽略原令牌的主组、登录SID等非基础属性,生成符合默认安全策略的令牌,适用于仅需权限验证的场景。 - 若需复刻调用方完整身份(包括主组),必须将该参数设为FALSE。
内容的提问来源于stack exchange,提问作者Cedric Blancher
相关产品推荐
相关产品推荐

