viernes, 2 de junio de 2023

Desarrollo seguro: gestión de errores

La gestión de errores se refiere, por una parte, al control de la información que se expone cuando ocurre un error, y, por otra parte, a cómo controlar los errores no controlados en una aplicación.


Cuidado con la información mostrada

Hay que tener especial cuidado a la hora de mostrar la información de un error, pues podemos revelar inconscientemente información que podría ser aprovechada por un atacante. Esta información podría ser, por ejemplo, parte de la configuración de la aplicación, algún estado, mensajes de depuración, datos sensibles o confidenciales, el tiempo que tarda en ejecutarse algunas operaciones, códigos importantes, usuarios y/o contraseñas, ids de sesión, elementos de la infraestructura o de la arquitectura, versiones, etc. Esta información promueve algunos riesgos tales como:

  • Fuga de información sensible: estructura de archivos, documentos sensibles, motor de base de datos, versión del servidor, etc.
  • Denegación de servicio. Ciertos errores forzados podrían provocar la caída del sistema.
  • Cross-Site Scripting. Un mensaje de error podría revelar parámetros de entrada sin validación de caracteres de escape.

Control de errores

Es de vital importancia controlar que todas las operaciones prevean y gestionen todas las excepciones posibles, pues una excepción no controlada podría provocar una salida inesperada de la lógica de negocio que exponga vulnerabilidades que puedan ser aprovechadas por un atacante.

Un punto probable de errores inesperados puede surgir cuando no se cierran correctamente los recursos, por lo que se recomiendo el cierre de estos dentro de un bloque try/catch/finally.

Algunos posibles riesgos producidos por un deficiente control de errores podrían ser:

  • Denegación de servicio. El abuso de ciertas operaciones no controladas podrían causar la caída del sistema.
  • Saltarse la lógica de negocio. Se podrían forzar excepciones o errores no controlados, los cuales producirían salidas inesperadas de la lógica de negocio.


Mejores prácticas

He aquí algunas recomendaciones para elevar la seguridad en la gestión de errores:

  • Usar mensajes genéricos en los errores, para no dar pistas sobre datos sensibles.
  • Usar un control de excepciones centralizado.
  • Manejar los errores sin depender de los mensajes de error del servidor mostrados al usuario.
  • Por defecto, denegar el acceso en caso de un error en el control de acceso.
  • Estudiar en profundidad todas las excepciones de una librería para su correcto tratamiento e implementación.
  • Asegurar el cierre de todos los recursos dentro de bloques try/catch/finally.
  • Registrar en detalle todas las excepciones en un registro específico dentro de un entorno seguro.


Referencias