Skip to content

v0.5.0

Choose a tag to compare

@fabiomb fabiomb released this 29 Sep 22:13
· 28 commits to main since this release

Seguridad: Límite de intentos de login por cuenta (#12)

Los intentos fallidos se contaban sólo por IP (o por red, en IPv6). Una botnet que prueba contraseñas contra admin desde miles de IPs nunca llega al límite de ninguna, así que podía seguir probando indefinidamente.

  • WPS_Login_Detector::is_account_throttled() (nuevo): se cuentan los intentos fallidos contra cada cuenta existente en la última hora, desde cualquier IP y tanto por nombre de usuario como por email. Superado el límite (10 por hora por defecto, Configuración → Login), la cuenta sólo acepta logins desde redes donde su dueño ya inició sesión; a los demás se los rechaza sin comprobar la contraseña, así que el atacante no puede seguir probando. El bloqueo se levanta solo cuando los fallos salen de la ventana de una hora.
  • El dueño no queda afuera: sigue entrando desde sus redes habituales. Si necesita entrar desde una red nueva mientras la cuenta está bajo ataque, al restablecer la contraseña esa red pasa a ser conocida.
  • WPS_Known_Clients (nuevo): las redes desde las que cada usuario inició sesión se registran ahora para todos los usuarios (antes sólo para administradores, para el aviso de login desde IP nueva, que sigue siendo sólo para administradores).
  • Los límites por IP siguen funcionando igual, y los intentos rechazados también cuentan para ellos. Se registra el evento «Login bloqueado» con el motivo account_throttled.
  • configuration.md: la sección de login describía ajustes que no existen («Ventana de tiempo», un bloqueo de 30 minutos); ahora lista los reales.

Nuevo: Alertas de escalada de privilegios (#13)

Quien toma el control de un sitio suele dejar rastros en pocos lugares: crea un administrador o asciende una cuenta, instala o activa un plugin (a menudo un backdoor), cambia el tema, edita un archivo desde el panel o desactiva el firewall. Ninguno de esos cambios quedaba registrado.

  • WPS_Privilege_Monitor (nuevo) registra el evento «Cambio de privilegios» y avisa por mail, con quién lo hizo y desde qué IP, cuando:
    • se crea un usuario con permisos de administración;
    • un usuario pasa a tener un rol de administración. Cuenta cualquier rol con manage_options, no sólo administrator, porque un rol propio con esa capacidad da el mismo control;
    • se instala un plugin o un tema (las actualizaciones no avisan);
    • se activa o desactiva un plugin. Desactivar WP Seguro se destaca en el asunto;
    • se cambia el tema;
    • se guarda un archivo desde el editor de plugins o temas del panel. Se registra el intento antes de que WordPress guarde; definir DISALLOW_FILE_EDIT en wp-config.php elimina ese vector.
  • Corre en todas las peticiones, así que también detecta cambios hechos por la REST API, WP-CLI o un registro público.
  • Nuevo ajuste «Notificar cambios de privilegios» (Configuración → Notificaciones, activado por defecto). El evento se registra siempre, aunque el mail esté desactivado.

Nuevo: Gestión de sesiones activas (#14)

WordPress sólo permite cerrar las sesiones propias («Cerrar sesión en todas partes» del perfil). Si alguien entró con una contraseña robada, un administrador no tenía forma de ver ni cortar esa sesión.

  • WP Seguro → Sesiones (nueva página): lista las sesiones vigentes de todos los usuarios, con IP, navegador, inicio y vencimiento, y permite cerrar una sesión puntual o todas las de un usuario. La sesión actual se marca y no se puede cerrar por separado. Cada cierre queda en el registro de eventos.
  • Límite de sesiones simultáneas por administrador (Configuración → Login, desactivado por defecto): al iniciar una sesión nueva se cierran las más viejas que excedan el límite. Limita el daño de una cookie de sesión robada.
  • WPS_Session_Manager (nuevo): lee y modifica las sesiones que WordPress guarda en el meta session_tokens. Si otro plugin reemplaza el gestor de sesiones de WordPress, el cierre individual puede no aplicar; el cierre de todas las sesiones usa la API de WordPress y funciona igual.

Nuevo: Comandos WP-CLI (#15)

Recuperar el acceso requería editar wp-config.php o la base de datos. Ahora, con acceso por SSH, alcanza con un comando.

  • wp wps (WPS_CLI, nuevo): status, block, unblock, blocks, whitelist add|remove|list, sync-layer0 y unsafe-mode on|off. Los listados aceptan --format=table|json|csv|yaml.
  • wp wps unblock <ip> levanta también los bloqueos de rango que contienen la IP. En IPv6 los bloqueos automáticos son de red, y levantar sólo la dirección exacta no tendría efecto. WPS_Blocker::unblock_covering() (nuevo) hace ese trabajo y regenera la Capa 0.
  • wp wps unsafe-mode registra el evento y envía el aviso de cambio de configuración, igual que desde el panel.
  • WPS_Whitelist::remove_value() (nuevo): quitar de la whitelist por IP o CIDR.
  • Documentación: nueva guía docs/wp-cli.md, enlazada desde el índice, el README y las guías de recuperación de acceso.

Versión

  • Versión actualizada a 0.5.0 en la cabecera del plugin, la constante WPS_VERSION y el MU-plugin. Al actualizar, la migración completa los ajustes nuevos (intentos fallidos por cuenta, sesiones simultáneas por administrador y aviso de cambios de privilegios) con sus valores por defecto.