HDIV: Mejorando la seguridad de Struts
Uno de los principales problemas a la hora de lidiar con la programación de aplicaciones en entornos web - cualquiera que sea el lenguaje utilizado - es establecer una serie de medidas que garanticen la imposibilidad de alterar los datos generados en el servidor y que son susceptibles de ser modificados desde la parte cliente. Pensemos en los parámetros necesarios para el funcionamiento de la aplicación que esta recibe desde el navegador: valores pertenecientes a los formularios, campos ocultos, links, etc. Todos ellos son elementos que requieren una validación y filtrado antes de ser procesados.
Idealmente, esta validación debería garantizar tanto la integridad de estos datos como la confidencialidad de los mismos. Pero la realidad es que en numerosas ocasiones no es así, ya que esta tarea resulta tediosa y prolífica a errores en su implementación, a menudo por el propio funcionamiento y/o diseño de gran parte de las aplicaciones web.
El uso de frameworks que implementan el concepto MVC (Modelo, Vista, Controlador) separando el procesamiento en tres secciones claramente diferenciadas, sin duda facilita en gran medida el desarrollo y mantenimiento de las aplicaciones web. Pero al mismo tiempo complican en cierto modo la tarea de validación de los datos con los que interactúa el cliente.
En el caso de Struts , - un framework de desarrollo web para entornos J2EE muy popular - se facilita al desarrollador un método para estos menesteres (Struts validator) que aunque útil, no es perfecto ya que la validación está limitada (sin poder garantizar la integridad y la confidencialidad) y a ello hay que sumarle el hecho de tener que establecerla individualmente para cada campo a comprobar por lo que puede resultar poco práctico.
Para solventar estas limitaciones de Struts y eliminar las vulnerabilidades típicas de las aplicaciones web, surge el proyecto open-source HDIV (HTTP Data Integrity Validator) concebido como una ampliación de seguridad para Struts.
Y lo consigue de forma transparente al programador, manteniendo el API y las especificaciones de Struts, sin añadir mayor complejidad al desarrollo.
INTEGRIDAD DE LOS DATOS Y CONFIDENCIALIDAD:
HDIV garantiza la integridad de los datos generados en el servidor, eliminando las vulnerabilidades basadas en la manipulación de parámetros. Permite configurar validaciones genéricas mediante reglas en formato XML para reducir o eliminar el riesgo de sufrir ataques de tipo XSS o de Inyección SQL.
También contribuye a garantizar la confidencialidad de los datos. Evitando la divulgación de información sensible que puede ser utilizada por posibles atacantes como nombres de registros de la base de datos, columnas, tablas o directorios del servidor.
A modo de ejemplo, HDIV permite reemplazar enlaces como el siguiente http://www.host.com?data1=12&data2=24 por
http://www.host.com?data1=0&data2=1, garantizando la confidencialidad de los valores que representan a los identificadores en la base de datos. También ofrece la posibilidad de ocultar el nombre de los parámetros, en este caso convirtiendo el link de ejemplo en http://www.host.com?0=0&1=1.
Además, es posible el uso de HDIV en aplicaciones que no se basan en Struts modificando los jsps.
EL CONCEPTO DE ESTADO EN HDIV:
En HDIV, un estado representa todos los datos que componen una posible petición a una aplicación web, es decir, los parámetros de la petición, sus valores y sus tipos, junto con el destino o la petición. Por ejemplo, si tenemos un enlace de este tipo, http://www.host.com/page1.do?data1=20&data2=35 , un estado que representaría a este enlace sería como el siguiente:
Acción: page1.do
Parámetros:
data1:
values: 20
type: link
data2:
values: 35
type: link
HDIV generará un objeto de tipo estado para cada enlace o formulario en la página jsp cada vez que se procesa una página en el servidor. Permitiendo la existencia de varios estados (peticiones posibles) para una página según los formularios y enlaces presentes en ella.
Este estado se puede almacenar de dos formas:
-En el Servidor: Dentro de la sesión del usuario (HttpSesion).
-En el Cliente: Se envía al cliente como parámetro.
Modos de funcionamiento:
HDIV se puede configurar para actuar según tres estrategias diferentes:
-Cipher: Para cada posible petición de cada página se añade un parámetro (por defecto _HDIV_STATE_ , pero se puede personalizar), que representa el estado de la petición. Este estado se cifra usando un algoritmo simétrico para garantizar su integridad. Además, HDIV reemplazará todos los valores de los parámetros no editables con valores relativos (0,1,2,...) para garantizar la confidencialidad de los datos.
-Hash: En este caso, no se garantiza la confidencialidad, ya que el estado enviado al cliente simplemente se codifica en Base64. También se genera un hash del estado enviado al cliente y se almacena en la sesión del usuario.
-Memory: Todos los estados de la página se guardan en la sesión del usuario, identificando sus peticiones mediante el uso del parámetro (_HDIV_STATE_) añadido a cada petición. Los valores no editables también se ocultan para garantizar la confidencialidad.
En la documentación oficial se explica su funcionamiento de forma detallada, los pasos para su instalación así como algunos ejemplos. Además, los autores han elaborado un estudio donde se muestra de que modo afecta al rendimiento el uso de las distintas estrategias soportadas por HDIV. Interesante, pues parece que en el peor de los casos el uso de HDIV sólo supuso un incremento del 10 % en el tiempo de respuesta. Aunque lógicamente esto dependerá de cada entorno y aplicación específicos no pinta mal.
Otra característica destacable es la posibilidad de guardar un log de todos los ataques detectados. Para ello, HDIV hace uso de la Commons Logging API, permitiendo el uso de la libreria Log4j, proporcionando además un archivo de ejemplo (log4j.properties) que se puede encontrar en el directorio
/hdiv-web-struts-1.1/src/main/resources/.
Finalmente, si vamos a probar HDIV en nuestra aplicación web, es aconsejable eliminar de forma manual todas las paginas JSP compiladas en el servidor, para garantizar que no existen otras ejecuciones donde no se esté utilizando.
HDIV resulta una iniciativa interesante, gratuita y con una documentación muy completa y bien explicada. Altamente recomendable, y lo mejor: es "made in Spain". ;)
REFERENCIAS:
1. HDIV: www.hdiv.org
2. Struts: struts.apache.org
3. Struts validator:struts.apache.org
4. Presentación de HDIV donde se explica cómo ayuda a evitar algunas de las vulnerabilidades del Top Ten 2007 de OWASP : www.hdiv.org/doc/hdiv.ppt


Comentarios
Añadir comentario