ปัญหาด้านความปลอดภัยได้รับการแก้ไขในปลั๊กอินฟีดโพสต์โซเชียล Smash Balloon

เผยแพร่แล้ว: 2021-10-29

ระหว่างการตรวจสอบภายในของปลั๊กอิน Smash Balloon Social Post Feed (หรือที่รู้จักในชื่อ Custom Facebook Feed) เราพบว่าปลายทาง AJAX ที่ละเอียดอ่อนหลายจุดสามารถเข้าถึงได้โดยผู้ใช้ที่มีบัญชีในไซต์ที่มีช่องโหว่ เช่น สมาชิก ปลายทางเหล่านี้บางส่วนสามารถเปิดใช้งานการโจมตี Stored Cross-Site Scripting (XSS) ได้

การโจมตี Stored XSS ที่ประสบความสำเร็จอาจทำให้ผู้ไม่หวังดีสามารถจัดเก็บสคริปต์ที่เป็นอันตรายในทุกโพสต์และหน้าของไซต์ที่ได้รับผลกระทบ หากผู้ดูแลระบบที่เข้าสู่ระบบเข้าเยี่ยมชมหนึ่งใน URL ที่ได้รับผลกระทบ สคริปต์อาจทำงานบนเบราว์เซอร์และดำเนินการดูแลระบบในนามของพวกเขา เช่น การสร้างผู้ดูแลระบบใหม่และการติดตั้งปลั๊กอินปลอม

เรารายงานช่องโหว่ไปยังผู้เขียนปลั๊กอินนี้ทางอีเมล และเพิ่งเปิดตัวเวอร์ชัน 4.0.1 เพื่อแก้ไข เราขอแนะนำให้คุณอัปเดตเป็นเวอร์ชันล่าสุดของปลั๊กอิน Smash Balloon Social Post Feed และมีโซลูชันการรักษาความปลอดภัยที่สร้างขึ้นบนไซต์ของคุณ เช่น Jetpack Security

รายละเอียด

ชื่อปลั๊กอิน: Smash Balloon Social Post Feed
URI ของปลั๊กอิน: https://wordpress.org/plugins/custom-facebook-feed/
ผู้เขียน: Smash Balloon
ผู้เขียน URI: https://smashballoon.com/

จุดอ่อน

การจัดเก็บสคริปต์ข้ามไซต์ผ่านการอัปเดตการตั้งค่าโดยพลการ

เวอร์ชันที่ได้รับผลกระทบ: < 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()
                ) );
        }

การกระทำ wp_ajax_cff_save_settings AJAX ซึ่งรับผิดชอบในการอัปเดตการตั้งค่าภายในของปลั๊กอิน ไม่ได้ทำการตรวจสอบสิทธิ์หรือ nonce ก่อนดำเนินการดังกล่าว ซึ่งทำให้ผู้ใช้ที่เข้าสู่ระบบสามารถเรียกการดำเนินการนี้และอัปเดตการตั้งค่าของปลั๊กอินได้

ขออภัย customJS หนึ่งในการตั้งค่าเหล่านี้ ช่วยให้ผู้ดูแลระบบสามารถจัดเก็บ JavaScript ที่กำหนดเองในโพสต์และหน้าของเว็บไซต์ได้ การอัปเดตการตั้งค่านี้เป็นเพียงการดำเนินการสำหรับผู้ไม่หวังดีในการจัดเก็บสคริปต์ที่เป็นอันตรายบนไซต์

เส้นเวลา

2021-10-14 – การติดต่อครั้งแรกกับ Smash Balloon
2021-10-18 – เราส่งรายละเอียดเกี่ยวกับช่องโหว่เหล่านี้ไปให้พวกเขา
2021-10-21 – Smash Balloon Social Post Feed 4.0.1 เปิดตัว

บทสรุป

เราขอแนะนำให้คุณตรวจสอบว่าไซต์ของคุณใช้ปลั๊กอิน Smash Balloon Social Post Feed เวอร์ชันใด และหากน้อยกว่า 4.0.1 ให้อัปเดตโดยเร็วที่สุด!

ที่ Jetpack เราทำงานอย่างหนักเพื่อให้แน่ใจว่าเว็บไซต์ของคุณได้รับการปกป้องจากช่องโหว่ประเภทนี้ เราขอแนะนำให้คุณมีแผนความปลอดภัยสำหรับไซต์ของคุณที่มีการสแกนไฟล์ที่เป็นอันตรายและการสำรองข้อมูล Jetpack Security เป็นหนึ่งในตัวเลือกการรักษาความปลอดภัย WordPress ที่ยอดเยี่ยมเพื่อให้แน่ใจว่าไซต์และผู้เยี่ยมชมของคุณปลอดภัย

เครดิต

นักวิจัยต้นฉบับ: Marc Montpas

ขอขอบคุณทีมงาน Jetpack Scan ที่เหลือสำหรับความคิดเห็น ความช่วยเหลือ และการแก้ไข