Est-il sécuritaire de chatter un fichier arbitraire?


77

Parfois, lorsque j’ai catun fichier binaire par erreur, mon terminal est déformé. Rien de plus simple resetne peut réparer, mais un attaquant ne pourrait-il théoriquement pas créer un fichier qui, lorsqu'il est affiché sur un terminal, exécuterait du code arbitraire? Par un exploit dans l'émulateur de terminal ou autrement.


3
Parfois, lorsque je le fais, mon shell dit à la fin "<garbage> unknown command". Cela me fait me demander si cela est réellement possible.
Keith

5
Il y a eu des exploits pour l'émulateur de terminal, par exemple linuxsecurity.com/content/view/104657 ou securityfocus.com/bid/6936/discuss , il n'est donc pas nécessaire de disposer d'un coffre
Ulrich Dangel le

1
C'est pourquoi il est préférable d'utiliser quelque chose qui va bousiller les fichiers binaires (comme more) ou qui est terminal-aware ( less) pour examiner le contenu des fichiers. Non seulement cela ne mettra pas votre terminal dans un état bizarre, mais tout le fichier ne passera pas d'un seul coup.
Blrfl

La stty sanecommande réinitialise un xterm (ou similaire) qui a été commuté, par exemple dans un jeu de caractères différent.
Thorbjørn Ravn Andersen

moshdocumentation a quelques idées à ce sujet: mosh.mit.edu/#techinfo
Max Ried

Réponses:


34

L'exploitation de cette sortie dépend du programme du terminal et de ce que ce terminal fait en fonction des codes d'échappement envoyés. Je ne suis pas au courant de programmes de terminal ayant de telles fonctionnalités exploitables, et le seul problème serait maintenant s'il y avait un débordement de mémoire tampon inconnu ou quelque chose du genre, qui pourrait être exploité.

Avec certains hardwareterminaux plus anciens , cela peut poser problème en programmant, par exemple, des touches de fonction avec ce type de séquence d'échappement, en stockant une séquence de commande pour cette clé dans le matériel. Vous aurez toujours besoin d'un appui physique sur la touche pour l'activer.

Mais il y a toujours (comme Hauke ​​l'a si bien marqué "braindead") des personnes désireuses d'ajouter une telle fonctionnalité si elle résout un problème pour elles, ne comprenant pas l'échappatoire qu'elles créent. D'après mon expérience avec les logiciels open source, à cause des nombreux yeux qui regardent le code, cela est moins susceptible de se produire que pour les sources fermées. (Je me souviens que dans le programme de messagerie d'Irix de Silicon Grahpics, vous pouviez inclure des commandes à exécuter sur la machine du récepteur, des chemins réels vers les exécutables, ....)


3
"vous pouvez inclure des commandes à exécuter sur la machine du destinataire" Vous voulez dire quelque chose comme inclure dans un email VBScript qui appelle à l'hôte de script Windows? :)
un CVn

Non, vous pouvez lancer un exécutable déjà présent sur la machine, comme si vous jouiez un son. Je ne me souviens pas de la syntaxe exacte (c'était il y a presque 20 ans) ni de la possibilité de désactiver cette fonctionnalité dans une configuration. Nous nous sommes amusés avec la lecture automatique de vidéos stockées sur notre réseau.
Anthon

Tu ne parles pas de NeWS, n'est-ce pas? Le SGI de l'IIRC a été l'un des derniers casiers.
luser droog

@luserdroog Non, il s'agissait du programme de messagerie basé sur une interface graphique standard sous Irix
Anthon le

1
@ Anthony Je ne sais pas si c'est toujours possible, mais la possibilité d'utiliser des codes d'échappement pour qu'un terminal répète le texte qui lui est transmis depuis la writecommande, ce qui permet d'exécuter des commandes / scripts en tant qu'utilisateur propriétaire du terminal. C'est soi-disant la raison pour laquelle beaucoup recommandent de désactiver les messages mesg -npour les utilisateurs la plupart du temps et pour root toujours . D'après les informations dont je dispose, cela a été fait - bien que je ne sache pas si cela a déjà été exploité. Donc texte aléatoire à partir d' un catexécutable ted, pourrait peut-être exécuté.
Baard Kopperud

33

La plupart des émulateurs de terminaux renvoient une réponse s'ils reçoivent certaines séquences d'échappement (consultez la documentation sur les séquences de contrôle xterm ). Par exemple, vous pouvez envoyer \e[0cà un émulateur de type VT100 et celui-ci renverra les attributs du périphérique, quelque chose comme \e[?1;2c (C’est probablement ce que Keith a observé). Mais ces réponses ne sont pas des chaînes arbitraires. Néanmoins, avoir un exécutable nommé 2cquelque part sur votre système qui fait quelque chose de fatal est une mauvaise idée.

Mise à jour: les risques sont en fait plus importants que je ne le pensais, en raison de la possibilité de définir le titre d'une fenêtre xterm et de le renvoyer à l' aide de séquences d'échappement appropriées ( http://www.securityfocus.com/bid/6940/ ) . Contrairement à l'exemple ci-dessus, le titre peut être une chaîne presque arbitraire.


Cela coupe déjà très près.
Gunchars

Il existe une fonctionnalité encore plus ancienne - le "message de réponse", envoyée en réponse au caractère ENQ (Ce). Sur un vrai VT100, il est défini par l'utilisateur dans le menu Configuration du terminal. il y a peut-être des émulateurs de terminaux qui permettent de le régler à distance ...
sendmoreinfo

16

Cela change le titre du terminal dans GNOME Terminal 3.6.1, à moins qu’il ne soit remplacé par quelque chose comme PS1 :

printf "\033]2;Script Kiddie was here\007"

Ouvrez maintenant une nouvelle fenêtre du terminal GNOME pour tester la catversion:

printf "\033]2;Script Kiddie was here\007" > test.bin
cat test.bin

Oui, cela définit également le titre du terminal.

Il y avait un problème de sécurité avec un code d'échappement qui entraînait l'impression du titre sur la ligne de commande . Vous pouviez ainsi créer un fichier qui, une fois catéd, serait imprimé (je ne suis pas sûr que vous puissiez y insérer une nouvelle ligne). commandes arbitraires. Aie!


8

Bien que l'utilisation catn'entraîne pas forcément l'exécution de code, les codes d'échappement seront traités de sorte que vous pourriez facilement être induit en erreur en pensant que le script est inoffensif alors qu'il est malveillant.

Voici un exemple de commande que vous pouvez exécuter et qui va créer un script shell "malveillant":

echo -e '#!/bin/sh\necho "...doing something bad here..."\nexit\n\033[A\033[Aecho "Hello dear reader, I am just a harmless script, safe to run me!"' > demo.sh
chmod a+x demo.sh

Lorsque vous inspectez le fichier, cela semble assez inoffensif:

$ cat demo.sh
#!/bin/sh
echo "Hello dear reader, I am just a harmless script, safe to run me!"

Mais devriez-vous réellement l'exécuter ...

$ ./demo.sh 
...doing something bad here...

Le script fonctionne en incluant des codes d'échappement bruts pour déplacer le curseur de quelques lignes vers le haut, de sorte que le reste du script soit écrit au-dessus du code malveillant, en le masquant.

Presque tout autre programme révélera le script correspondant. Seuls les programmes qui ne traitent pas le contenu du fichier (comme cat, moreet less -r) produiront une sortie trompeuse.

Notez cela tailet headproduisez également le même résultat trompeur. Utiliser "less + F" est donc plus sûr que "tail -f".


C'est assez problématique ... Vous pouvez voir ce qui se passe réellement en lançant echo $(cat demo.sh), cat demo.sh | grep . --color=yes(Note: --color=yesc'est ce qui montre le code "malveillant" ici) ou le build-in cat -v demo.sh.
Charlie

Vrai ou faux, c'est une réponse à une question différente: à quel point catle contenu du fichier est-il fiable ?
Incnis Mrsi

@IncnisMrsi: Ce n'est pas vraiment une réponse à une question différente. Cette réponse avertit que cat affichera les codes d'échappement et fournit un exemple simple avec un seul type de code d'échappement, mais il en existe beaucoup d'autres. Combinés à certains terminaux, ceux-ci peuvent remapper des clés, écraser des fichiers et, en théorie, même exécuter des commandes . Donc, une fois que vous vous rendrez compte du danger d'affichage des codes d'échappement, vous comprendrez que cela peut parfois être dangereux pour catun fichier arbitraire, comme l'a demandé la question!
Malvineous

6

J'ai certainement expérimenté l' xterminsertion de caractères arbitraires en soi, comme si je les avais dactylographiés. Et à l'occasion, cela a apparemment inclus un caractère de nouvelle ligne, de sorte que j'ai eu ngwerm:0riu: command not foundcomme réponse. Je ne vois aucune raison pour laquelle quelqu'un ne pourrait pas créer un fichier qui enverrait des commandes spécifiques nuisibles. Alors oui, au moins certains terminaux sont susceptibles d'attaques ayant un impact arbitraire.


2

Un émulateur de terminal affiche simplement les caractères qui lui sont envoyés.

Toute autre chose que simplement imprimer un caractère sur la position actuelle, telle que définir une nouvelle position, changer de couleur, changer de titre, etc., est réalisée à l'aide de séquences d'échappement.

L'ensemble de séquences d'échappement prises en charge est généralement constitué de normes bien définies, telles que ANSI , qui ne définissent pas le moyen de démarrer d'autres processus. Bien qu'il soit possible d'implémenter une telle séquence, je ne suis au courant d'aucun émulateur de terminal permettant intentionnellement de telles choses.

En théorie, un bug tel qu'un débordement de tampon pourrait être utilisé pour déclencher des fonctionnalités arbitraires. Mais cela serait possible dans à peu près n'importe quel autre binaire.


0

En général, il n’ya généralement aucun risque de gérer un fichier arbitraire. Ma méthode habituelle pour analyser un fichier est la suivante:

$ file <mystery file>
$ strings <mystery file> | less

Ce qui précède me permet de déterminer le type d’un fichier à l’aide de la filecommande, laquelle stringsme permet de vider toutes les chaînes identifiables de fichiers binaires potentiels dont je ne suis pas sûr au sujet de leur lignage.

exemple

sortie de fichier
$ file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, stripped
sortie de chaînes
$ strings /bin/ls|less
...
across
vertical
single-column
force
never
auto
if-tty
slash
%b %e  %Y
%b %e %H:%M
long-iso
main
posix-
sort_files
?pcdb-lswd
dev_ino_pop
Try `%s --help' for more information.
Usage: %s [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort.
Mandatory arguments to long options are mandatory for short options too.
  -a, --all                  do not ignore entries starting with .
  -A, --almost-all           do not list implied . and ..
...

3
L'exécution de chaînes sur un fichier inconnu peut également avoir des conséquences problématiques. lcamtuf.blogspot.fi/2014/10/…
Jan Wikholm

@IncnisMrsi - lisez la première phrase !!!!
slm

OK, j'écarte mes propos précédents. La réponse est courte. Elle utilise une terminologie déroutante, sans fondement et à l’évidence incomplète. Notez qu'en sécurité, «arbitraire» ≠ aléatoire tel que distribué dans votre système d'exploitation préféré.
Incnis Mrsi
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.