Instamos a los usuarios a actualizar sus sitios con la última versión parcheada de JS Help Desk, versión 2.8.7 en el momento de escribir este artículo, lo antes posible.
Resumen de vulnerabilidades de Wordfence Intelligence
Descripción: JS Help Desk – El Plugin Definitivo de Help Desk & Support <= 2.8.6 – Inyección de código PHP no autenticado para la ejecución
remota de código Plugin afectado: JS Help Desk – Lo Último Plugin de Help Desk & Support Plugin
Slug: js-support-ticket
Versiones afectadas: <= 2.8.6
CVE ID: CVE-2024-7094
Puntuación CVSS: 9.8 (Crítico)
Vector CVSS: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
Investigador/es: Connor Billings
Versión totalmente parcheada: 2.8.7
Premio de recompensa: $716.00
JS Help Desk: el complemento definitivo de Help Desk & Support Plugin para WordPress es vulnerable a la inyección de código PHP, lo que lleva a la ejecución remota de código en todas las versiones hasta la 2.8.6 inclusive, a través de la función ‘storeTheme’. Esto se debe a la falta de saneamiento de los valores proporcionados por el usuario, que reemplazan los valores del archivo style.php, junto con la falta de comprobaciones de capacidad. Esto hace posible que los atacantes no autenticados ejecuten código en el servidor. Este problema se parcheó parcialmente en la versión 2.8.6 cuando se resolvió el problema de inyección de código, y se parcheó completamente en la versión 2.8.7 cuando se agregó la autorización faltante y la protección contra la falsificación de solicitudes entre sitios.
Análisis técnico
El plugin JS Help Desk – The Ultimate Help Desk & Support está diseñado para proporcionar una plataforma de soporte y servicio de asistencia profesional y sin fisuras para integrarse en WordPress.
El examen del código revela que el complemento usa la función de la clase para manejar las solicitudes de formulario, que puede llamar a cualquier función de la clase de controlador con el prefijo JSST.checkFormRequest()JSSTformhandler
171819202122232425262728293031 | function checkFormRequest() { $formrequest = JSSTrequest::getVar('form_request', 'post'); if ($formrequest == 'jssupportticket') { //handle the request $page_id = JSSTRequest::getVar('page_id', 'GET'); jssupportticket::setPageID($page_id); $modulename = (is_admin()) ? 'page' : 'jstmod'; $module = JSSTrequest::getVar($modulename); JSSTincluder::include_file($module); $class = 'JSST' . $module . "Controller"; $task = JSSTrequest::getVar('task'); $obj = new $class; $obj->$task(); } } |
Esto puede llamar a la función en la clase de controlador. Aunque esta función está protegida por nonce, desafortunadamente el nonce puede ser obtenido por atacantes no autenticados en la versión vulnerable.savetheme()JSSTthemesController
34353637383940 | static function savetheme() { $nonce = JSSTrequest::getVar('_wpnonce'); if (! wp_verify_nonce( $nonce, 'save-theme') ) { die( 'Security check Failed' ); } $data = JSSTrequest::get('post'); JSSTincluder::getJSModel('themes')->storeTheme($data); |
La función llama a la función de la clase, que contiene el siguiente fragmento de código:savetheme()storeTheme()JSSTthemesModel
89101112131415161718192021 | function storeTheme($data) { $filepath = JSST_PLUGIN_PATH . 'includes/css/style.php'; $filestring = file_get_contents($filepath); $this->replaceString($filestring, 1, $data); $this->replaceString($filestring, 2, $data); $this->replaceString($filestring, 3, $data); $this->replaceString($filestring, 4, $data); $this->replaceString($filestring, 5, $data); $this->replaceString($filestring, 6, $data); $this->replaceString($filestring, 7, $data); if (file_put_contents($filepath, $filestring)) { update_option('jsst_set_theme_colors', json_encode($data)); JSSTincluder::getJSModel('jssupportticket')->updateColorFile(); JSSTmessage::setMessage(esc_html(__('The new theme has been applied', 'js-support-ticket')), 'updated'); |
Este código lee el contenido del uso de la función y, a continuación, reemplaza los valores del archivo mediante la función.style.phpfile_get_contents()$colorstyle.phpreplaceString()
28293031323334 | function replaceString(&$filestring, $colorNo, $data) { if (strstr($filestring, '$color' . $colorNo)) { $path1 = jssupportticketphplib::JSST_strpos($filestring, '$color' . $colorNo); $path2 = jssupportticketphplib::JSST_strpos($filestring, ';', $path1); $filestring = substr_replace($filestring, '$color' . $colorNo . ' = "' . $data['color' . $colorNo] . '";', $path1, $path2 - $path1 + 1); } } |
Después de eso, guarda las modificaciones en el archivo con la función. Esta parte es lo que hace posible que los atacantes no autenticados agreguen código PHP malicioso arbitrario al archivo y, por lo tanto, cuando se carga el archivo, desencadenan la ejecución remota de código en el servidor. De forma predeterminada, este archivo se carga al final de la función a través de la función de la clase.file_put_contents()style.phpstyle.phpstoreTheme()updateColorFile()JSSTjssupportticketModel
Esta función llama al archivo y ejecuta cualquier código inyectado en el archivo.updateColorFile()require()style.php
14861487 | function updateColorFile(){ $color = require(JSST_PLUGIN_PATH . 'includes/css/style.php'); |
Al igual que con todas las vulnerabilidades de ejecución remota de código, esto puede llevar a un compromiso completo del sitio mediante el uso de webshells y otras técnicas.
Cortafuegos de Wordfence
El siguiente gráfico muestra los pasos para la explotación que podría tomar un atacante y en qué momento el firewall de Wordfence bloquearía a un atacante para que no explote con éxito la vulnerabilidad.
La regla de firewall de Wordfence detecta la acción maliciosa y bloquea la solicitud si no proviene de un administrador autorizado existente.
Cronograma de divulgación
11 de julio de 2024 – Recibimos la presentación de la vulnerabilidad de inyección de código a la ejecución remota de código en JS Help Desk a través del programa de recompensas por errores de Wordfence.
25 de julio de 2024: validamos el informe y confirmamos el exploit de prueba de concepto.
25 de julio de 2024 – Los usuarios de Wordfence Premium, Care y Response recibieron una regla de firewall para brindar protección contra cualquier exploit que pueda apuntar a esta vulnerabilidad.
25 de julio de 2024 – Iniciamos el contacto con el proveedor del plugin pidiéndole que confirme la bandeja de entrada para manejar la discusión.
25 de julio de 2024: el proveedor confirmó la bandeja de entrada para manejar la discusión.
25 de julio de 2024 – Enviamos los detalles completos de la divulgación. El proveedor acusó recibo del informe y comenzó a trabajar en una solución.
29 de julio de 2024 – Se lanza la versión parcialmente parcheada del plugin, 2.8.6.
5 de agosto de 2024: se lanza la versión completamente parcheada del complemento, 2.8.7.
24 de agosto de 2024 – Los usuarios de Wordfence Free recibirán la misma protección.
Conclusión
En esta entrada del blog, detallamos una vulnerabilidad de ejecución remota de código dentro del plugin JS Help Desk que afecta a las versiones 2.8.6 y anteriores. Esta vulnerabilidad permite a los actores de amenazas no autenticados ejecutar código malicioso en el servidor. La vulnerabilidad se ha solucionado en la versión 2.8.7 del plugin.
Animamos a los usuarios de WordPress a verificar que sus sitios están actualizados a la última versión parcheada de JS Help Desk lo antes posible, teniendo en cuenta la naturaleza crítica de esta vulnerabilidad.
El 25 de julio de 2024, los usuarios de Wordfence Premium, Wordfence Care y Wordfence Response recibieron una regla de firewall para protegerse contra cualquier exploit dirigido a esta vulnerabilidad. Los sitios que utilicen la versión gratuita de Wordfence recibirán la misma protección 30 días después, el 24 de agosto de 2024
Si conoces a alguien que utilice este plugin en su sitio, te recomendamos que compartas este aviso con él para asegurarte de que su sitio sigue siendo seguro, ya que esta vulnerabilidad supone un riesgo significativo.
Fuente: Wordfense