Los EXEC y los SYSTEM los carga el diablo
Hace unos meses, jugando con Kamailio, descubrí que un operador enviaba llamadas con un Call-ID (un campo interno de SIP que sirve para identificar a qué diálogo pertenece ese mensaje) erróneo que incluía comillas («), barras invertidas (\), comillas simples (‘), y arrobas (@) entre otros caracteres, de forma que, en principio todo funciona correctamente hasta que me dio por guardar ese parámetro dentro de una base de datos y descubrí que no se guardaban por ejecutar una cadena SQL incorrecta.
Me costó bastante descubrir el motivo de por qué esas llamadas no se guardaban, pero cuando por fín me di cuenta, aprendí la importancia de «sanitizar» cualquier información con la que vayamos a trabajar ya que, en cualquier momento podemos recibir una cadena malformada adrede para causar quién sabe qué.
Tras pasar todos los parámetros por una función que eliminaba caracteres extraños y verificaba que todo era correcto, empecé a pensar ¿y si un call-id, un dnid, un CallerID o un destino erróneo y malformado como el que yo recibí, apareciera como parámetro de un comando de ejecución? Las consecuencias podrían ser terribles.
Entonces apareció un mensaje en la lista de usuarios de Kamailio que coincidía justamente con lo que estaba evitando y es que un parámetro externo incluido dentro de una función de ejecución puede ser un grave problema de seguridad.
En Asterisk no son pocas las configuraciones que incluyen comandos de este tipo: Ejecuciones al finalizar una conversación para comprimir, mover o copiar la grabación de dicha conversación utilizando el caller id como parámetro, …. ¿y si el callerid fuese una cadena de inyección de código del tipo: «\nrm -rf /\n»? Es cierto que esa cadena nunca sería válida en el RFC y seguro que IEEE aparecería en sueños, pero la jugarreta se la haría bien.
Ya hablamos hace 13 años de cómo programar el dialplan de Asterisk para evitar este tipo de ataques malintencionados utilizando las funciones y aplicaciones de Asterisk en el artículo: Una nueva versión de Asterisk corrige el dialplan injection. En este caso el ataque permitía llamar a cualquier destino aunque el dialplan nos hubiera limitado el número al que llamar.