¿Está utilizando cat -v una forma adecuada de sanear texto no confiable?

2

Es bien sabido que un terminal tiende a confiar en las cosas que se le imprimen a través de stdout / stderr, lo que hace que la salida de datos controlados por el atacante al terminal sea acción arriesgada . ¿Es el uso de cat -v una forma efectiva de sanear los datos no confiables que se enviarán al terminal? Mi modelo de amenaza asume que mi emulador de terminal, multiplexor de terminal o subsistema VT de Linux pueden ser vulnerables a la ejecución de código arbitrario si se imprimen datos maliciosos. Los datos controlados por un atacante pueden provenir de fuentes externas, como un sitio web o de un usuario menor, por ejemplo, cuando se ve un archivo como raíz que es propiedad de un usuario menor y potencialmente comprometido.

Algunos ejemplos de uso:

cat -v /home/lesseruser/evil.txt
curl -I example.com | cat -v
curl -s example.com/evil.txt | cat -v
telnet 198.51.100.98 23 | cat -v

De la sección 3.1 de la página de información de GNU de coreutils:

-v
--show-nonprinting
    Display control characters except for LFD and TAB using ^ notation
    and precede characters that have the high bit set with M-.

Desde el código fuente de src/cat.c , en la versión 8.28 de coreutils:

if (show_nonprinting)
  {
    while (true)
      {
        if (ch >= 32)
          {
            if (ch < 127)
              *bpout++ = ch;
            else if (ch == 127)
              {
                *bpout++ = '^';
                *bpout++ = '?';
              }
            else
              {
                *bpout++ = 'M';
                *bpout++ = '-';
                if (ch >= 128 + 32)
                  {
                    if (ch < 128 + 127)
                      *bpout++ = ch - 128;
                    else
                      {
                        *bpout++ = '^';
                        *bpout++ = '?';
                      }
                  }
                else
                  {
                    *bpout++ = '^';
                    *bpout++ = ch - 128 + 64;
                  }
              }
          }
        else if (ch == '\t' && !show_tabs)
          *bpout++ = '\t';
        else if (ch == '\n')
          {
            newlines = -1;
            break;
          }
        else
          {
            *bpout++ = '^';
            *bpout++ = ch + 64;
          }

        ch = *bpin++;
      }
  }

¿Está utilizando cat -v para sanear las entradas no confiables antes de imprimir para mi modelo de amenaza?

    
pregunta forest 21.12.2017 - 06:30
fuente

2 respuestas

2

Parece una medida de seguridad razonable para los cinturones y los tirantes, aunque probablemente obtendrá mejores respuestas en unix.stackexchange.com. Dicho esto, con mi sombrero de papel de aluminio (y altamente imaginativo) en mi sombrero,

  • Podría haber una vulnerabilidad en cat de la que no está al tanto (ya sea en el código que citó (presumiblemente, ch es un tipo de 8 bits sin firma pero, ¿qué sucede si no lo es y ch es negativo?) ?) o en alguna otra sección, por ejemplo donde se carga el archivo).
  • Su versión de cat podría estar comprometida para incluir una vulnerabilidad.
  • Podría haber una vulnerabilidad en el sistema de archivos, o en otras herramientas o en la tubería del shell, que se expone al cargar el archivo.
  • Podría haber una vulnerabilidad en su shell al pasar el nombre de archivo a cat (quizás el nombre de archivo está diseñado para exponer el error).
  • Usted (porque lo olvidó o porque fue engañado; o el usuario de cualquier secuencia de comandos / herramienta que está proporcionando) podría estar usando un conjunto de caracteres que no sea ASCII que incluya caracteres de control en el espacio {32..126}.
  • Todavía podría haber una vulnerabilidad en el shell al imprimir la salida (me estoy imaginando un error realmente extraño como 2 ^ n caracteres de tabulación consecutivos desbordan algo).
  • Podría haber una vulnerabilidad en una de las bibliotecas o intérpretes compartidos que carga su versión, o una futura, de cat .
  • Podría haber una vulnerabilidad en el método que usa para invocar cat (por ejemplo, si escribe un script de shell que examina el archivo primero).
  • El archivo podría contener información incorrecta, escrita de manera convincente para que lo creas.
respondido por el drewbenn 21.12.2017 - 07:39
fuente
0

Enviar los caracteres intr, susp, eof o quit (por defecto ^ C, ^ Z, ^ D y ^ \; consulte "stty -a") se eliminará de "cat" y la mayoría de las otras cosas en el shell.

Este ejemplo envía ^ Z (susp):

<pre style='background-color: #EEEEEE'>
# List mount points.
mount
<span style='font-size: 0px'>
&#26;
printf "\e[0;1;31mYOU HAVE BEEN OWNED.\e[0m\n"
</span>
# List USB devices.
lsusb
</pre>
    
respondido por el David A 31.12.2017 - 14:36
fuente

Lea otras preguntas en las etiquetas