viernes, 2 de junio de 2023

Desarrollo seguro: validación de datos

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