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 服务器之间创建共享剪贴板是一个有趣的问题,值得自己进行问答,而不是与此混为一谈。
运行在同一台机器上且用户账号相同的应用程序可以使用ptrace系统调用来修改彼此的进程内存,所以这里X11并不是最方便的攻击面。
对于您不完全信任的应用程序,您需要首先使用不同的用户 ID 运行它们(就像 Android 对来自不同供应商的应用程序所做的那样),并且您可以使用 XSECURITY 扩展为 X 服务器生成“不受信任”的访问令牌,应用程序对 X11 的访问受到限制:
X11 中的输入事件有一个Synthetic字段,用于说明输入事件是从输入设备生成还是从另一个程序发送,接收程序决定如何处理合成事件,例如xterm忽略它们。XTEST 扩展允许Synthetic出于测试目的从软件生成非事件,这就是不允许不受信任的客户端使用该扩展的原因。