运行 Xephyr 的经典命令:
Xephyr -br -ac -noreset -screen 800x600 :1
据我了解,-ackey是xhost+的类似物,这是一个漏洞,因为几乎每个人都可以访问显示器、鼠标、键盘。
在 Xephyr 示例中如何解决这个问题?
更新: 莫斯维非常感谢您非常详细的回答!确实,即使没有“交流电” 访问权限向所有人开放。你的回答从安全角度让我对 xorg 和 ssh 有了新的认识。我的 LiveCD/USB 上的常规 Xorg 服务器实际上是通过 -auth 实现的:
$ pgrep -ai Xorg
551 /usr/lib/xorg/Xorg :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch
答案1
如果您不使用该-auth auth-file
选项,Xephyr :1
则即使没有该选项,也已允许来自同一主机的任何人连接到它-ac
。尝试这个:
hinz$ Xephyr :1 &
然后,作为另一个用户
kunz$ xclock -display :1
这也适用于任何X 服务器,不仅仅是Xephyr
;如果您查看常规Xorg
服务器,您将看到该-auth
选项是显式传递的:
$ pgrep -ai Xorg 第2347章 /usr/lib/xorg/Xorg vt2 -displayfd 3-auth /运行/用户/1000/gdm/Xauthority-背景无 -noreset -keeptty -verbose 3
根据Xserver(1)
联机帮助页(强调我的):
X 服务器还使用基于主机的访问控制列表来决定是否接受来自特定计算机上的客户端的连接。 如果没有使用其他授权机制,该列表最初包括运行服务器的主机以及文件中列出的任何机器
/etc/Xn.hosts
正如在另一篇文章中已经提到的回答getsockopt(SO_PEERCRED)
,一些 Xorg 服务器(例如 Xwayland)除了检查谁通过“本地用户和本地组服务器解释访问类型”打开了 unix 套接字之外,不支持任何身份验证机制Xsecurity(7)
;另外,一些发行版如 Debian有缺口xhost +si:localuser:$(id -un)
通过 xsession 脚本的常规 Xorg 服务器。由于套接字 fd 可以被传递,并且客户端可以被诸如 之类的程序代理xscope
,所以这是一件非常愚蠢的事情。
该怎么办
如果您想阻止其他用户连接到您的 X 服务器,您必须使用某种形式的身份验证。
创建一个授权文件,通过选项将其传递-auth
给X服务器,然后让客户端在连接到服务器时使用它。
# create a MIT-COOKIE authfile
$ xauth -f ~/.xauth-junk add :1 . "$(hexdump -n 16 -e '4/4 "%08x"' /dev/urandom)"
xauth: file /home2/ahq/.xauth-junk does not exist # it will be created
$ Xephyr :1 -auth ~/.xauth-junk &
然后将其合并到您常用的$XAUTHORITY
文件中(~/.Xauthority
如果没有在环境中覆盖)
$ xauth merge - < ~/.xauth-junk
$ xclock -display :1
或者在环境变量中显式传递它XAUTHORITY
:
$ XAUTHORITY=~/.xauth-junk xclock -display :1
您可以通过尝试连接伪造的身份验证文件来检查该-auth
选项是否确实有效:
$ XAUTHORITY=/dev/null xdpyinfo -display :1 >/dev/null 2>&1 && echo OOPS, anybody can connect!
$