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 cat
ingresar un archivo de registro al terminal ocurre solo por accidente, pero registrar un archivo de grep
registro es bastante común. less
tal 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?
fuente
Respuestas:
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):
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í comoxterm
oscreen
. En mi sistema (compresión de Debian), xterm devuelve la cadena vacía por defecto (esto es controlado por elanswerbackString
recurso).ESC [ c
y amigos. El terminal responde conESC [ … 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).ESC P
).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\eP
es una clave válida ( Alt+ Shift+ P).ESC P + p …
yESC 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.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 informeESC [ 6 n
es de la forma donde y son secuencias de dígitos, y esto podría verse con algunos modificadores.ESC [ x ; y R
x
y
F3ESC [ … t
.ESC [ 2 0 t
eESC [ 2 1 t
incluyen la etiqueta y el título del icono de la ventana de terminal, respectivamente, y el atacante puede elegirlos.allowWindowOps
recurso o selectivamente a través deldisallowedWindowOps
recurso. Gnome-terminal en Ubuntu 10.04 implementa incluso las respuestas de título por defecto. No he comprobado otros terminales o versiones.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).
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
ioctl
llamadas para estos, sin embargo, esto habría requerido un código y utilidades adicionales para realizar estasioctl
llamadas 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
less
y sin el-r
o-R
la opción, o ver a travéscat -v
.fuente
No es tan simple; mucha gente tiene un código para establecer el
xterm
título como parte de la solicitud o etc., y por muy buenas razones (¡cualquiera que seashutdown
la 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).
fuente