首页 > 解决方案 > 为什么没有安全措施来防止通过 X11 在其他应用程序窗口上绘图?

问题描述

我最近一直在研究 X 窗口系统,我发现在另一个进程创建的窗口上绘图是相当简单的。您只需要窗口 ID。我不确定如何通过 X11 核心协议检索窗口 ID 和其他现有窗口信息,但这显然是可能的,因为有一个名为 xwininfo 的简单 X11 实用程序可以做到这一点。

xwininfo 不需要 root 权限,也不需要 root 权限来绘制由其他应用程序创建的窗口。事实上,我只是将像素直接绘制到现有的终端窗口上,而没有任何来自用户空间的提升权限。

这不是安全问题吗?任何应用程序都可以在任何其他应用程序的窗口上绘图这一事实似乎会引发问题,例如恶意软件绘制的不可关闭的广告。

这是什么原因?例如,为每个窗口生成一个共享的 HMAC 密钥并让客户端签署每个请求是很容易的。

我的第一个猜测显然是性能——如果它需要签名和验证客户端请求以便在窗口中绘制几个像素,那么可能会有明显的延迟。然而,对于许多简单的桌面应用程序来说,延迟可能仍然可以忽略不计,那么为什么没有任何类型的安全措施,甚至是可选的呢?我错过了什么吗?

标签: x11

解决方案


X11 是一种允许远程显示图形用户界面的协议。现在,X 服务器(负责与“窗口管理器”或“桌面环境”通信的服务器)通常运行在本地桌面上,并且以 root 身份运行。除其他原因外,这意味着 X 服务器可以访问在其下运行的所有内容,并且由于应用程序之间没有隔离(请注意,由于各种实际原因,通常不会这样做),您可以做任何您想做的事情想要,尽管客户端应用程序作为非特权用户运行。

引用NSA 的“使用 SELinux 保护 X Window 系统”的完整性部分:

当前的 X 服务器对客户端程序数据的完整性提供的保护很少。X 服务器不直接与客户端的数据交互。客户端可以直接绘制到另一个客户端的窗口中,并且可以将输入或任何其他类型的事件直接发送到客户端。恶意客户端可能会导致另一个客户端向用户提供虚假信息。或者,攻击者可以将恶意命令插入终端仿真器的输入流中。这些类型的攻击可能会导致应用程序违反系统的完整性策略,本文介绍的保护措施旨在保护 X 客户端的完整性。

这就是为什么开始研究替代 X 显示系统(如 Mir 或Wayland )的一些原因。后者是大多数 Linux 桌面的发展方向。

如果你想了解更多关于 X Window 系统的安全性,上面来自 NSA 的论文是一个很好的资源。


推荐阅读