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?