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

Durante una auditoría interna del plugin Smash Balloon Social Post Feed (también conocido como Custom Facebook Feed), descubrimos que varios puntos de conexión AJAX sensibles eran accesibles para cualquier usuario con una cuenta en el sitio vulnerable, como los suscriptores. Algunos de estos puntos de conexión podían permitir ataques de cross-site scripting (XSS) almacenado. 

Si un ataque XSS almacenado tuviera éxito, podría permitir que actores maliciosos guardaran scripts dañinos en todas las entradas y páginas del sitio afectado. Si un administrador que ha iniciado sesión visita una de las URL afectadas, el script podría ejecutarse en su navegador y realizar acciones administrativas en su nombre, como crear nuevos administradores e instalar plugins maliciosos.

Informamos de las vulnerabilidades por correo electrónico al autor de este plugin, que recientemente ha lanzado la versión 4.0.1 para solucionarlas. Te recomendamos encarecidamente que actualices a la versión más reciente del plugin Smash Balloon Social Post Feed y que tengas una solución de seguridad establecida en tu sitio, como Jetpack Security.

Detalles

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

Las vulnerabilidades

Cross-Site Scripting almacenado mediante la actualización arbitraria de ajustes

Versiones afectadas: < 4.0.1
ID de CVE: 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, responsable de actualizar la configuración interna del plugin, no realizó ninguna comprobación de permisos ni de nonce antes de hacerlo. Esto permitía que cualquier usuario con la sesión iniciada ejecutara esta acción y actualizara cualquiera de las opciones de configuración del plugin.

Por desgracia, uno de estos ajustes customJSpermite a los administradores almacenar JavaScript personalizado en las entradas y páginas del sitio. Actualizar este ajuste habría bastado para que un atacante almacenara scripts maliciosos en el sitio.

Cronología

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

Conclusión

¡Te recomendamos que compruebes qué versión del plugin Smash Balloon Social Post Feed utiliza tu sitio y, si es inferior a la 4.0.1, que lo actualices lo antes posible! 

En Jetpack, trabajamos duro para asegurarnos de que tus sitios web estén protegidos frente a este tipo de vulnerabilidades. Te recomendamos que tengas un plan de seguridad para tu sitio que incluya análisis de archivos maliciosos y copias de seguridad. Jetpack Security es una excelente opción de seguridad de WordPress para garantizar la seguridad de tu sitio y de sus visitantes.

Créditos

Investigador original: Marc Montpas

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

Explora las ventajas de Jetpack

Descubre cómo Jetpack puede ayudarte a proteger, acelerar y hacer crecer tu sitio de WordPress.

Explorar planes

¿Tienes alguna pregunta?

La sección de comentarios está cerrada para este artículo, pero seguimos aquí para ayudarte. ¡Visita el foro de soporte y estaremos encantados de responder a tus preguntas!

Ver foro de soporte