En Perl, el modo corrupto es una forma de hacer que nuestro código sea más seguro. Hace que nuestro programa sea más quisquilloso con los datos que recibe de una fuente externa. La fuente externa significa los usuarios, el sistema de archivos, el entorno, la información local y algunas llamadas al sistema. El modo corrupto se creó para situaciones en las que la seguridad era importante, como escribir programas Perl que ejecutan scripts raíz o CGI. Uno siempre debe usar el modo de contaminación en su guión CGI.
Algunas funciones causan problemas inesperadamente con datos incorrectos. Nos interesa asegurarnos de que el programa abra el archivo que queremos que abra y no otra cosa como un comando proporcionado por un usuario travieso.
Uso del método Taint()
Para activar el modo corrupto, solo usamos el indicador -T en nuestra línea hashbang.
#!/usr/bin/perl -wT
El modo corrupto se usa para realizar un seguimiento de los datos que provienen del usuario y evita hacer algo inseguro con ellos. Cuando está habilitado, Perl supervisa cada variable para comprobar si está contaminada o no. Los datos contaminados son cualquier dato que proviene de fuera del código.
Dado que cubre todo lo leído desde STDIN , así como todas las variables de entorno, incluye todo lo que un receptor de secuencias de comandos CGI de un servidor. Por lo tanto, impide que Perl permita que cualquier valor ingresado por el usuario se use en cualquiera de los comandos de Perl que afectan a los archivos externos.
El modo corrupto no permite que los datos externos a nuestra aplicación afecten nada externo a nuestra aplicación.
Taint() es una función del módulo Scalar::Util que se puede usar para verificar si una variable está contaminada o no y también cuyo uso desenstringría un mensaje de «Dependencia insegura».
Fuentes de Mancha()
Cada vez que hay una brecha de seguridad en un sistema determinado, primero se comprueba la superficie de ataque de un programa. La superficie de ataque es la parte del programa que está expuesta a un atacante.
Las fuentes corruptas son las ubicaciones en un programa donde se leen los datos de una fuente potencialmente riesgosa, incluidas cosas como variables ambientales, datos, archivos, servicios de red, etc.
Estos canales no verificados pueden ser utilizados por un atacante para desenstringr vulnerabilidades de seguridad o hacer que los problemas se bloqueen. Por lo tanto, para evitar eso, se lleva a cabo un análisis de corrupción. Es un método efectivo para reducir los factores de riesgo al permitirnos eliminar superficies de ataque explotables.
Eliminación de la mancha()
El modo contaminado habría sido tan restrictivo si no hubiera habido una forma de eliminar la contaminación de nuestros datos. Pero, por supuesto, uno no quiere descifrar los datos sin comprobar su seguridad. Afortunadamente, hay un comando en Perl que nos permite realizar ambas tareas. Perl no permite que una expresión que involucre valores contaminados se evalúe como un valor no contaminado.
Entonces, la única forma de eliminar una variable contaminada es realizando una operación de coincidencia de patrones en ella y luego extrayendo las substrings coincidentes. Si hacemos coincidir una variable con una expresión regular, las variables de coincidencia que corresponden al paréntesis coincidente no están contaminadas (como $1, $2, etc.).
Por ejemplo: si queremos que una variable contenga una dirección de correo electrónico, podemos extraer una copia no contaminada de la dirección de esta manera:
Perl
$mail_address=~/(\S+)\@([\w.-]+)/; $untainted_address = "$1\@$2";
Explicación: En el ejemplo anterior, el primer paréntesis que rodea (\w{1}[\w-.]*) coincide con uno o más caracteres de palabra, guiones y puntos con al menos un carácter de palabra antes que no contiene guiones ni períodos. Los paréntesis hacen que la primera coincidencia se asigne a $1 en Perl.
Luego, se hace coincidir un símbolo @. Finalmente, el segundo conjunto de paréntesis ([\w-.]+) coincide con más caracteres de palabras, guiones y puntos. El segundo partido se asigna a $2.
Por lo tanto, cuando la expresión regular tiene éxito, $1 será igual a la parte del nombre de usuario de la dirección de correo electrónico y $2 será igual a la parte del dominio.
Perl considera que estas variables son especiales porque Perl básicamente cree que, dado que estas variables resultaron de una expresión regular que habíamos configurado, hemos verificado explícitamente la validez de los datos en esa expresión regular. Por lo tanto, $1 y $2 no se consideran contaminados.
Eliminación de Taint() del entorno
La cuestión de qué datos están contaminados depende del entorno de ejecución. Por ejemplo, los datos de una base de datos pueden o no considerarse contaminados. Perl tiene un módulo DBI que tiene el atributo opcional que, cuando se establece, hace que todos los datos recibidos de la base de datos se consideren contaminados. Del mismo modo, hay conjuntos específicos de acciones que no deben realizarse en datos corruptos que dependen totalmente del entorno de ejecución.
De forma predeterminada, la importación de símbolos desde el módulo activa las comprobaciones de corrupción. Si desea utilizar este módulo sin necesidad de comprobar la contaminación (eliminar la contaminación del entorno), podemos hacerlo de las siguientes formas:
- Usando (permitir ejecutar sin -T).
# allow to run without -T use Taint qw(allow_no_taint); # default import list use Taint;
- Al no importar ningún símbolo pasando explícitamente una lista de importación vacía.
# importing no symbols use Taint ();
Un programa básico que muestra la implementación del modo taint:
Perl
# Showing how a variable assigned to # a tainted value gets tainted itself too: #!/usr/bin/perl -T my $arg = $ARGV[0]; my $file = "/home/foo/$arg"; open FOO, ">$file" or die $!; print FOO "Yay\n"; close FOO; exit 0;
Este programa fallará con el siguiente error:
Insecure dependency in open while running with -T switch at ./test.pl line 9.
Publicación traducida automáticamente
Artículo escrito por vishalraina y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA