我可以阻止 Linux 系统上的 Firefox 进程访问我的系统的任何部分,从而破坏屏幕共享吗?
我在视频通话中注意到 Firefox 具有屏幕共享功能,这意味着该进程可以读取我屏幕上显示的内容。
我不喜欢浏览器可以访问屏幕上的所有内容。这背后的机制是什么?
答案1
为什么 X11 下可以进行屏幕共享?
在 X11 安全模型中,默认情况下,每个可以访问 X 服务器并且不受 X 服务器扩展限制的客户端都是受信任的,并且可以使用类似的查询XCopyArea
或者XGetImage
捕获屏幕上每个窗口的内容。造成这种情况的原因主要是历史原因,因为 X11 协议的第一个版本于 1987 年发布,安全功能后来被“附加”。
Wayland有更严格的安全设计。只有合成器或指定的受信任应用程序才能访问其他窗口的内容。
X 访问控制扩展框架
阻止屏幕共享的一种精心设计的解决方案是使用X 访问控制扩展 (XACE)。该扩展为其他扩展模块提供了挂钩,以允许细粒度的访问控制决策。
不幸的是,我没有找到任何可以阻止特定应用程序访问外部窗口的现有模块,因此您需要自己编写一个这样的扩展。这可能是一项相当耗时的任务。
X 安全扩展
一个更简单的解决方案是安全扩展。它早于 XACE,仅区分“受信任”和“不受信任”客户端,因此它不仅阻止屏幕共享还有图形加速、光标捕获、自定义光标和全屏窗口等功能。因此它可能会导致错误行为并减慢渲染速度。
基本思想是应用程序使用“magic cookie”向 X 服务器进行授权。这些“cookie”本质上是写入某个文件(或环境变量中引用的~/.Xauthority
文件)中的随机数,应用程序可以使用它们向 X 服务器证明它们被允许连接。 Cookie 可以是“可信”或“不可信”。登录时生成的默认 cookie 是受信任的。/tmp/xauth-*
XAUTHORITY
因此,要限制 Firefox,您需要在新的 X 权限文件中生成一个新的不受信任的 cookie,并使用XAUTHORITY
环境变量在启动时为 Firefox 提供不受信任的 cookie。这可以使用xauth
命令。
以下包装器脚本将作为不受信任的 X 客户端执行作为参数给出的程序:
#!/bin/sh
# Create empty file only accessible by the current user or empty it if already existing
(umask 0077; : > ~/.Xauthority-untrusted)
# Generate an untrusted magic cookie expiring 30 seconds after last use
xauth -f ~/.Xauthority-untrusted generate "$DISPLAY" MIT-MAGIC-COOKIE-1 untrusted timeout 30
# Set the environment variable
XAUTHORITY=~/.Xauthority-untrusted
export XAUTHORITY
# Replace the shell with the program given on the command line
exec "$@"
将其另存为eguntrusted.sh
并使其可执行。然后您就可以使用 来以不受信任模式启动 Firefox ./untrusted.sh firefox
。
请注意,这并不能完全防范恶意应用程序。只要应用程序在您的本地计算机上并在您的用户帐户下运行,就可以绕过这种保护,因为恶意应用程序可能会猜测原始权限文件的位置或利用由例如xhost
访问控制,但足以阻止浏览器共享屏幕。