Skip to content

v0.4.3

Choose a tag to compare

@fabiomb fabiomb released this 29 Sep 21:05
· 38 commits to main since this release

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=1 no se bloqueaba: el bloqueo corría en template_redirect con la misma prioridad que redirect_canonical, que el núcleo registra antes y redirige ?author=1 a /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%20 o ?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/USERS o /wp/v2/users/ devolvían el listado. WPS_Restapi_Detector::is_users_route() (nuevo) las reconoce todas.
  • Sitemap de usuarios: /wp-sitemap-users-1.xml listaba 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/embed incluían author_name y author_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 .htaccess es válido en Apache 2.2 y 2.4 (Require all denied), se agrega un index.php vacío y se elimina el wps-firewall.log de 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.md documenta la regla location ^~ /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.3 en la cabecera del plugin, la constante WPS_VERSION y el MU-plugin.