0

我正在尝试编写一个作为守护进程运行并监视正在运行的 X 会话的应用程序。现在我正在努力寻找有关 X 安全模型的文档。具体来说,我正在尝试从我的守护进程连接到正在运行的 X 显示器。调用 XOpenDisplay(dispName)不起作用,我猜是因为我的进程无权连接到此显示器。经过一番研究,看来我需要对 xauth 做点什么。

在我的测试环境中,X server 是这样启动的:

/usr/bin/X -br -nolisten tcp :0 vt7 -auth /var/run/xauth/A:0-QBEVDj

该文件包含一个条目,如下所示:

#ffff##:  MIT-MAGIC-COOKIE-1  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

通过~/.Xauthority使用相同的十六进制键添加一个条目,我可以连接到 X 服务器。但是,这很困难,因为我需要以编程方式找到 X 服务器正在使用的身份验证文件(我猜它的位置会从发行版更改为发行版,并且可能从一次启动到下一次),然后查询它,然后编写一个新的授权文件。如果进程作为守护进程运行,它可能没有主目录,那么我如何知道将新条目写入何处?

理想情况下,我正在寻找的是一种绕过 xauth cookie 的需要的方法~/.Xauthority,甚至根本不知道 cookie 是什么。我意识到这不太可能 - 如果安全模型很容易被绕过,它有什么好处?但我希望这个名单上的人可能有一些好主意。有没有办法指定我的进程是特权的,因此应该自动访问本地机器上的任何显示?

4

2 回答 2

1

XAUTHORITY如果指定环境变量,则不必使用主目录,该变量指定.Xauthority文件的位置。阅读xauth手册页。

但是,由于您提到的原因,通常很难找到身份验证文件;此外,这种“寻找身份验证令牌”方法仅适用于本地显示。

关于让 root(或其他用户)连接到 X 服务器,你可能不得不修补源代码来做到这一点,你必须使用类似的东西getpeereid来获取连接用户的 uid/ gid (这仅适用于 Unix 域套接字,无论如何我认为它将是用于本地连接的类型)。

于 2009-08-19T12:14:28.140 回答
1

Xauth 不是 X 的唯一安全机制

还有另一个(安全性较低)仅执行基于 IP 的身份验证(请参阅xhost)。

因此,如果您将 X 服务器切换到这种不太安全的模式,它将信任来自已定义 IP 集的任何连接。

这样,您根本不需要处理 Xauthority。

于 2009-08-19T13:25:02.883 回答