Server 2012R2 UAC场景自定义凭据提供程序触发访问违规崩溃
Server 2012R2下自定义凭据提供程序触发UAC流程崩溃问题
问题现象
- 基于Visual C++ 2019、ATL框架开发,实现
IConnectableCredentialProviderCredential接口的自定义凭据提供程序,在Server 2016/2019、Windows 10/11系统上可正常运行 - 部署到Server 2012R2系统时,UAC流程会出现UI崩溃,典型复现场景为非管理员用户提权启动管理员权限PowerShell会话
调试捕获信息
附加远程调试器可稳定复现崩溃,捕获到的异常信息如下:
Exception thrown at 0x00007FFE9E627EC3 (authui.dll) in consent.exe: 0xC0000005: Access violation reading location 0x0000000000000008.
已完成排查结论
- 崩溃发生前系统从未调用凭据对象的
Connect()或GetSerialization()方法 - 内置日志记录显示用户名、密码字段均已正常完成赋值
- 崩溃触发时机:用户输入密码后按下回车键、或点击「确定」按钮后,consent.exe进程未触发凭据序列化请求就直接崩溃;最后一次进入凭据提供程序代码的调用为
ICredentialProviderCredential::SetStringValue()接口,对应输入密码后、按下确认键前的操作节点 - 最初怀疑问题根因为系统调用
ICredentialProvider::GetFieldDescriptorAt()、ICredentialProviderCredential::GetStringValue()等Credential Provider相关Get系列接口时,程序返回了非法数据,逐行排查所有接口实现逻辑未发现问题:GetStringValue()实现完全参照SDK示例,调用SHStrDupW()完成字符串返回GetFieldDescriptorAt()直接复用SDK官方示例代码
- 已将该凭据提供程序精简为最小可复现示例工程用于问题排查,需要协助排查是否存在接口返回非法数据的隐藏问题。
内容的提问来源于stack exchange,提问作者Joseph Willcoxson
相关产品推荐
相关产品推荐

