如何安全地使用UAC提升IPC?

我有我的程序的部分需要pipe理访问(影响所有用户的设置,存储在HKLM,并限于pipe理访问)。

我已经改变了我的软件,以表明海拔是必需的:

在这里输入图像说明

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

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); 

我要做的是在命令行中传递命名pipe道的名称,告诉自己可以连接到的位置,以便获得有关应该执行的操作的指示信息:

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

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

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

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

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

MaliciousProgram.exe

  ShellExecute("myapp.exe /uac HahaYouDoWhatISayNow") 

我记得在Longhorntesting版中,有一个Channel9video,或者一篇文章,谈论UAC和IPC(进程间通信)错误的危险。

我不想重新发明轮子,犯了已经解决的安全错误。 但我无法find任何现有的指导,以“ 正确 ”的方式来做与UAC海拔IPC。

他接受了什么样的模式来与IPC进行沟通,以形成一个临时boost的行为,


编辑: uacipc标签的联合追随者:53

我不相信这里有一个安全问题(有一些注意事项,如下所述)。 如果用户不能提升,这个解决方案将无法正常工作。 如果用户可以提升并且是恶意的,那么机器已经被盗用了。 例如,如果恶意用户想要对HKLM进行更改,那么为什么在注册表可用时使用myapp.exe?

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

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

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

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

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

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