A principio de mes recibí otro reporte de seguridad de Wordfence para el plugin de WordPress List Category Posts. Cada vez vienen llegando más seguido. Me pregunto si hay algún negocio por detrás, si alguien se está beneficiando monetariamente con las investigaciones de seguridad, o simplemente con "crédito" por encontrarlas. Los que desarrollamos el plugin definitivamente no nos venimos beneficiando monetariamente, eso lo puedo afirmar.

Fernando versión elefante programando PHP

Fernando versión elefante programando PHP

Estas "vulnerabilidades" son de bastante poco riesgo, y por suerte hasta ahora han sido relativamente sencillas de corregir. Cuando escribí el plugin, lo hice pensando en usuarios que tienen total control de su WordPress y que saben lo que están haciendo. Y si no saben, no deberían poder hacerse demasiado daño mientras usaran las funcionalidades básicas.

No consideré sitios donde hay muchos usuarios con distintos permisos, que es algo que WordPress permite. Entonces alguien con suficiente maña, y malas intenciones, podría llegar a usar el plugin para hacer cosas malas (nunca graves, como obtener contraseñas ni nada del estilo, salvo que tuviera acceso como administrador, que ahí ya lo podría hacer por otros medios). 

Así que llegó un nuevo reporte con dos problemas. Uno era que existía una forma de mostrar contenido de posts que estaban protegidos con contraseña. El arreglo fue relativamente fácil de implementar. A la hora de mostrar contenido, revisar si el post está protegido con post_password_required y si devuelve verdadero, usar get_the_password_form en vez del contenido. Si recuerdo bien los tests que hice, después de ingresar el password sí vemos el contenido en la página/post donde usamos el plugin.

El segundo problema reportado fue que existía una forma en casos bastante borde de mostrar el contenido de un post privado o borrador a usuarios sin los permisos adecuados. WordPress tiene estados para los posts incluyendo private y draft, que sólo deberían ser vistos por usuarios editores y administradores. Así que agregué una función para "desinfectar" los estados y eliminar private y draft a menos que la persona tenga permisos.

Acá fue donde tuve que re-aprender PHP. Este es mi cerebro cuando me encuentro con un problema, por más simple que sea, en un lenguaje que no es Ruby: "Esto no es Ruby, ¿cómo se hace esto en PHP? No tengo ni idea, en Ruby ya lo solucioné en mi cabeza, ¿pero PHP? ¡Seguro son mucho mas líneas de código! AAAAAH!!!". Después de este breve ataque de histeria, me acuerdo que soy un adulto y que Ruby no es el santo grial y podemos programar en varios lenguajes de programación distintos y diversos, y eso está bien.

Quería, teniendo un array de Strings, eliminar cualquier ocurrencia de los Strings private y draft. Salí a buscar en la documentación de PHP y me encontré con array_diff que compara arrays y devuelve los valores de un array que no están presentes en los otros.

Mi array $statuses tiene los estados de post que envían los usuarios, y necesito solamente los que no sean private y draft. Así que quedó solucionado en una sóla línea de código: array_diff($statuses, array('private', 'draft')) devuelve todos los valores de $statuses que no sean los que definí en el segundo array (¿viste Fernando que se puede?). En el momento no me encontré con la función array_filter, pero creo que en algún momento podría actualizar el código para usarla, porque me resulta más claro.

Y quedó la versión que publiqué. Algo interesante es que había aplicado una solución que no funcionaba (porque no tenía en cuenta que alguien podía mandar post_status=private,private). Klemens (otro desarrollador del plugin) comentó una mejora que apliqué, pero al final no quedó, y dejé todo en el historial de commits. Como esto es un proyecto personal al que le dedicamos tiempo voluntario, no necesita tener un historial de commits en Git profesional. Estos commits cuentan una historia de cómo programo (mal) en PHP, así que ahí me quedan, para leer en el futuro...

La vulnerabilidad me fue reportada por privado responsablemente por Wordfence, antes de hacerla pública (para darnos tiempo a solucionarla). Ni bien publiqué la versión nueva del plugin, 0.93.0, respondí a Wordfence avisando. Así que ahora a esperar y ver qué dicen de esta solución, y que caiga la próxima vulnerabilidad en unos meses por alguna razón.

List Category Posts es un plugin para WordPress, es software libre publicado bajo la GPLv2. El código fuente está disponible en Codeberg, en GitHub y en WordPress.org (SVN). Se puede descargar desde el sitio de plugins de WordPress.

No hay comentarios en este post

Feed de comentarios

Dejar un comentario

Toasty!