Problemi di sicurezza corretti nel plug-in del feed dei post social di Smash Balloon

Pubblicato: 2021-10-29

Durante un audit interno del plug-in Smash Balloon Social Post Feed (noto anche come feed Facebook personalizzato), abbiamo scoperto che diversi endpoint AJAX sensibili erano accessibili a tutti gli utenti con un account sul sito vulnerabile, come gli abbonati. Alcuni di questi endpoint potrebbero consentire il verificarsi di attacchi XSS (Stored Cross-Site Scripting).

Un attacco Stored XSS riuscito potrebbe consentire ai malintenzionati di archiviare script dannosi su ogni post e pagina del sito interessato. Se un amministratore che ha effettuato l'accesso visita uno degli URL interessati, lo script potrebbe essere eseguito sul suo browser ed eseguire azioni amministrative per suo conto, come la creazione di nuovi amministratori e l'installazione di plug-in non autorizzati.

Abbiamo segnalato le vulnerabilità all'autore di questo plug-in via e-mail e di recente hanno rilasciato la versione 4.0.1 per risolverle. Ti consigliamo vivamente di aggiornare all'ultima versione del plug-in Smash Balloon Social Post Feed e di disporre di una soluzione di sicurezza consolidata sul tuo sito, come Jetpack Security.

Dettagli

Nome del plugin: Smash Balloon Social Post Feed
URI del plug-in: https://wordpress.org/plugins/custom-facebook-feed/
Autore: Smash Balloon
URI dell'autore: https://smashballoon.com/

Le vulnerabilità

Script tra siti archiviati tramite aggiornamento delle impostazioni arbitrarie

Versioni interessate: < 4.0.1
ID CVE: CVE-2021-24918
CVSSv3.1: 7.3
CCSS: 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()
                ) );
        }

L'azione AJAX wp_ajax_cff_save_settings , che è responsabile dell'aggiornamento delle impostazioni interne del plugin, non ha eseguito alcun controllo di privilegio o nonce prima di farlo. Ciò ha consentito a tutti gli utenti che hanno effettuato l'accesso di chiamare questa azione e aggiornare le impostazioni del plug-in.

Sfortunatamente, una di queste impostazioni, customJS , consente agli amministratori di memorizzare JavaScript personalizzato nei post e nelle pagine del proprio sito. L'aggiornamento di questa impostazione è tutto ciò che sarebbe servito a un malintenzionato per archiviare script dannosi sul sito.

Sequenza temporale

14-10-2021 – Primo contatto con Smash Balloon
18-10-2021 – Inviamo loro i dettagli su queste vulnerabilità
21-10-2021 – Viene rilasciato Smash Balloon Social Post Feed 4.0.1

Conclusione

Ti consigliamo di controllare quale versione del plug-in Smash Balloon Social Post Feed sta utilizzando il tuo sito e, se è inferiore alla 4.0.1, aggiornala il prima possibile!

In Jetpack, lavoriamo sodo per assicurarci che i tuoi siti Web siano protetti da questo tipo di vulnerabilità. Ti consigliamo di disporre di un piano di sicurezza per il tuo sito che includa la scansione e il backup di file dannosi. Jetpack Security è un'ottima opzione di sicurezza di WordPress per garantire la sicurezza del tuo sito e dei visitatori.

Crediti

Ricercatore originale: Marc Montpas

Grazie al resto del team di Jetpack Scan per feedback, aiuto e correzioni.