为什么操作系统不让击键只对当前应用程序可用?

信息安全 操作系统 键盘记录器
2021-08-11 10:23:39

似乎防止(软件)键盘记录的一种相对明显的方法是仅强制当前(焦点)应用程序能够接收击键。

可能有一种方法可以为宏应用程序等设置明确的例外。查询例外列表将使查找键盘记录器变得微不足道。

操作系统默认不执行此策略是否有任何原因?

4个回答

因为它没有帮助。

大多数键盘记录器都安装在操作系统级别,并且操作系统需要能够访问击键。Alt-Tab 程序切换、使用 Ctrl-Alt-Del 终止故障程序以及检测键盘活动以防止屏幕保护程序激活都需要操作系统查看击键。

还有一个小问题,如果您消除操作系统对键盘的访问,每个应用程序都需要内置一整套键盘驱动程序。

键盘到应用程序界面经历了几个阶段,其中一些是操作系统几乎无法控制的,还有一些是为附加功能提供明确的挂钩。基本设计如下:驱动程序链接收硬件事件,然后将消息传递给内核,然后将其分派到全局热键链,最后到预期的应用程序(如果没有被链中的任何先前步骤取消) )。

驱动程序链允许内核不关心击键的“如何”生成,只关心它们是如何生成的。它们可能来自键盘、红外设备或任何其他可以发送设计为被解释为键盘的信号的源。例如,硬件键盘记录器是一端具有 USB 或 PS/2 输入,另一端具有 USB 端口或 PS/2 的加密狗,这样键盘将数据通过该设备并被截获。操作系统实际上无法检测到此类日志记录正在进行。

另一种常见的日志记录发生在软件中,它可以在操作系统有机会看到键盘消息之前发生,也可以在之后发生。驱动程序几乎可以做任何他们想做的事情,并且操作系统无法严格检测到驱动程序出于恶意目的转移消息,因为它们可以在操作系统之前检查消息。这是驱动程序所属的硬件抽象层 (HAL) 的本质。幸运的是,由于它们在内存中,反恶意软件可以检测并禁用此类行为。

最后,您在操作系统中有一个故意的“漏洞”,通常称为“全局热键”,它允许任何应用程序请求在焦点应用程序之前将键盘消息传递给它们。这不仅允许 Alt-Tab 工作(窗口管理器拦截这些消息以切换应用程序),而且大多数媒体程序请求处理程序支持多媒体键,如播放、倒带和快进,以及其他用户级应用程序音量控制等。如果没有所有这些全局热键,操作系统使用起来会非常烦人,结果应用程序会复杂得多。然而,正如这是一个很棒的功能,它也可能被程序滥用。

但是,您应该注意,并非“所有”程序都获得键盘消息的副本,只有驱动程序、全局热键处理程序和焦点应用程序。这个问题与每个程序都获得一个键盘事件的副本这一事实无关,而是 HAL 需要能够将消息从硬件消息转换为内核消息,并且全局热键对于向用户无需构建每个程序即可提供相同的功能。

不过,在锁定该过程方面已经取得了一些进展,例如要求“签名驱动程序”,以减少恶意驱动程序进入驱动程序链的可能性,以及可以检测应用程序不良行为的防病毒软件。然而,在许多安全漏洞得到解决之前,例如硬件级键盘记录和不安全的全局热键注册存在,记录器仍然有机会记录击键。尽管正常的击键看起来只是从硬件到应用程序,但实际上有几个必要的干预步骤,这些步骤是基本兼容性(驱动程序)和功能(全局热键)所必需的。

默认情况下不这样做的原因是因为上一代操作系统设计并没有特别关注沙盒等,所以现在需要对架构进行重大更改才能使这些更改生效。马克在他的回答中在某种程度上触及了这些,但归结为你不能让应用程序盲目地以操作系统权限运行。

然而,更有趣的是,现代操作系统,例如 Google 的 Android、Apple 的 iOS 甚至 Google 的(桌面)ChromeOS 都将击键限制在当前的应用程序中1现在,只关注 ChromeOS,因为它是列表中唯一的桌面操作系统,同样重要的是要注意全局快捷方式在这种情况下不会产生任何问题。应用程序可以“简单地”告诉操作系统他们希望绑定到特定的快捷方式,然后用户可以在操作系统中配置该快捷方式。对于那些对它的外观感到好奇的人,可以在此处找到相关规范。

同样,通过查看 Android,我们可以发现,当且仅当应用程序在可访问性设置面板中明确授予此类权限时,通过公开此类信息,仍可以在此类现代环境中编写需要全局键盘访问的可访问性软件。这使得设置这样的软件有点痛苦,但它确实阻止了键盘记录器的分发。

总之,它没有完成的唯一原因不是因为它没有帮助或不可能,而是因为由于历史优先事项,它只是需要更长的时间才能到达那里。我们将及时到达那里,同时在安全环境中使用更现代的锁定操作系统是有意义的。


1我知道 Mac OS X 最近一直在扩展他们的应用程序沙盒工作。我认为经过适当沙盒处理的应用程序(一个不需要管理员权限的应用程序)也将无法充当键盘记录器,但是我几乎没有花时间阅读他们的沙盒处理的真正工作原理。如果有人确定,请分享!

在 Windows 上,以同一用户身份运行的应用程序之间几乎没有保护。如果您尝试删除SetWindowsHookEx,那么恶意软件编写者将切换到 DLL 注入和一整套其他技术。您甚至可以在目标应用程序上绘制一个透明窗口该窗口将具有焦点并接收击键,然后通过发送 Windows 消息传递这些击键。从根本上说,Windows 在设计时并未考虑到恶意可执行文件的可能性。

为运行不受信任的应用程序而设计的系统可以将它们彼此沙箱化。但它仍然容易受到(非常罕见的)从沙盒中冲出内核的攻击。

还有另一种可以使用的技术:浏览器中的任意代码执行使漏洞利用能够记录浏览器看到的每一次击键,即使它无法逃脱沙箱。