¿Qué tan seguro es capturar un archivo arbitrario?


77

A veces, cuando catpor error tengo un archivo binario, mi terminal se ve mal. Nada que un rápido resetno pueda solucionar, pero ¿no podría un atacante crear teóricamente un archivo que, cuando se muestra en un terminal, ejecutaría algún código arbitrario? A través de un exploit en el emulador de terminal o de otra manera.


3
A veces, cuando hago eso, mi shell dirá al final "<desconocido> comando desconocido". Eso me hace preguntarme si esto es realmente posible.
Keith

55
Había exploits para el emulador de terminal, por ejemplo linuxsecurity.com/content/view/104657 o securityfocus.com/bid/6936/discuss lo que no es necesario seguro particular,
Ulrich Dangel

1
Esta es la razón por la cual es mejor usar algo que obstaculice los archivos binarios (como more) o que sea compatible con la terminal ( less) para examinar el contenido de los archivos. No solo no pondrá su terminal en un estado extraño, sino que todo el archivo no saldrá volando de una sola vez.
Blrfl

El stty sanecomando restablece un xterm (o similar) que se ha cambiado, por ejemplo, a un conjunto de caracteres diferente.
Thorbjørn Ravn Andersen

moshla documentación tiene algunas ideas al respecto: mosh.mit.edu/#techinfo
Max Ried

Respuestas:


34

El hecho de que dicha salida pueda explotarse depende del programa del terminal y de qué hace ese terminal según los códigos de escape que se envían. No conozco los programas de terminal que tienen características tan explotables, y el único problema ahora sería si hay un desbordamiento de búfer desconocido o algo así, que podría explotarse.

Con algunos hardwareterminales más antiguos esto podría ser un problema ya que programó, por ejemplo, teclas de función con este tipo de secuencias de escape, almacenando una secuencia de comandos para esa tecla en el hardware. Aún necesitaría presionar una tecla física para activar eso.

Pero siempre hay (como Hauke ​​marcó tan acertadamente como "cerebro muerto") personas dispuestas a agregar una característica de este tipo si les resuelve un problema, sin comprender la laguna que crean. En mi experiencia con el software de código abierto es que, debido a los muchos ojos que miran el código, es menos probable que esto suceda como con el código cerrado. (Recuerdo que en el programa de correo de Irix de Silicon Grahpics, a mediados de los noventa, podría incluir comandos para ejecutar en la máquina receptora, rutas reales a los ejecutables, ...)


3
"podría incluir comandos para que se ejecuten en la máquina receptora" ¿ Quiere decir algo como incluir en un correo electrónico VBScript que llama al Windows Scripting Host? :)
un CVn

No exactamente, podría iniciar un ejecutable que ya estaba en la máquina, como reproducir un sonido. No recuerdo la sintaxis exacta (que era hace casi 20 años) ni si podía desactivar esa 'característica' en una configuración. Aunque nos divertimos un poco con los videos de reproducción automática almacenados en nuestra red.
Anthon

No estás hablando de NeWS, ¿verdad? IIRC SGI fue uno de los últimos hold-outs.
luser droog

@luserdroog No, este era el programa de correo estándar basado en GUI bajo Irix
Anthon

1
@Anthon No estoy seguro de si todavía es posible, pero existe la posibilidad de usar códigos de escape para que un terminal "repita" el texto que le llega desde el writecomando, ejecutando así comandos / scripts como el usuario que posee el terminal. Supuestamente es la razón por la que muchos recomiendan desactivar los mensajes mesg -npara los usuarios la mayor parte del tiempo y para root siempre . AFAIK, esto realmente se hizo, aunque no sé si alguna vez fue explotado. Así texto al azar de un catejecutable ted, podría quizás ser ejecutado.
Baard Kopperud

33

La mayoría de los emuladores de terminal enviarán alguna respuesta, si reciben ciertas secuencias de escape (eche un vistazo a la documentación de secuencias de control xterm ). Por ejemplo, puede enviar \e[0ca un emulador similar a VT100 y devolverá los atributos del dispositivo, algo así como \e[?1;2c (Esto es probablemente lo que observó Keith). Pero estas respuestas no son cadenas arbitrarias. Aún así, tener un ejecutable nombrado en 2calgún lugar de su sistema que haga algo fatal es una mala idea.

Actualización: los riesgos son, de hecho, mayores de lo que pensaba, debido a la posibilidad de establecer el título de una ventana xterm y enviar el título utilizando secuencias de escape apropiadas ( http://www.securityfocus.com/bid/6940/ ) . A diferencia del ejemplo anterior, el título puede ser una cadena casi arbitraria.


Eso ya lo está cortando muy cerca.
Gunchars

Hay una característica aún más antigua: 'mensaje de respuesta', enviado en respuesta al carácter ENQ (Ce). En un VT100 real, el usuario lo configura en el menú de CONFIGURACIÓN del terminal; tal vez hay emuladores de terminal que permiten configurarlo de forma remota ...
sendmoreinfo

16

Esto cambia el título del terminal en GNOME Terminal 3.6.1, a menos que sea anulado por algo como PS1 :

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

Ahora abra una nueva ventana de Terminal de GNOME para probar la catversión:

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

Sí, esto también establece el título del terminal.

Solía ​​haber un problema de seguridad con un código de escape que daba como resultado que el título se imprimiera en la línea de comando , por lo que podría crear efectivamente un archivo, que cuando cated se imprima (no estoy seguro de si podría poner una nueva línea allí) comandos arbitrarios ¡Ay!


8

Si bien el uso catpuede no dar lugar a la ejecución del código, los códigos de escape se procesarán para que pueda engañarse fácilmente al pensar que el script es inofensivo cuando de hecho es malicioso.

Aquí hay un comando de ejemplo que puede ejecutar que creará un script de shell "malicioso":

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

Cuando inspeccionas el archivo, parece bastante inofensivo:

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

Pero si realmente lo ejecutas ...

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

El script funciona al incluir códigos de escape sin procesar para mover el cursor hacia arriba un par de líneas, por lo que el resto del script se escribe sobre la parte superior del código malicioso, ocultándolo.

Casi cualquier otro programa revelará el guión de lo que es. Solo los programas que no procesan el contenido del archivo (como cat, morey less -r) producirán resultados engañosos.

Tenga en cuenta que taily headtambién produce la misma salida engañosa. Usar "menos + F" es, por lo tanto, más seguro que "tail -f".


Esto es muy problemático ... Se puede ver lo que está sucediendo realmente ejecutando echo $(cat demo.sh), cat demo.sh | grep . --color=yes(Nota: el --color=yeses lo que se muestra el código "malicioso" aquí) o la acumulación en cat -v demo.sh.
Charlie

Verdadero o falso, es una respuesta para una pregunta diferente: cuán confiable es catmostrar el contenido del archivo .
Incnis Mrsi

@IncnisMrsi: No es realmente una respuesta para una pregunta diferente. Esta respuesta advierte que cat mostrará códigos de escape y proporciona un ejemplo simple con solo un tipo de código de escape, pero hay muchos otros. Cuando se combina con ciertos terminales, estos pueden reasignar teclas, sobrescribir archivos y, en teoría, incluso ejecutar comandos . Entonces, una vez que se dé cuenta del peligro de mostrar códigos de escape, comprenderá que a veces puede ser inseguro para catun archivo arbitrario, como se hizo la pregunta.
Malvineous

6

Definitivamente he experimentado la xterminserción de caracteres arbitrarios en sí mismo como si los hubiera escrito. Y en ocasiones esto aparentemente ha incluido el carácter de nueva línea, por lo que obtuve ngwerm:0riu: command not foundcomo respuesta. No veo ninguna razón por la que alguien no pueda crear un archivo que envíe comandos específicos y dañinos. Entonces sí, al menos algunas terminales son susceptibles a ataques con impacto arbitrario.


2

Bueno, un emulador de terminal básicamente simplemente imprime los caracteres que se le envían.

Cualquier cosa además de simplemente imprimir un personaje en la posición actual, como establecer una nueva posición, cambiar el color, cambiar el título, etc., se realiza mediante secuencias de escape.

El conjunto de secuencias de escape compatibles generalmente consta de estándares bien definidos como ANSI , que no define una forma de iniciar otros procesos. Aunque sería posible implementar tal secuencia, no conozco ningún emulador de terminal que permita intencionalmente tales cosas.

En teoría, un error como un desbordamiento del búfer podría usarse para activar una funcionalidad arbitraria. Pero esto también sería posible en prácticamente cualquier otro binario.


0

En general, generalmente no hay riesgo de atrapar un archivo arbitrario. Mi método habitual para analizar un archivo es hacer lo siguiente:

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

Lo anterior me permite determinar el tipo de archivo a través del filecomando y el stringscomando me permite volcar cualquier cadena identificable de los posibles archivos binarios que no estoy seguro acerca de su linaje.

ejemplo

salida de archivo
$ 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
salida de cadenas
$ 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
ejecutar cadenas en un archivo desconocido también puede tener consecuencias problemáticas. lcamtuf.blogspot.fi/2014/10/…
Jan Wikholm

@IncnisMrsi - ¡lee la primera oración!
slm

OK, retractando mi declaración anterior, la respuesta es corta, usando una terminología confusa, infundada y evidentemente incompleta. Tenga en cuenta que, en seguridad, "arbitrario" ≠ aleatorio como se distribuye en su sistema operativo favorito.
Incnis Mrsi
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.