Añadir excepciones a modSecurity desde .htaccess para evadir falsos positivos
5 minutos de lectura
Si estás leyendo esto ya debes saber que modSecurity es un módulo del servidor Apache creado para filtrar ciertas visitas que pueden suponer un riesgo para la seguridad. El problema es que a veces se dan FALSOS POSITIVOS. Te enseñaré un truco que a mí me ha sacado de apuros más de una vez.
El truco es simplemente desactivar algunas reglas para ciertas URLs añadiendo unas pocas líneas a tu .htaccess
.
Debes saber que desactivar reglas de un filtro de seguridad no es la solución ideal. Pero si lo haces con cuidado puede ser la única solución. Y el cuidado lo vamos a poner en la desactivación de unas cuantas reglas solamente y solamente en ciertos formularios.
Caso de ejemplo
En concreto, mi problema de falsos positivos me ha sucedido ya con dos CMS, el mío propio y Chamilo LMS. En ambos casos, hay un rango de reglas de modSecurity que saltan cuando desde un formulario (POST) tratas de enviar ciertos códigos HTML y/o Javascript. Cosas tan inocuas normalmente como estos símbolos que anteceden a una parte de código HTML que quieras desactivar en tu página:
<p style="text-align: justify;">Una...</p>
Si tratas de enviar eso por una variable POST, es probable que te salte un falso positivo de ataque XSS. Lo cuál es un auténtico fastidio, pues es algo habitual en HTML.
¿Cómo saber que es un problema de modSecurity?
Si estás en este artículo es porqué ya debes saber la respuesta, pero la voy a compartir por si acaso. Probablemente si una regla de modSecurity saltó por ese envío de tu formulario en el navegador web "simplemente" recibirás un error 402 y el resto de la página en blanco. Lo cuál ciertamente es bastante desconcertante, pues uno no imagina fácilmente a que se deberá ese error.
Pero en fin, el procedimiento indica que lo primero que debes hacer es consultar los archivos de LOG de tu servidor. En uno de estos dos encontrarás la pista de qué sucede:
access.log
Dependiendo del tipo de hospedaje que estés usando (compartido, VPS,...) esos archivos pueden hallarse en rutas diferentes:
- Si es una VPS probablemente estén en
/var/log/apache2/
- Pero si es un hosting compartido pueden estar en un directorio del tipo
/logs/
en la "raíz" de tu cuenta de hospedaje.
La cosa está en que al final de uno de esos archivos encontrarás una mención a la URL que te está retornando el error y una mención a modSecurity.
¿Cómo saber qué reglas desactivar?
Te mostraré un ejemplo del error y ahí te muestro donde sacar el código numérico de la regla que saltó:
El código de la regla es: [id "212340"]
¿Cómo desactivamos la regla?
De hecho, en ocasiones anteriores me sucedió que después de desactivar una regla me saltaba otra regla, obviamente por alguna otra razón. Así que finalmente decidí desactivar un rango de reglas y solamente para el archivo admin.php, lo cuál no es tan arriesgado, teniendo en cuenta de que para acceder a esos formularios en admin.php
primero hay que autenticarse como usuario.
Y sí, es cierto que algún malware residente en el navegador de mis usuarios administradores podría aprovechar que el usuario se autenticó para realizar el ataque. Pero vaya, ya es bastante más remoto el asunto. Aunque ciertamente no me parece la solución definitiva, solo un parche de emergencia.
Estas son las líneas de código a añadir en el .htaccess:
# we need it because this form generate false positive of XSS Atack
<IfModule mod_security.c>
<If "%{REQUEST_URI} =~ m#admin#">
SecRuleRemoveById 212000-212999
</If>
</IfModule>
<IfModule mod_security2.c>
<If "%{REQUEST_URI} =~ m#admin#">
SecRuleRemoveById 212000-212999
</If>
</IfModule>
En realidad con el segundo bloque (mod_security2.c
) sería suficiente si tu servidor ya usa la última versión de mod_security. Pero vaya, no molesta poner ambas y así te funcionará sea cuál sea la versión instalada.
Añada su comentario: