¿Se enseña diseño seguro en Ingeniería Informática?
La pregunta definitiva sobre ciberseguridad
Como estudiante de tercer curso de Ingeniería Informática en una conocida universidad de Madrid, y como persona con inquietudes sobre la ciberseguridad, no puedo evitar llevarme las manos a la cabeza cada vez que se trata de forma incorrecta esta materia, o cada vez que no se enseña sobre ciberseguridad.
Desde luego se han hecho progresos enormes en los últimos años. Disponemos de una asignatura dedicada a la seguridad estructural y de las redes. La universidad no manda a la policía a tu casa si encuentras vulnerabilidades en sus sistemas, sino que te recompensa por ello con una carta de agradecimiento.
Pero, cuando hablamos del estudiante medio de Ingeniería Informática… ¿podemos decir que este se beneficia de dichas políticas? ¿o sigue perdido en materia de ciberseguridad? ¿se enseña a desarrollar (programar) de forma segura?
mytar Laboratorio 1: caso de estudio
Nuevo curso, me matriculo en la asignatura Sistemas Operativos. Llega nuestra primera práctica. He aquí el enunciado, que debemos programar en el lenguaje C en Linux:
In this assignment the student must create a command line tool called “mytar”,This tool must be able to create a tarball archive containing several files, or to extract the files from a previously created tarball.
Después de pelearme un par de días con ella, la termino y entrego.
Durante el desarrollo de esta práctica recuerdo lo bonito (pero dificil) que es trabajar en C; gestión de memoria, buffer overflows, principalmente. Sé que el código de muchos de mis compañeros tiene estos fallos, y es normal, pues muchos acaban de introducirse a C (es la primera o segunda vez que lo vemos en la carrera). Primer tipo de vulnerabilidad encontrada, es un clásico, y nadie nos ha advertido sobre ellas.
Sin embargo, si eres jugador habitual de CTFs (Capture The Flag) tal vez hayas pensado en otro tipo de vulnerabilidad que puede ser causada o encontrada en el programa mytar que hemos tenido que desarrollar.
El nombre Zip Slip.. ¿te suena familiar?
Nuestro programa mytar posee una vulnerabilidad QUE LLEVA CASI 30 AÑOS entre nosotros. Y es que la especificación del formato .tar de nuestra prática, aunque simplificado casi al extremo, sigue sin tener en cuenta la seguridad.
Os dejo un extracto del código de mi prática, y os doy una pista. Nuestro programa mytar no comprueba la ruta de los archivos que va a extraer ¿podéis identificar el problema?:
//Abrimos el archivo a extraer con su nombre de archivo
FILE *subfile = fopen(descriptorList[i].name,"wb");
//Extraemos los datos del archivo
copynFile(tarfile, subfile, descriptorList[i].size);
//Cerramos archivo
fclose(subfile);
En la primera línea, utilizamos el nombre de archivo (o ruta) que se encuentra en el archivo comprimido con formato .tar, para crear el archivo que vamos a extraer.
¿Qué ocurre si nuestro archivo .tar es malicioso y contiene el siguiente archivo a extraer?
../../../../var/www/index.html
Vamos a despiezar esta ruta de archivo. En primer lugar tenemos lo siguiente:
../../../../
Esto hace que subamos de directorio. En este caso 4 veces.
/var/www/index.html
Finalmente el archivo se escribe en el directorio especificado, pero partiendo desde el directorio raíz /
si hemos ido hacia atrás lo suficiente. El código que se ejecutaría seria similar a:
fopen("../../../../var/www/index.html","wb");
En el caso de servidores Linux, y especialmente servidores web, la ruta /var/www/ suele contener los datos de nuestra web. En este caso, descomprimir el archivo malicioso haría que se sobreescribiese el index o página de inicio del servidor, por el archivo malicioso del atacante (que podría minar criptomonedas,ejecutar código en el navegador de los usuarios que visiten la web, etc).
Archivo tar malicioso malformado.
En el caso de la correción de la práctica, algunos profesores llegan a ejecutar el programa en sus ordenadores con una serie de tests para comprobar su funcionamiento. Como veis la superficie de ataque es preocupante en esta prática y en muchas otras.
Conclusiones + Referencias
Una simple búsqueda en Google me muestra que esta práctica lleva haciéndose varios años en la facultad. Ha sido revisada por varios profesores pero este problema grave de diseño no ha sido encontrado.
Este fallo no existe solo para el formato .tar, también ocurre con el formato .zip puesto que la especificación del formato lo permite. Es antigua, y no fue creada con la seguridad en mente.
Si queréis conocer un poco más sobre la historia de estas vulnerabilidad y como llevan entre nosotros desde 1991, os dejo el siguiente vídeo (en inglés), que también trata otras variaciones del ataque, como los symlinks:
Zip Vulnerabilities.