Lo más crítico en la seguridad de un sistema de información son los datos, por lo que hay que asegurar que el tratamiento de los mismos no exponen vulnerabilidades, y por ello, para evitar ataques, es indispensable una correcta validación, tanto en la entrada como en la salida.
Imagen: maxpixel
Técnicas de validación
Sanitización
Consiste en normalizar toda posible representación de un dato a un formato único o estándar, reduciendo los problemas de validación y el número de ataques.
Existen varios métodos de sanitización, algunos de los cuales pueden encontrarse en librerías o paquetes. Los métodos más comunes son:
- Rutas: Se normalizan rutas a directorios (por ejemplo en Unix), lo que evita que un atacante navegue a un directorio sensible y obtenga información no autorizada.
- Espacios: Se eliminan espacios, tabulaciones y otros caracteres blancos del dato.
- Charset: Se normalizan los caracteres del datos a un charset en concreto, tratando de forma concreta aquellos caracteres que no pertenecen a dicho charset.
- Case: Se convierten los caracteres a mayúsculas o minúsculas.
Tipos de datos
Se verifica que el dato sea de un tipo concreto. El tipo puede ser simple (entero, decimal, carácter, boolean, string) o complejo (email, nif, código postal, url, etc).
Formato
Dentro de los tipos complejos, permite validar el formato de éstos mediante patrones o expresiones regulares.
Importante: Una expresión regular compleja puede ser vulnerable a un ataque ReDoS, por lo que es aconsejable validar previamente la expresión con herramientas como RegEx Testing o RegEx 101.
Tamaños mínimos y máximos
Controlando un umbral de tamaños (longitud) se evitan cuelgues en el procesamiento del dato.
Valores mínimos y máximos
Ejerce un control sobre un umbral de valores para un dato.
Lista blanca
El dato se encuentra dentro de una lista o conjunto de datos prefijados, como una enumeración.
Lista negra
El dato no se debe encontrar dentro de una lista o conjunto de datos prefijados.
Posibles riesgos
A continuación se describen algunos de los posibles riesgos relativos a la validación de datos:
- Cross-Site Scripting: Un atacante podría inyectar código a través de un dato, por ejemplo en un navegador web.
- Inyección SQL: Un atacante inyectaría código SQL a través de los datos, siendo ejecutado por la base de datos.
- Inyección LDAP: Un atacante inyectaría consultas LDAP para obtener más privilegios o para acceder a datos restringidos.
- Inyección de Log: Un atacante podría inyectar comandos de ejecución en el sistema usando los logs que registran los datos.
- Inyección XEE: Un atacante podría acceder a datos restringidos o la información de la estructura de un árbol XML a través de una inyección XPATH.
- Bomba XML: Un atacante podría provocar un ataque de denegación de servicio sobrecargando el XML y agotando los recursos de la memoria de la aplicación.
- DoS, DDoS y ReDoS: Un atacante podría provocar una denegación de servicio del sistema o de la aplicación si no hay una validación adecuada de las entradas.
Mejores prácticas
He aquí algunas recomendaciones para elevar la seguridad en la validación de datos:
- Las validaciones son siempre obligatorias en el servidor y recomendadas en el cliente.
- Utilizar esquemas de validación de datos y mecanismos estándar que aseguren la validación de datos mediante las técnicas de validación vistas anteriormente.
- Realizar las validaciones utilizando librerías estandarizadas.
- Los datos estructurados han de estar bien tipificados y validados por un esquema definido.
- Los datos no estructurados deben ser sanitizados, utilizando alguna librería de sanitización.
- No mostrar información sensible ante un error de validación.
- En las entradas de datos, solamente aceptar aquellos datos que sean los esperados. Si alguno de los datos de entrada no es el esperado, rechazarlo.
- El servidor debe rechazar cualquier petición en la que exista algún error de validación de entrada.
- Las consultas a bases de datos deben estar parametrizadas, para así evitar la inyección SQL.
- Los frameworks ORM no están exentos de vulnerabilidades de inyección SQL. Consultar la documentación del ORM y utilizar consultas parametrizadas siempre que sea posible.
- Verificar si la aplicación es vulnerable a inyección de comandos.
- Asegurar que las páginas web utilizan plantillas que automaticen las variables dentro del código HTML, para evitar XSS (Cross-Site Scripting)
- Utilizar la configuración más restrictiva posible para el análisis XML, desactivando funciones peligrosas, como la resolución de entidades externas.
- Evitar la deserialización de datos no confiables o protegerse contra éstos.
Referencias