Travaux Dirigés de aas
4. L’authentification X-Window

La Xlib est la bibliothèque graphique standard d'Unix. Une de ses originalités est d'etre fondée sur une architecture client / serveur distribuée, ce qui permet à tout client Internet de demander l'ouverture de fenetres et autres services apparentés sur a priori n'importe quelle machine du réseau. Cette généralité (qui inclut meme le verrouillage du clavier du poste concerné  !) est évidemment tempérée par une authentification invisible mais bien réelle. La présente séance consiste à expliciter cette authentification, afin de comprendre les mécanismes mis en jeu et leurs éventuelles limitations.
En trouvera en annexe un fichier main.c ainsi qu'un makefile référençant celui-ci et deux fichiers request.c et receive.c qu'il s'agit d'écrire, ainsi qu'un petit shell-script de test. On rappelle que dans un makefile, un but est un symbole au début d'une ligne comportant un deux-points, et les sources ce qui suit ce deux-points. Le but s'obtient des sources en exécutant les commandes shell écrites dans les lignes suivantes, jusqu'à rencontre d'une ligne ne commençant pas par une tabulation. Le symbole % permet d'énoncer plusieurs dépendances à la fois  ; en particulier, %.o : %.c énonce que tout but suffixé par .o a pour source le fichier homonyme de suffixe .c. Les variables \@ et &lt  ; désignent respectivement le but courant et sa première source.

Le programme C lance une fonction main tentant une connexion avec le serveur X-window donné en argument, ou à défaut au serveur local standard (adresse 127.0.0.1, port 6000). Une fonction showbuffer est incluse pour visualiser les messages transmis, ainsi qu'une fonction peroraison pour déclencher des messages d'erreur. Le protocole X-window n'est ni textuel ni synchrone : les clients envoient des flux d'octets structurés différement selon les requêtes (et selon leur byte-ordering), et prennent connaissance des réponses ou des notifications d'événements quand ils l'estiment nécessaire.


makefile
main.c (version 2)


1 Ouverture

Écrire la fonction request (dans un fichier C homonyme), invoquée par main après un connect réussi. Son rôle est d'envoyer au serveur la requête d'ouverture, ainsi structurée :

Numéro Nombre Valeur Description
0 1 B ou l B pour gros-boutien, l pour petit-boutien
1 1    ; inutilisé
2 2 [1,11\verb+]+ numéro de version
4 2    ; numéro de sous-version
6 2 n longueur du nom de la méthode d'identification
8 2 d longueur de la clé d'identification
10 2    ; inutilisé
12 n    ; nom de la méthode d'identification
12+n c(n)    ; cadrage pour alignement
12+n+c(n) d    ; clé d'identification
12+n+c(n)+d c(d)    ; cadrage pour alignement

Ecrire une définition provisoire de receive comme ne faisant rien, afin de tester en l'état, sans donner aucun argument au binaire produit.

Obtenir un formulaire de soumission de comptes rendus

2 Repérage d’erreur

La fonction receive, invoquée par main, va recevoir un flux commençant par les 8 octets suivants :

Numéro Nombre Valeur Description
0 1 0 ou 1 erreur ou réusite
1 1 n longueur du message d'erreur, inutilisé sinon
2 2 [1,11\verb+]+ numéro de version
4 2    ; numéro de sous-version
6 2 n/4+((n%4)  !=0) longueur en mots de 32 bits de la suite

Écrire d'abord une version réduire de la fonction receive, testant si les 8 octets reçus dénotent une erreur, et si oui, affichant le message d'erreur (ce sont les octets suivants, moins les octets de cadrage).

Obtenir un formulaire de soumission de comptes rendus

3 Répérage de la réussite

En cas de réussite de la connexion, les 8 premiers octets sont suivis des 32 suivants :

Numéro Nombre Valeur Description
0 4    ; numéro de série
4 4 <  ; 229 identificateur de création
8 4 + de 18 '1' consécutifs masque de création
12 4    ; nombre de mouvements mémorisés
16 2 c longueur du nom du constructeur
18 2    ; longueur maximale d'une requête
20 1 n nombre d'écrans
21 1    ; nombre de formats
22 1    ; ordre des octets
23 1    ; ordre des bits
24 1    ; format des bits
25 1    ; cadrage des bits
26 1    ; plus petit code des touches
27 1    ; plus grand code des touches
28 4    ; inutilisé
32 c    ; nom du constructeur
32+c    ;    ; descriptions des formats et écrans


Compléter la fonction receive pour qu'en cas de réussite, elle affiche le nom du constructeur et le nombre d'écran.

Obtenir un formulaire de soumission de comptes rendus

4 Méthode d’authentification

Pour donner à ce programme les arguments nécessaires à une connexion réussie, il faut connaître la méthode d'identification et sa clé. Elles se trouvent dans le fichier .Xauthority. Les clés étant des valeurs binaires, le fichier est peu lisible, aussi on utilisera la commande xauthlist. Repérer votre dispositif dans le résultat, et utiliser les informations associées pour réussir votre connexion (attention  ! il faut convertir en binaire les valeurs hexadécimales affichées en ascii par xauth).


Obtenir un formulaire de soumission de comptes rendus

5 Clé d’identification

Écrire le script etquecasaute qui produit automatiquement les arguments nécessaires au programme. Consulter la documentation sur xauth pour cela, et employer l'utilitaire sed pour effacer les informations inutiles.


Obtenir un formulaire de soumission de comptes rendus

6 Limitations

A ce stade, le programme écrit est assez proche de la commande xdpyinfo, il est inutile d'aller plus loin dans cette direction. Discuter en revanche les limites de cette méthode :
  1. en ce qui concerne les droits sur le fichier .Xauthority  ;
  2. en ce qui concerne la surveillance du réseau par un tiers.

En conclure qu'il est de nos jour impératif d'utiliser l'option -X de la commande ssh.
Obtenir un formulaire de soumission de comptes rendus

logo-spip E. Saint-James & F. Kordon - Master Informatique - UPMC Valid XHTML 1.0!
Calculé le 19 janvier 2021 à 10h54min