[不安全]用xauth命令解决hyprland下x11应用授权问题

  • 注意:帖子描述的方法在使用后会导致任何能连接到X服务器的软件都有权访问,增加了安全风险,不推荐使用:

使用hyprland时,可能会遇到某些需要root权限的x11应用无法打开问题,其中可能带有类似下列日志:

Authorization required, but no authorization protocol specified
Error: Can't open display: :0

通过网络搜索,我发现x11应用遇到了验证失败导致无法连接到X服务器(wayland混成器下运行的XWayland)问题,除了用xhost命令调整X服务器访问权外,还有一个办法就是用xauth设置 X服务器授权信息,下面是一个简易shell脚本例子:

#!/bin/sh
if [ -f ~/.Xauthority ];
then xauth generate "$DISPLAY" . trusted;
else touch ~/.Xauthority;
xauth generate "$DISPLAY" . trusted;
fi

$HOME/.Xautoority是变量 XAUTHORITY未设置时的默认位置,通过在hyprland中配置上述脚本自启动,也就是hyprland启动会启动这个脚本完成X服务器授权文件配置,这样就可以让使用XAUTHORITY获取X服务器连接授权的x11应用正常运行了,目前我测试了一个用XAUTHORITY授权的x11程序,不保证对所有x11程序有效。

你这和xhost +有什么区别啊……

正确的做法是确认$XAUTHORITY设置到了正确的位置(sudo大概会重置这个环境变量)。root用户访问普通用户的文件应该不会有障碍。

所以应该是先设置$XAUTHORITY到正确位置,然后用xauth创建授权文件,这样x11应用可以通过$XAUTHORITY正常授权。下面是修改后脚本与环境变量配置:

#!/bin/sh
touch "/tmp/.xauth";
XAUTHORITY=/tmp/.xauth
xauth generate "$DISPLAY" . trusted;

uwsm环境变量设置:export XAUTHORITY="/tmp/.xauth"

这个授权文件本来就应该存在、并且对你的用户授权。

——你知道你写的xauth generate "$DISPLAY" . trusted;是什么意思吗?

在hyprland上,这个授权文件甚至不会自己创建,所以我需要手动创建。
xauth generate "$DISPLAY" . trusted;用来对x服务器创建授权文件,trusted参数权限较大,所以应该不使用此参数(默认untrusted),这样创建的授权文件有限制,例如用Xresources设的字体dpi不能被读到

hyprland这么流行的Wayland compositor也不给你用MIT-MAGIC-COOKIE-1鉴权吗……那我有一计:用下面这个脚本替换/usr/bin/Xwayland

#!/usr/bin/python3

import os
import sys
import subprocess

def main():
  args = sys.argv[1:]
  xauthority = os.environ.get('XAUTHORITY', os.path.expanduser("~/.Xauthority"))

  mcookie = subprocess.check_output(['mcookie'], text=True).strip()
  nodename = os.uname().nodename
  display = [x for x in args if x.startswith(':')][0]
  subprocess.run(
    ['xauth', '-q'],
    text = True,
    check = True,
    input = f'add {nodename}/unix{display} . {mcookie}\n',
  )

  cmd = ['/usr/bin/Xwayland.real', '-auth', xauthority]
  cmd.extend(args)
  os.execv(cmd[0], cmd)

if __name__ == '__main__':
  main()

不然这留下的安全隐患跟最近的几个LPE漏洞相比也不相上下了呢。

谢谢,不过我考虑到自己可能会使用niri或者kde桌面,如果需要用其他窗口管理器/桌面环境,那么我应该把Xwayland改回去避免出错。
我能不能问下为什么直接用xauth生成鉴权文件会留下安全隐患?

其实也不用的(

你这个设置允许任何能够连接到X服务器的软件访问——默认设置下是所有未被隔离的本地用户。虽然只能访问到用Xwayland的那些程序,但那也不安全啊,可以给它们读写X剪贴板、截图、监听键盘输入、注入输入事件啥的(X协议就是这么不安全)。

谢谢解答,这样看来直接用xauth与用xhost风险差不多,看来我需要修改帖子避免产生误导。