Repository navigation
v0.4.3
Seguridad: La enumeración de usuarios seguía siendo posible (#5)
Con Bloquear enumeración de usuarios activo (el valor por defecto), un visitante anónimo todavía podía obtener los nombres de usuario del sitio, que son la mitad de lo que necesita un ataque de fuerza bruta.
?author=1no se bloqueaba: el bloqueo corría entemplate_redirectcon la misma prioridad queredirect_canonical, que el núcleo registra antes y redirige?author=1a/author/{usuario}/. La redirección salía antes del bloqueo. Ahora el chequeo corre con prioridad 1.- Variantes de
?author=: se exigía un valor numérico, pero WordPress también acepta?author=1,,?author=1%20o?author[]=1. Ahora cuenta cualquier uso del parámetro (WPS_Restapi_Detector::is_author_enumeration(), nuevo). El archivo de autor por su URL (/author/{usuario}/) sigue funcionando, porque para llegar a él ya hay que conocer el usuario. - Ruta REST en mayúsculas: WordPress resuelve las rutas REST sin distinguir mayúsculas y acepta barras de más, así que
/wp-json/wp/v2/USERSo/wp/v2/users/devolvían el listado.WPS_Restapi_Detector::is_users_route()(nuevo) las reconoce todas. - Sitemap de usuarios:
/wp-sitemap-users-1.xmllistaba las URLs de autor con cada nombre de usuario. Se quita del sitemap mientras el ajuste esté activo. - oEmbed: las respuestas de
/wp-json/oembed/1.0/embedincluíanauthor_nameyauthor_url. Se quitan mientras el ajuste esté activo.
Seguridad: El directorio de datos quedaba expuesto en nginx y su log crecía sin límite (#6)
wp-content/wps-data/ se protegía sólo con un .htaccess en sintaxis de Apache 2.2 (Order/Deny). nginx no lee .htaccess, así que en esos servidores wps-firewall.log (IP, método y URI de cada petición bloqueada) y la base de geolocalización se podían descargar. Además, el log nunca se rotaba.
- Log de la Capa 0: pasa a
wps-firewall-log.php, cuya primera línea (<?php exit; ?>) corta la ejecución: pedido por web no muestra nada, en cualquier servidor. Se rota al superar 1 MB y se conserva sólo la copia anterior (wps-firewall-log.1.php). - Datos del visitante en el log: el método y la URI se escriben sin
<,>ni caracteres de control. Un archivo PHP no puede contener etiquetas que vengan de una petición, y un salto de línea en la URI ya no puede inventar entradas en el log. WPS_Activator::protect_data_dir()(ahora público): el.htaccesses válido en Apache 2.2 y 2.4 (Require all denied), se agrega unindex.phpvacío y se elimina elwps-firewall.logde versiones anteriores, que era justamente el archivo expuesto. Corre también en cada cambio de versión, así que las instalaciones existentes se actualizan solas.- nginx:
installation.mddocumenta la reglalocation ^~ /wp-content/wps-data/ { deny all; }y cómo comprobar que el directorio no se sirve.
Seguridad: La exportación incluía el token de ipinfo y la importación no validaba nada (#7)
El archivo de configuración exportado llevaba el token de ipinfo.io en texto plano, y es un archivo que suele terminar en correos, tickets o repositorios. La importación, en cambio, aceptaba cualquier clave con cualquier valor: un archivo modificado podía dejar límites en cero, opciones inexistentes o claves internas del plugin.
WPS_Admin_Export::build_config_export()(nuevo): se exportan sólo los ajustes del panel y ninguno de tipo contraseña (hoy, el token de ipinfo). Separado de la descarga para poder testearlo.- Importación validada: sólo se importan los ajustes que existen en el panel, con las mismas reglas que el formulario (
WPS_Admin_Settings::validate_value(), nuevo): números dentro de su rango, opciones existentes, checkbox booleanos, email válido. Lo que no cumple se ignora en lugar de guardarse, y el mensaje de resultado lista las claves ignoradas. - Los secretos y las claves internas (
db_version, etc.) no se importan aunque vengan en el archivo. - A tener en cuenta: al importar un archivo exportado con una versión anterior, el token de ipinfo que traiga se ignora; hay que cargarlo a mano en Configuración.
Versión
- Versión actualizada a
0.4.3en la cabecera del plugin, la constanteWPS_VERSIONy el MU-plugin.