¿Cómo evitar ataques de secuencia de escape en terminales?

29

Al leer los detalles de CVE-2009-4487 (que trata sobre el peligro de las secuencias de escape en los archivos de registro) , estoy un poco sorprendido.

Para citar CVE-2009-4487 :

nginx 0.7.64 escribe datos en un archivo de registro sin desinfectar los caracteres no imprimibles, lo que podría permitir a los atacantes remotos modificar el título de una ventana, o posiblemente ejecutar comandos arbitrarios o sobrescribir archivos, a través de una solicitud HTTP que contiene una secuencia de escape para un emulador de terminal.

Claramente, esto no se trata realmente de un agujero de seguridad en nginx, sino de los emuladores de terminal.

Claro, tal vez catingresar un archivo de registro al terminal ocurre solo por accidente, pero registrar un archivo de grepregistro es bastante común. lesstal vez desinfecta las secuencias de escape, pero quién sabe qué comandos de shell no cambian las secuencias de escape ...

Tiendo a estar de acuerdo con la respuesta de Varnish :

La sabiduría de los escapes de respuesta terminal en general se ha cuestionado a intervalos regulares, pero ninguno de los principales programas de emulación de terminal ha considerado adecuado descartar estas secuencias, probablemente en un intento equivocado de compatibilidad con la tecnología de 1970 ya no utilizada. [..] En lugar de culpar a todos y cada uno de los programas que escriben archivos de registro, sería mucho más productivo, desde el punto de vista de la seguridad, lograr que los programas de emulación de terminal dejen de hacer cosas estúpidas, y así solucionar este y otros problemas de seguridad una vez y para todos

Así mis preguntas:

¿Cómo puedo asegurar mi xterm, de modo que ya no sea posible ejecutar comandos o sobrescribir archivos a través de secuencias de escape?

¿Qué emuladores de terminal para X están protegidos contra este ataque?

maxschlepzig
fuente
44
Muchas secuencias de escape hacen cosas legítimas (renombrar / redimensionar / etc un xterm). Pero, ¿alguien puede identificar secuencias de escape que ejecutan comandos o sobrescriben archivos ?
Krubo
Problema similar con respecto a los ataques de pegar-control-caracteres-desde-navegador web en Security SE: ¿Cómo puedo protegerme de este tipo de abuso del portapapeles? tl; dr: si está utilizando un terminal basado en xterm / vte lanzado después de 2013/2015, está protegido contra esto, ya que están filtrando caracteres de control, de forma predeterminada.
maxschlepzig

Respuestas:

27

Los terminales VT100 (que todos los emuladores de terminales modernos emulan en cierta medida) admitían una serie de comandos problemáticos, pero los emuladores o distribuciones modernos desactivan los más problemáticos y los menos útiles. Aquí hay una lista no exhaustiva de secuencias de escape potencialmente riesgosas (sin incluir las que simplemente hacen que la pantalla sea ilegible de alguna manera):

  • Los comandos arbitrarios del archivo de registro en rxvt y Eterm informados por HD Moore . De hecho, estos son errores importantes, afortunadamente corregidos durante mucho tiempo.
  • El comando de respuesta, también conocido como Estado del terminal de retorno, invocado por ENQ( Ctrl+E). Esto inserta texto en el terminal como si el usuario lo hubiera escrito. Sin embargo, este texto no está bajo el control del atacante: es el nombre del terminal, típicamente algo así como xtermo screen. En mi sistema (compresión de Debian), xterm devuelve la cadena vacía por defecto (esto es controlado por el answerbackStringrecurso).
  • Los comandos Enviar atributos del dispositivo ESC [ cy amigos. El terminal responde con ESC [ … c(donde pueden contener dígitos y signos de puntuación ASCII solamente). Esta es una forma de consultar algunas capacidades del terminal, en su mayoría obsoletas, pero tal vez utilizadas por aplicaciones antiguas. Nuevamente, la respuesta del terminal es indistinguible de la entrada del usuario, pero no está bajo el control del atacante. La secuencia de control puede parecer una tecla de función, pero solo si el usuario tiene una configuración inusual (ninguna de las configuraciones habituales que he encontrado tiene una secuencia de escape de tecla de función válida que es un prefijo de la respuesta del terminal).
  • Las diversas funciones de control del dispositivo (DCS escapa, empezando por ESC P).
    • No sé qué daño se puede hacer mediante DECUDK(establecer claves definidas por el usuario) en un emulador de terminal típico.
    • DECRQSS(Solicitar cadena de estado) es otro comando al que el terminal responde con una secuencia de escape, esta vez comenzando con \eP; Esto puede ser problemático ya que \ePes una clave válida ( Alt+ Shift+ P).
    • Xterm tiene dos características experimentales más: ESC P + p …y ESC P + q …, para obtener y establecer cadenas termcap. De la descripción, esto podría usarse al menos para modificar el efecto de las teclas de función.
  • Varios comandos de informe de estado: ESC [ … n(Informe de estado del dispositivo). El terminal responde con una secuencia de escape. La mayoría de estas secuencias de escape no corresponden a secuencias de escape de teclas de función. Uno parece problemático: el informe ESC [ 6 nes de la forma donde y son secuencias de dígitos, y esto podría verse con algunos modificadores.ESC [ x ; y RxyF3
  • Comandos de manipulación de ventanas ESC [ … t.
    • Algunos de estos permiten cambiar el tamaño de la ventana xterm, iconificarla, etc., lo cual es perjudicial.
    • Algunos de estos hacen que el terminal responda con una secuencia de escape. La mayoría de estas secuencias de escape parecen de bajo riesgo, sin embargo, hay dos comandos peligrosos: las respuestas ESC [ 2 0 te ESC [ 2 1 tincluyen la etiqueta y el título del icono de la ventana de terminal, respectivamente, y el atacante puede elegirlos.
    • Al menos bajo compresión de Debian, xterm ignora estos comandos por defecto; pueden habilitarse configurando el allowWindowOpsrecurso o selectivamente a través del disallowedWindowOpsrecurso. Gnome-terminal en Ubuntu 10.04 implementa incluso las respuestas de título por defecto. No he comprobado otros terminales o versiones.
  • Comandos para configurar el título del terminal o el nombre del icono. Bajo xterm y la mayoría de los otros terminales X, están . Debajo de la pantalla, la secuencia de escape es . Encuentro la preocupación sobre estos comandos sobrevalorada. Si bien permiten cierta cantidad de travesuras, cualquier página web tiene el mismo problema. Actuar en una ventana basada únicamente en su título y no en su clase es similar a abrir un archivo cuyo nombre le fue dado por una parte que no es de confianza, o no citar una expansión variable en un script de shell o dar palmaditas en la nariz a un perro rabioso - No te quejes si te muerden.ESC ] digit ; title ESC \ESC k title ESC \

Encuentro la respuesta de Varnish falsa. Se siente como si estuviera tratando de cambiar la culpa, o en el modo nazi de seguridad (cualquier preocupación de seguridad, genuina o no, justifica una característica de blackball).

La sabiduría de los escapes de respuesta terminal en general se ha cuestionado a intervalos regulares, pero ninguno de los principales programas de emulación de terminal ha considerado adecuado descartar estas secuencias, probablemente en un intento equivocado de compatibilidad con la tecnología de 1970 ya no utilizada. (...)
En lugar de culpar a todos y cada uno de los programas que escriben archivos de registro, sería mucho más productivo, desde el punto de vista de la seguridad, lograr que los programas de emulación de terminal dejen de hacer cosas estúpidas y, de este modo, solucionen este y otros problemas de seguridad una vez y para todos.

Muchas de las respuestas son características útiles: una aplicación necesita saber cosas como la posición del cursor y el tamaño de la ventana. Establecer el título de la ventana también es muy útil. Sería posible confiar completamente en las ioctlllamadas para estos, sin embargo, esto habría requerido un código y utilidades adicionales para realizar estas ioctlllamadas y realizar transacciones en texto de estilo unix que pasa los descriptores de archivo. Cambiar estas interfaces ahora sería mucho trabajo, por poco beneficio.

Se supone que los archivos de texto no contienen caracteres que no se imprimen, como los caracteres de control. Generalmente se espera que los archivos de registro sean archivos de texto. Los archivos de registro no deben contener caracteres de control.

Si usted está preocupado de que un archivo puede contener secuencias de escape, abrirlo en un editor, o verlo con lessy sin el -ro -Rla opción, o ver a través cat -v.

Gilles 'SO- deja de ser malvado'
fuente
2
"Sería posible confiar completamente en las llamadas de ioctl para estas" ¿Pero qué pasa si realmente hay un cable serial entre la aplicación y el terminal?
mmv-ru
5

No es tan simple; mucha gente tiene un código para establecer el xtermtítulo como parte de la solicitud o etc., y por muy buenas razones (¡cualquiera que sea shutdownla máquina incorrecta desde la ventana de terminal incorrecta puede decírselo!). Por lo tanto, corregirlo correctamente implica introducir contextos de seguridad y, por lo tanto, complicar seriamente la interacción entre los shells y los emuladores de terminal y probablemente también los archivos de puntos de las personas. O puede optar por la solución de bajo alquiler de desinfectar cualquier cosa que pueda mostrarse en una terminal; esto se reduce en gran medida a los caracteres de control de escape, lo que probablemente debería hacerse de todos modos solo para que se destaquen (ya que en un archivo de registro pueden indicar que alguien está tratando de inyectar shellcode).

(Por otro lado, punycode es una instancia más severa del mismo tipo de problema, y ​​sin embargo se ha convertido en un estándar oficial. A veces la seguridad se reduce a mitigar los diseños inseguros que están fuera del control de uno).

geekosaur
fuente
1
Un término x podría permitir cambiar el título a través de secuencias de escape, pero no permitir sobrescribir archivos y ejecutar comandos arbitrarios a través de secuencias de escape. Eso sería un paso adelante, ¿no?
maxschlepzig
1
Las formas directas de hacerlo han estado deshabilitadas durante años. Aún quedan formas indirectas, aunque al menos requieren un paso adicional (es decir, un ataque de ingeniería social para que el usuario invoque una tecla de función reprogramada). Pero la barra de título se llamó específicamente en el CVE, presumiblemente como parte de un ataque que confunde a un usuario para hacer algo en el lugar equivocado. La mayor preocupación moderna es algo que puede ser programado para enviar un texto arbitrario a una concha, y answerbacks que permiten a un atacante averiguar cuál es el emulador de terminal se puede hacer para hacer ...
geekosaur
... pero eso, pace Varnish, casi con toda seguridad todavía se usa en entornos comerciales grandes donde el software tiene un puerto mínimo y se necesita mucho más que simplemente extraer dientes para obtener los cambios apropiados.
geekosaur