Problemas de seguridad corregidos en el complemento Smash Balloon Social Post Feed

Publicado: 2021-10-29

Durante una auditoría interna del complemento Smash Balloon Social Post Feed (también conocido como Custom Facebook Feed), descubrimos que varios puntos finales sensibles de AJAX eran accesibles para cualquier usuario con una cuenta en el sitio vulnerable, como los suscriptores. Algunos de estos puntos finales podrían permitir que se produzcan ataques de secuencias de comandos entre sitios almacenadas (XSS).

Un ataque Stored XSS exitoso podría permitir que los malos actores almacenen scripts maliciosos en cada publicación y página del sitio afectado. Si un administrador registrado visita una de las URL afectadas, la secuencia de comandos puede ejecutarse en su navegador y ejecutar acciones administrativas en su nombre, como crear nuevos administradores e instalar complementos no autorizados.

Informamos las vulnerabilidades al autor de este complemento por correo electrónico y recientemente lanzaron la versión 4.0.1 para abordarlas. Le recomendamos enfáticamente que actualice a la última versión del complemento Smash Balloon Social Post Feed y que tenga una solución de seguridad establecida en su sitio, como Jetpack Security.

Detalles

Nombre del complemento: Smash Balloon Social Post Feed
URI del complemento: https://wordpress.org/plugins/custom-facebook-feed/
Autor: Smash Balloon
Autor URI: https://smashballoon.com/

Las vulnerabilidades

Secuencias de comandos entre sitios almacenadas a través de la actualización de configuración arbitraria

Versiones afectadas: < 4.0.1
CVE-ID: CVE-2021-24918
CVSSv3.1: 7.3
CWSS: 80.6

        public function cff_save_settings() {
                $data = $_POST;
                $model = isset( $data[ 'model' ] ) ? $data['model'] : null;
                // return if the model is null
                if ( null === $model ) {
                        return;
                }
                
                // (...)

                $model = (array) \json_decode( \stripslashes( $model ) );
                $general = (array) $model['general'];
                $feeds = (array) $model['feeds'];
                $translation = (array) $model['translation'];
                $advanced = (array) $model['advanced'];
                // Get the values and sanitize
                $cff_locale                                                     = sanitize_text_field( $feeds['selectedLocale'] );
                $cff_style_settings                                     = get_option( 'cff_style_settings' );
                $cff_style_settings[ 'cff_timezone' ]   = sanitize_text_field( $feeds['selectedTimezone'] );
                $cff_style_settings[ 'cff_custom_css' ] = $feeds['customCSS'];
                $cff_style_settings[ 'cff_custom_js' ]  = $feeds['customJS'];
                $cff_style_settings[ 'gdpr' ]                   = sanitize_text_field( $feeds['gdpr'] );
                $cachingType                                                    = sanitize_text_field( $feeds['cachingType'] );
                $cronInterval                                                   = sanitize_text_field( $feeds['cronInterval'] );
                $cronTime                                                               = sanitize_text_field( $feeds['cronTime'] );
                $cronAmPm                                                               = sanitize_text_field( $feeds['cronAmPm'] );
                $cacheTime                                                              = sanitize_text_field( $feeds['cacheTime'] );
                $cacheTimeUnit                                                  = sanitize_text_field( $feeds['cacheTimeUnit'] );
                // Save general settings data
                update_option( 'cff_preserve_settings', $general['preserveSettings'] );
                // Save feeds settings data
                update_option( 'cff_locale', $cff_locale );

                // (...)

                // Save translation settings data
                foreach( $translation as $key => $val ) {
                        $cff_style_settings[ $key ] = $val;
                }
                // Save advanced settings data
                $cff_ajax = sanitize_text_field( $advanced['cff_ajax'] );
                foreach( $advanced as $key => $val ) {
                        if ( $key == 'cff_disable_resize' || $key == 'disable_admin_notice' ) {
                                $cff_style_settings[ $key ] = !$val;
                        } else {
                                $cff_style_settings[ $key ] = $val;
                        }
                }

                // (...)

                update_option( 'cff_ajax', $cff_ajax );
                // Update the cff_style_settings option that contains data for translation and advanced tabs
                update_option( 'cff_style_settings', $cff_style_settings );
                // clear cron caches
                $this->cff_clear_cache();
                new CFF_Response( true, array(
                        'cronNextCheck' => $this->get_cron_next_check()
                ) );
        }

La acción AJAX wp_ajax_cff_save_settings , que es responsable de actualizar la configuración interna del complemento, no realizó ninguna verificación de privilegio o nonce antes de hacerlo. Esto hizo posible que cualquier usuario que haya iniciado sesión llame a esta acción y actualice cualquiera de las configuraciones del complemento.

Desafortunadamente, una de estas configuraciones, customJS , permite a los administradores almacenar JavaScript personalizado en las publicaciones y páginas de su sitio. Actualizar esta configuración es todo lo que habría necesitado para que un mal actor almacenara scripts maliciosos en el sitio.

Cronología

2021-10-14 – Contacto inicial con Smash Balloon
2021-10-18 – Les enviamos detalles sobre estas vulnerabilidades
2021-10-21 – Se lanza Smash Balloon Social Post Feed 4.0.1

Conclusión

Le recomendamos que verifique qué versión del complemento Smash Balloon Social Post Feed está usando su sitio y, si es inferior a 4.0.1, ¡actualícela lo antes posible!

En Jetpack, trabajamos arduamente para asegurarnos de que sus sitios web estén protegidos contra este tipo de vulnerabilidades. Le recomendamos que tenga un plan de seguridad para su sitio que incluya escaneo de archivos maliciosos y copias de seguridad. Jetpack Security es una excelente opción de seguridad de WordPress para garantizar que su sitio y los visitantes estén seguros.

Créditos

Investigador original: Marc Montpas

Gracias al resto del equipo de Jetpack Scan por sus comentarios, ayuda y correcciones.