X11 危险吗?

Dst*_*art 26 linux security x11

我是 X11 的新手,想了解它是否真的像他们在互联网上所说的那样危险。

我将解释我如何理解这一点。从当前用户下启动的任何应用程序都可以访问键盘、鼠标、显示器(例如截屏),这并不好。但是,如果我们从官方存储库(例如,用于 Debian)安装程序,这些程序不太可能包含键盘记录器等,那么危险似乎被夸大了。我错了吗?

是的,您可以在单独的服务器(例如 Xephyr)上打开应用程序,但这很不方便,因为没有共享剪贴板。基于 tmp 文件创建剪贴板也很不方便。

mos*_*svy 43

从当前用户下启动的任何应用程序都可以访问键盘、鼠标、显示器(例如截屏),这并不好。

桌面上的所有 X11 客户端都可以相互深度访问,包括获取任何窗口的内容、更改它、关闭任何窗口、向任何其他客户端伪造键和鼠标事件、抓取任何输入设备等。

X11 协议设计基于这样一种理念,即客户端都是受信任的并且将协作,而不是相互踩踏(后者完全被 Firefox、Chrome 或 Java 等现代应用程序破坏了)。

但是,如果我们从官方存储库(例如Debian)安装程序,这些程序不太可能包含键盘记录器等,那么危险问题显然被夸大了。我错了吗?

程序有漏洞,可能会被利用。X11 服务器和库可能不是最新的。例如,任何 X11 客户端都可以通过无害的 Xkb 请求使当前版本的 Debian(Buster 10)中的 X 服务器崩溃。(这已在上游源代码中修复,但尚未在 Debian 中实现)。如果它能够使其崩溃,那么它也有可能以 X11 服务器的权限(访问硬件等)执行代码。

对于 Xwayland(以及 Debian 中的常规 Xorg Xserver)中身份验证不严的问题,请参阅此答案末尾的注释。

是的,您可以在单独的服务器(例如 Xephyr)上打开应用程序,但这很不方便,因为没有共享剪贴板。基于 tmp 文件创建剪贴板也很不方便。

请注意,除非您采取额外的步骤,否则默认情况下Xephyr允许任何本地用户连接到它。有关的讨论,请参阅this

在多个 X11 服务器之间创建共享剪贴板是一个有趣的问题,值得自己进行问答,而不是与此混为一谈。

  • @StephenKitt Java 应用程序(swing)在启动时窃取焦点,这意味着它们完全打破了任何焦点跟随鼠标模型,除非经过特殊处理。就像 Firefox 一样,java 应用程序需要窗口管理器的特殊帮助,否则无法打开下拉菜单、无法聚焦输入框等。我不知道是否仍然如此,但 java 假设窗口管理器正在重新设置父级,除非它被命名为“LG3D”或类似名称(Java 库有一个非父级 WM 的选择列表,而所有其他非父级 WM 必须对其名称撒谎 ;-))。 (16认同)
  • 只是好奇,在这种情况下,Java 有什么特别不好的地方? (12认同)
  • @mosvy 情况仍然如此,至少对于 openjdk。例如,在 xmonad 中,您必须将“LG3D”配置为窗口管理器名称。否则带有 gui 的 java 应用程序将无法工作。 (4认同)
  • 我再也找不到来源了,但我曾经读过 MS Office 窃取焦点的原因是为了防止大量支持呼叫“我在桌面上三次单击 Excel,因为我没有足够的电机控制来双击-单击,但它没有启动”(因为 Excel 实际上已最小化,因为第三次单击重新聚焦桌面)并且用户不知道如何切换窗口。因此,从用户体验的角度来看,窃取焦点实际上是有意的。 (4认同)
  • @mosvy *Java 应用程序(swing)在启动时窃取注意力* 如果这会引起安全问题,那么为 Windows 编码的应用程序中有一半是不安全的 [在此处插入你自己的笑话]。有人需要用一个死了三周的、完全腐烂的鲭鱼,用它来打那些坚持他们的应用程序是“特别的”并且必须把注意力转移到启动上的用户体验小丑。 (2认同)

Sim*_*ter 9

运行在同一台机器上且用户账号相同的应用程序可以使用ptrace系统调用来修改彼此的进程内存,所以这里X11并不是最方便的攻击面。

对于您不完全信任的应用程序,您需要首先使用不同的用户 ID 运行它们(就像 Android 对来自不同供应商的应用程序所做的那样),并且您可以使用 XSECURITY 扩展为 X 服务器生成“不受信任”的访问令牌,应用程序对 X11 的访问受到限制:

  • 无法访问不针对自己窗口的输入事件
  • 无法访问 XTEST 扩展
  • 没有透明窗户

X11 中的输入事件有一个Synthetic字段,用于说明输入事件是从输入设备生成还是从另一个程序发送,接收程序决定如何处理合成事件,例如xterm忽略它们。XTEST 扩展允许Synthetic出于测试目的从软件生成非事件,这就是不允许不受信任的客户端使用该扩展的原因。