如果ImpersonateSelf()之后的RevertToSelf()失败,这是致命的吗?

sha*_*oth 7 windows security privileges impersonation winapi

MSDN说,如果RevertToSelf()失败,程序应立即终止,否则它将继续以被模拟的客户端名称运行,这是不合适的.现在假设我这样做

ImpersonateSelf( SecurityImpersonation );
Run Code Online (Sandbox Code Playgroud)

并且呼叫成功,然后我呼叫RevertToSelf(),后者失败.线程继续以当前进程的权限运行.它真的很糟糕吗?

ixe*_*013 4

我喜欢你的问题,MSDN 并不清楚。

我查看了《Programming Windows Security》(Keith Brown)第 112 至 117 页。ImpersonateSelf您可以通过调用自己完成所有工作

  • 开放进程令牌
  • DuplicateTokenEx(...TokenImpersonation...)
  • 设置线程令牌
  • 关闭句柄

WhileRevertToSelf只是一个调用

SetThreadToken(0,0)
Run Code Online (Sandbox Code Playgroud)

传递两个 null 参数指示该方法恢复到以前的标记。您不必处理模拟与主要令牌和令牌访问权限的问题。调用总会成功。

如果您查看RpcRevertToSelf函数的错误代码,您会发现除了 RPC 相关代码之外,唯一的失败模式是您没有进行模拟。

我说可以安全地假设RevertToSelf(从与 ImpersonateSelf 相同的线程调用)总是会成功。