【问题标题】:How to do IPC with UAC elevation safely?如何安全地进行 IPC 与 UAC 提升?
【发布时间】:2011-09-20 00:17:13
【问题描述】:

我的程序的某些部分需要管理访问权限(影响所有用户的设置,存储在 HKLM 中,并且仅限于管理访问权限)。

我已更改我的软件以指示需要提升:

作为回应,我将在提示提升时启动我的可执行文件:

SHELLEXECUTEINFO shExecInfo;
shExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
shExecInfo.fMask = NULL;
shExecInfo.hwnd = NULL;
shExecInfo.lpVerb = L"runas";
shExecInfo.lpFile = L"myapp.exe";
shExecInfo.lpParameters = NULL;
shExecInfo.lpDirectory = NULL;
shExecInfo.nShow = SW_MAXIMIZE;
shExecInfo.hInstApp = NULL;
ShellExecuteEx(&shExecInfo);

打算要做的是在命令行上传递命名管道的名称,告诉自己它可以连接回哪里,以便获得关于它应该做什么的说明:

myapp.exe /uac 6C844671-E262-46DD-939E-47517F105FB6

(是的,使用 GUID 作为管道的名称)。

通过这个管道我会告诉我提升的克隆是什么数据库,例如:

  • 它应该连接到哪个服务器数据库
  • 应该说是用户进行更改
  • 应该添加/编辑/删除的东西

那时我担心的是任何人都可以启动myapp.exe,然后向它提供各种请求 - 我不希望它做的事情,因为 i 没有启动它,例如:

MaliciousProgram.exe

 ShellExecute("myapp.exe /uac HahaYouDoWhatISayNow")

我记得在 Longhorn 测试版期间,有一个 Channel9 视频或一篇文章,谈论 UAC 以及错误执行 IPC(进程间通信)的危险。

我不想重新发明轮子,制造已经解决的安全错误。但我找不到任何关于“正确”方式使用 UAC 提升进行 IPC 的现有指导。

他不接受什么模式来执行 IPC 以与生成的提升进程进行通信以进行临时提升操作?


编辑: uacipc 标签的联合关注者:53

【问题讨论】:

  • 我想知道 - 你问这个问题已经有五年了。你有没有得到满意的解决方案?

标签: windows security design-patterns ipc uac


【解决方案1】:

我认为这里不存在安全问题(有一些注意事项,如下所述)。如果用户不能提升,这个解决方案无论如何都行不通;如果用户可以提升,并且是恶意的,那么机器已经被入侵了。例如,如果恶意用户想要在 HKLM 中进行更改,为什么在 regedit 可用时使用 myapp.exe?

但是,我对您提到的服务器数据库感到困惑;这如何符合海拔要求?一般来说,访问远程资源不需要提升。 (如果 myapp.exe 或 HKLM 包含服务器数据库的密码,则不应。)

至于IPC的选择:我不是UAC编程专家,但是搜索MSDN我注意到提升的COM对象被多次提及,例如:

http://msdn.microsoft.com/en-us/magazine/cc163486.aspx

另请参阅本文第五个链接的幻灯片:

http://msdn.microsoft.com/en-us/library/bb756996.aspx

但是,如果您对 COM 不满意(加入俱乐部!),那么按照您的建议使用命名管道应该同样有效。但是,您确实需要对命名管道采取必要的常规预防措施 - 确保在启动提升的进程之前创建命名管道的服务器端,检查管道是否已经存在,并使用适当的 ACL 创建它.

【讨论】:

  • 问题是,如果我的 elevated 进程正在侦听管道:没有什么能阻止 non-elevated 进程通过同一管道发送命令管道。更糟糕的是,在我的代码中利用缓冲区溢出错误的非提升进程。现在非提升的进程能够运行提升的任意代码。
  • 您只需正确设置管道上的ACL即可。将 nMaxInstances 设置为 1 也是一个明智的预防措施。如果你感觉特别偏执,你可以散列你将要发送到特权进程的指令,并在命令行中包含散列。
  • 另外,请记住,在同一用户帐户中运行的任何非提升进程总是能够破坏您的非提升进程,如果它想向提升的进程发送恶意指令。因此,您只需要保护管道免受其他用户帐户的侵害;试图保护它免受同一帐户中的其他进程的影响是没有意义的。
  • 我不担心一个非提升的进程试图欺负我的非提升的进程。我担心一个非提升的进程试图欺负我的提升的进程。
  • 如果你的提升的流程是从你的非提升的流程接受订单,有什么实际的区别吗?
猜你喜欢
  • 2012-06-16
  • 2012-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-11
  • 2010-09-10
  • 2015-10-28
  • 1970-01-01
相关资源
最近更新 更多