WP Cerber Security 9.9
English version: WP Cerber Security 9.9
De un vistazo
Ya está aquí WP Cerber 9.9, y esta versión se centra en la resiliencia. Hemos implementado un mecanismo de autorreparación para la configuración de tu plugin, corregido varias vulnerabilidades de detección en el detector de JavaScript ofuscado del Inspector de Tráfico y solucionado una serie de errores fatales que podían provocar la caída de un sitio web en ciertos entornos de alojamiento. Si utilizas WP Cerber en un sitio web con mucho tráfico o en un alojamiento antiguo, esta actualización mejora notablemente la robustez de tu instalación.
Aspectos destacados
- Novedad: Copia de seguridad y recuperación automáticas de la configuración de los plugins, con informes claros cuando se produce una recuperación.
- Seguridad: Múltiples rondas de refuerzo para el detector de JavaScript ofuscado utilizado por Traffic Inspector, cerrando así las vías de evasión reales.
- Fiabilidad: WP Cerber ahora funciona correctamente en entornos de alojamiento antiguos donde PHP carece del controlador de base de datos moderno mysqlnd.
- Corrección de errores: Se ha solucionado un problema de corrupción de la configuración que provocaba el bloqueo del sitio web en PHP 8, junto con una regresión en la detección de JavaScript con caracteres hexadecimales escapados.
Nuevas funciones
Copia de seguridad y recuperación automáticas para la configuración de los plugins
Esta es la característica principal de la actualización. WP Cerber ahora mantiene una copia de seguridad de su configuración, la última válida conocida, en el almacenamiento de clave-valor del plugin. Esta copia se actualiza después de cada actualización de configuración, importación de configuración, actualización del plugin y mediante la tarea de mantenimiento diaria. Solo las configuraciones válidas pueden reemplazar la copia de seguridad existente, por lo que un estado incorrecto nunca puede sobrescribir uno correcto.
¿Por qué es importante? Si la configuración del plugin almacenada en la base de datos se vuelve ilegible, WP Cerber detecta la corrupción y restaura automáticamente la configuración desde la copia de seguridad. De esta forma, conservas tus reglas de firewall, listas de acceso y ajustes de notificaciones, en lugar de que se restablezcan automáticamente los valores predeterminados de fábrica.
El proceso de recuperación es totalmente transparente. Todos los resultados se registran a través del monitor de incidencias del plugin:
- Tras una restauración automática exitosa, verá una advertencia que puede descartar y que explica lo sucedido, las medidas tomadas y lo que debe revisar. El aviso desaparece automáticamente después de que revise y guarde su configuración.
- Si la copia de seguridad no existe, no es válida o la recuperación falla, se registra un problema crítico con instrucciones prácticas y metadatos de diagnóstico relevantes, sin exponer la configuración serializada ni los detalles internos del almacenamiento.
- Se evitan las declaraciones contradictorias o duplicadas, por lo que nunca verá avisos contradictorios.
Si la recuperación no es posible, se conserva la configuración predeterminada de último recurso, la cual se guarda en la base de datos para que el complemento se inicie desde un estado determinista. Además, reforzamos la ruta de restauración contra cachés de opciones obsoletas: el valor dañado se elimina explícitamente antes de escribir el valor restaurado, y la copia de seguridad se almacena y carga sin pasar por la caché de objetos, de modo que solo se confía en el registro persistente de la base de datos.
Aviso para hosts sin el controlador mysqlnd
Un nuevo detector de alertas en el widget "Preparación del sistema" identifica los servidores donde la extensión mysqli de PHP está compilada con la biblioteca libmysqlclient (antigua) en lugar de la moderna mysqlnd. El aviso es informativo. Confirma que WP Cerber sigue funcionando mediante una alternativa compatible y recomienda habilitar mysqlnd para una compatibilidad total y un mejor rendimiento. Esto le proporciona un diagnóstico concreto y útil para presentar a su proveedor de hosting.
Cambios en seguridad y control de acceso
Detección reforzada de JavaScript ofuscado en el Inspector de tráfico
El Traffic Inspector examina los campos de solicitud públicos en busca de JavaScript ofuscado, y esta versión corrige varias deficiencias de cobertura y vulnerabilidades en ese detector, al tiempo que conserva su bajo índice de falsos positivos.
Mayor cobertura de secuencias de escape. Anteriormente, el detector solo reconocía secuencias de escape hexadecimales \xNN en cadenas completamente escapadas. Ahora también detecta secuencias de escape Unicode \uNNNN y \u{...} , incluyendo cadenas que combinan los formatos admitidos. La decodificación se limita a puntos de código ASCII, y las secuencias de escape parciales y las expresiones arbitrarias quedan deliberadamente fuera del alcance para evitar falsos positivos.
Detección de primitivas ocultas en llamadas a fromCharCode(). Las cargas útiles decodificadas a partir de construcciones explícitas String.fromCharCode() ahora se verifican para primitivas de ejecución, DOM, red y sistema, no solo URL externas y direcciones IP. La decodificación se restringe a literales decimales y hexadecimales validados, admite múltiples llamadas, prefijos 0X en mayúsculas y comas finales opcionales, y aplica la semántica ToUint16 de JavaScript para que los valores decodificados coincidan con lo que produciría un navegador. La coincidencia de primitivas con reconocimiento de tokens con límites de identificador significa que las palabras comunes como "descripción" y "evaluación" ya no coinciden con las subcadenas eval o script .
Mitigación de las vulnerabilidades de omisión de enteros envueltos. String.fromCharCode() aplica ToUint16 a cada argumento, por lo que un código ASCII más un múltiplo de 65536 produce el mismo carácter. Anteriormente, el detector solo aceptaba literales de hasta seis dígitos, lo que significaba que los valores envueltos de siete o más dígitos eludían la detección por completo. Ahora, el detector acepta literales decimales y hexadecimales sin signo hasta Number.MAX_SAFE_INTEGER de JavaScript y reduce cada token de forma determinista a su unidad de código ToUint16, independientemente del tamaño del entero de la plataforma. La longitud del token está limitada durante la conversión, por lo que un literal de tamaño excesivo no puede generar un trabajo ilimitado por dígito en una solicitud pública, cerrando así un posible vector de DoS.
No se produce supresión por un solo token erróneo. Anteriormente, un token fuera de rango o ambiguo anulaba la decodificación completa de la llamada, lo que permitía a un atacante añadir un único valor no compatible a una carga útil detectable y suprimir la detección. Ahora, un token estructuralmente válido pero no compatible se asigna a un carácter centinela y el resto de la llamada se decodifica. La llamada completa solo se omite cuando la lista de argumentos está mal formada o no es numérica.
Las cargas útiles separadas por comentarios ya no son un punto ciego. La compactación de entrada del detector eliminó únicamente los espacios en blanco genéricos, lo que dejó intactos los comentarios de JavaScript y permitió que los argumentos numéricos separados por comentarios, como String.fromCharCode(101,/*x*/118,97,108,40,49,41,59) , eludieran la detección. Ahora, el detector elimina los comentarios de bloque de JS, los comentarios de línea y los espacios en blanco léxicos fuera de las cadenas entre comillas antes de ejecutar su heurística, y maneja listas de argumentos que abarcan varias líneas.
Para el propietario de un sitio web de WordPress, el resultado práctico es sencillo: varias técnicas realistas que un atacante podría usar para colar código JavaScript ofuscado sin que el Inspector de Tráfico las detecte ya no funcionan, y el detector sigue siendo lo suficientemente conservador como para no marcar como sospechoso el tráfico legítimo.
Mejoras en la confiabilidad
Compatibilidad con controladores de bases de datos heredados
WP Cerber ahora funciona correctamente en entornos de alojamiento donde PHP no proporciona el controlador de base de datos mysqlnd moderno. La capa de base de datos comprueba la disponibilidad de mysqli_fetch_all() antes de usar la ruta rápida de mysqlnd. Si no está disponible, los conjuntos de resultados se obtienen fila por fila mediante un método compatible, conservando el orden de las filas, la estructura de los resultados y el contrato de gestión de errores existente. En lugar de un error fatal, se obtiene una alternativa más lenta pero completamente funcional, además del aviso de advertencia descrito anteriormente.
Corrección de errores
Error fatal en sitios con configuración dañada (PHP 8)
Un valor de configuración corrupto e irrepetible en la base de datos provocó un error fatal TypeError ) en la función array_merge() al cargar el plugin en PHP 8, lo que provocó la caída de todo el sitio. La carga de la configuración ahora valida el valor almacenado y recurre a la configuración predeterminada cuando no se puede analizar. El fallo se registra como un problema crítico persistente y se resuelve automáticamente cuando el administrador vuelve a guardar la configuración. El problema de corrupción solo se activa cuando un valor almacenado no vacío realmente no se puede deserializar; por lo tanto, un valor vacío, que simplemente significa que la configuración aún no existe, nunca activa una falsa alarma. Combinado con la nueva función de copia de seguridad y recuperación, esto convierte un escenario de caída del sitio en uno de autorreparación.
Error fatal en hosts sin mysqlnd
La capa de base de datos llamada mysqli_result::fetch_all() , que requiere el controlador mysqlnd y no existe en los hosts que ejecutan mysqli con libmysqlclient, provoca un error fatal. La ruta rápida ahora está protegida y recurre a la recuperación fila por fila, como se describe en la sección de confiabilidad anterior.
Regresión en la detección de JavaScript con escape hexadecimal
Un error en el detector de JavaScript ofuscado impedía la decodificación de cadenas compuestas únicamente por secuencias \xNN . El paso de normalización utilizaba trim() con una máscara de caracteres que eliminaba la barra invertida inicial del primer escape, junto con la comilla de apertura, lo que generaba una cadena de longitud impar que el mecanismo de decodificación omitía. Como resultado, las primitivas con escape hexadecimal, como eval , script y XMLHttpRequest , no se detectaban en la ruta de campo de solicitud del Inspector de Tráfico, que estaba habilitada por defecto. Ahora la decodificación funciona correctamente, restaurando la detección de estas primitivas ofuscadas.
Omisión mediante argumentos separados por comentarios y por código de carácter.
Los argumentos numéricos válidos separados por comentarios en las llamadas fromCharCode() no se detectaban porque los comentarios de JavaScript permanecían intactos durante la compactación de la entrada. Esto se ha solucionado como se describe en la sección de seguridad anterior.
Resumen
La versión 9.9 es una actualización que, con suerte, pasará desapercibida, y ese es precisamente el objetivo. Ahora, la configuración se conserva incluso después de una corrupción de la base de datos, en lugar de perderse. Un problema del entorno de alojamiento que antes provocaba el fallo del plugin ahora se resuelve de forma gradual y le indica con precisión qué debe solicitar a su proveedor de hosting para que lo solucione. Para el administrador, la experiencia diaria es la misma que la de siempre: un panel de control que se ejecuta sobre una base que se recupera automáticamente de los fallos e inspecciona el tráfico malicioso con menos puntos ciegos.