2009-08-19 8 views
0

J'essaie d'écrire une application qui s'exécute en tant que démon et qui surveille les sessions X exécutées . En ce moment j'ai du mal à trouver la documentation concernant le modèle de sécurité X. Plus précisément, je tente de se connecter aux écrans X en cours d'exécution à partir de mon processus démon. Appeler XOpenDisplay(dispName) ne fonctionne pas, je suppose que mon processus n'a pas la permission de se connecter à cet affichage. Après un peu de recherche, il semble que je doive faire quelque chose avec xauth.Contournement d'autorité X

Dans mon environnement de test, le serveur X est démarré comme ceci:

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

Ce fichier contient une seule entrée, qui ressemble à ceci:

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

en ajoutant une entrée à ~/.Xauthority avec la même clé hexadécimale, je peux se connecter au serveur X. Cependant, ceci est difficile parce que j'ai besoin de trouver par programme le fichier auth utilisé par le serveur X (l'emplacement deviendra probablement de distro à distro, et probablement d'un démarrage à l'autre), puis l'interroger, puis écrivez un nouveau fichier auth . Si le processus s'exécute en tant que démon, il peut ne pas avoir de répertoire personnel , alors comment savoir où écrire les nouvelles entrées?

Idéalement, ce que je suis à la recherche est un moyen de contourner la nécessité d'avoir le cookie xauth dans ~/.Xauthority, ou même de savoir ce que le cookie est à tous. Je me rends compte que cela est peu probable - à quoi bon un modèle de sécurité s'il est facilement contourné? mais j'espère que quelqu'un sur cette liste aura quelques bonnes idées. Existe-t-il un moyen de spécifier que mon processus est privilégié et devrait donc automatiquement avoir accès à n'importe quel affichage sur la machine locale?

+0

J'ai découvert ce Q dans le processus de résoudre un problème similaire moi-même, et découvert dans un code système un qui fournit un moyen de trouver le fichier .xauthority avec lequel l'affichage X a été initialisé, et fait un code utile: http : //blog.fox.geek.nz/2012/10/granting-root-access-to-all-xorg-x11.html –

+0

Sur un plan plus fondamental, vous semblez chercher des moyens de contourner les barrières de sécurité qui étaient mettre là pour de bonnes raisons. Une approche moins intrusive consiste à faire en sorte que vos utilisateurs exécutent un client qui se connecte à votre démon via un mécanisme RPC. Vous pouvez le faire fonctionner par défaut pour tous les utilisateurs à partir des hooks de session X à l'échelle du système, ce qui permet également, mais fastidieux, à certains utilisateurs de se désengager. – tripleee

Répondre

1

Vous n'avez pas besoin d'utiliser un répertoire personnel si vous spécifiez une variable d'environnement XAUTHORITY, qui spécifie l'emplacement du fichier .Xauthority. Lisez la page de manuel xauth. Mais, en général, il est difficile de localiser le fichier auth, pour les raisons que vous avez mentionnées; De plus, cette approche de «pêche aux jetons authentiques» ne fonctionnerait que pour les expositions locales. En ce qui concerne le fait de laisser la racine (ou un autre utilisateur) se connecter à un serveur X, vous devrez probablement patcher le code source pour le faire, et vous devrez utiliser quelque chose comme getpeereid pour obtenir l'uid/gid de l'utilisateur qui se connecte (cela ne fonctionne que sur les sockets Unix-domain, ce qui, je présume, serait le type utilisé pour les connexions locales, de toute façon).

+0

Merci. Je ne suis intéressé que par les connexions locales. Je suis capable de modifier les fichiers de configuration locaux lorsque j'installe mon application, mais il est hors de question de modifier le code source du serveur X et de patcher le serveur X lors de l'installation. – Thomi

1

Xauth est pas le seul mécanisme de sécurité pour X

Il y a aussi un autre (moins sûr) qui effectue simplement l'authentification basée sur IP (Voir xhost). Par conséquent, si vous basculez votre serveur X vers ce mode moins sécurisé, il fera confiance aux connexions venant de l'ensemble d'adresses IP défini.

De cette façon, vous n'avez pas du tout besoin de traiter avec Xauthority.

+0

Merci. Je suis conscient du mécanisme d'authentification basé sur xhost. Peut-être que c'est la meilleure voie à suivre. Idéalement, je ne veux pas du tout modifier le mécanisme d'authentification existant, car je suis en train de jouer avec la configuration de l'utilisateur (pouvez-vous imaginer le tollé des utilisateurs de sécurité lorsque je passe au mécanisme d'authentification le moins sécurisé? ?). – Thomi

+0

Je dirai que je n'exécuterais jamais une application qui m'obligeait à éteindre xauth, donc je comprends tout le "tumulte parmi les utilisateurs soucieux de la sécurité". –

+0

D'accord. Voici un compromis qui ne fera probablement pas de sysadmins vouloir vous tuer. Peut être. Utilisez xhost et activez l'accès à partir d'une adresse IP privée (par exemple, 127.1.2.3). Obtenez le sysadmin pour configurer des règles de pare-feu qui autorisent uniquement les connexions à 127.1.2.3 si le socket appartient à root (ou autre). Terminé. –

Questions connexes