【问题标题】:Drag/Drop between medium/high integrity level processes in Windows Vista在 Windows Vista 中的中/高完整性级别进程之间拖放
【发布时间】:2009-07-23 12:41:32
【问题描述】:

在 Windows Vista 中,我无法将文件拖放到我的应用程序的窗口中,因为它作为高完整性级别的进程运行。我需要将它运行得尽可能高,但我还需要能够接受来自低/中完整性级别进程(如 Windows 资源管理器)的丢弃文件。我相信是 UIPI 阻止了拖放操作。我知道我可以使用 ChangeWindowMessageFilter 函数来允许某些 Windows 消息绕过 UIPI,但我不确定要添加哪些消息以允许拖放操作。 ChangeWindowMessageFilter 是允许这样做的正确方法,还是有更好的方法?谢谢!

【问题讨论】:

    标签: security windows-vista process


    【解决方案1】:

    考虑到此博客条目的标题:
    "Why you shouldn’t touch Change­Window­Message­Filter with a 10-ft pole…",
    我想这不是最好的方法;)

    现在,起初这似乎是一个很好的方法 - 毕竟,只有当您确定可以完全验证收到的消息时,您才会使用 Change­Window­Message­Filter,即使它来自不受信任的来源,例如不会有什么问题吧?

    好吧,问题是即使你这样做了,你经常会无意中打开你的程序来进行攻击
    考虑一下通常如何使用自定义窗口消息;几乎所有现有的通用控件在自定义类消息范围内都有“危险”消息(例如 WM_USER 和朋友)。

    此外,许多程序和第三方库混淆了WM_USERWM_APP,因此您可能有程序通过WM_USERWM_APP 进行跨进程通信,通过用于使敏感的“危险”消息决策或包含指针参数。


    在这篇博文的 cmets 中,讨论了另一种方法,但得出的结论几乎相同:

    我会使用RegisterWindowMessage,然后通过ChangeWindowMessageFilter 允许它。
    但是请注意,您不能设计一个传递指针或其他不可信值的跨进程窗口消息接口,否则您正在创建一个安全漏洞。

    出于这个原因,对于大多数跨进程 IPC(如果可能),我倾向于避免在所有消息中使用窗口,因为使用它们通常很难以安全的方式做重要的事情。


    注意:这个条目“So, who wants to design a feature today?”说明了同样的问题,并指向Raymond Chen的有见地的文章:

    两者都详细说明了问题。
    这个ServerFault问题“Why can’t I drag/drop a file for editing in notepad in Windows Server 2008?”也包含了一些答案,但没有速赢。

    另请参阅article on IE

    【讨论】:

    • 我知道使用这种方法打开我的应用程序的危险,因此我不会传递任何指针结构。我真的需要拖放功能才能工作,而 Vista 的“安全性”真的开始让我烦恼了。
    • 我了解:请注意,您可能会在此问题中找到一些其他建议:serverfault.com/questions/39600/…(包括禁用 UIPI(用户界面特权隔离))
    • 不幸的是,我不能要求我的应用程序的用户禁用 UIPI。我理解阻止优先级之间的拖放操作背后的原因,但这确实使应用程序开发变得不必要地复杂。 :(
    猜你喜欢
    • 2011-07-29
    • 2017-10-17
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 2010-10-06
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多