تم العثور على ثغرات أمنية في المكون الإضافي Patreon WordPress

نشرت: 2021-03-26

أثناء التدقيق الداخلي لمكوِّن Patreon الإضافي لـ WordPress ، وجد فريق Jetpack Scan عدة نقاط ضعف من شأنها أن تسمح لشخص ما بالسيطرة على موقع ويب.

تم الكشف عن هذه الثغرات الأمنية لمؤلفي البرنامج المساعد ، الذين أصدروا على الفور الإصدار 1.7.2 ، والذي يعمل على إصلاح كل هذه المشكلات. إذا كنت تقوم بتشغيل إصدار أقدم من البرنامج المساعد ، يرجى التحديث اليوم!

تابع القراءة للحصول على جميع التفاصيل الفنية. إذا حدث هذا فوق رأسك ، فلا داعي للقلق. نحن نقدم Jetpack Scan للتعامل مع مسح البرامج الضارة والترقيات الآلية أو الإزالة نيابة عنك.

حدد فريقنا العديد من نواقل الهجوم ، بما في ذلك الكشف عن الملفات المحلية وتزوير الطلبات عبر المواقع (CSRF) ونقاط الضعف في البرمجة النصية عبر المواقع المنعكسة (XSS).

نقاط الضعف في الكشف عن الملفات المحلية هي أخطاء يمكن أن يستخدمها الفاعلون السيئون للوصول إلى المعلومات الهامة ، مثل المفاتيح السرية لموقع الويب وبيانات اعتماد قاعدة البيانات. تعد البرمجة النصية عبر المواقع المنعكسة والثغرات الأمنية المزورة عبر الموقع من المشكلات التي تمكّن المهاجمين من تنفيذ إجراءات محددة نيابة عن المستخدمين المطمئنين عن طريق خداعهم للنقر فوق الروابط الضارة المصممة بعناية.

إذا تم استغلالها ، فقد يمكّن بعض هؤلاء الأفراد الضارين من الاستيلاء على مواقع الويب المعرضة للخطر.

ثغرة أمنية في الكشف عن الملفات المحلية
الإصدارات المتأثرة: <1.7.0
معرف CVE: CVE-2021-24227
CVSSv3: 7.5
CWSS: 83.6

	public static function servePatronOnlyImage( $image=false ) {

		if ( ( !isset( $image ) OR !$image ) AND isset( $_REQUEST['patron_only_image'] ) ) {
			$image = $_REQUEST['patron_only_image'];
		}
		
		if ( !$image OR $image == '') {
			// This is not a rewritten image request. Exit.
			return;
		}

		if ( !( isset( $_REQUEST['patreon_action'] ) AND $_REQUEST['patreon_action'] == 'serve_patron_only_image' ) ) {
			return;	
		}

		$upload_locations = wp_upload_dir();

		// We want the base upload location so we can account for any changes to date based subfolders in case there are

		$upload_dir = substr( wp_make_link_relative( $upload_locations['baseurl'] ) , 1 );	

		$image = get_site_url() . '/' . $upload_dir . '/' . $image;
		
		if ( current_user_can( 'manage_options' ) ) {
			Patreon_Protect::readAndServeImage( $image );	
		}			
		
		// Below define can be defined in any plugin to bypass core locking function and use a custom one from plugin
		// It is independent of the plugin load order since it checks if it is defined.
		// It can be defined by any plugin until right before the_content filter is run.

		if ( apply_filters( 'ptrn/bypass_image_filtering', defined( 'PATREON_BYPASS_IMAGE_FILTERING' ) ) ) {
			Patreon_Protect::readAndServeImage( $image );
		}
	
		// Check if the image is protected:

		$attachment_id = attachment_url_to_postid( $image );
	
		// attachment_url_to_postid returns 0 if it cant find the attachment post id
		
		if ( $attachment_id == 0 ) {
			
			// Couldnt determine attachment post id. Try to get id from thumbnail
			$attachment_id = Patreon_Protect::getAttachmentIDfromThumbnailURL( $image );
	
			//No go. Have to get out and serve the image normally
			if ( $attachment_id == 0 OR !$attachment_id ) {
				Patreon_Protect::readAndServeImage( $image );

احتوى Patreon-Connect على ثغرة أمنية في الكشف عن ملف محلي يمكن أن يسيء استخدامها أي شخص يزور الموقع. باستخدام متجه الهجوم هذا ، يمكن للمهاجم تسريب ملفات داخلية مهمة مثل wp-config.php ، والتي تحتوي على بيانات اعتماد قاعدة البيانات ومفاتيح التشفير المستخدمة في إنشاء ملفات تعريف الارتباط و nonces.

إذا تم استغلال هذا الخلل الأمني ​​بنجاح ، فقد يؤدي إلى استيلاء جهات سيئة على الموقع بالكامل.

ينعكس XSS في نموذج تسجيل الدخول
الإصدارات المتأثرة: <1.7.2
معرف CVE: CVE-2021-24228
CVSSv3: 8.8
CWSS: 80.6

	public static function processPatreonMessages() {
		
		$patreon_error = '';
		if ( isset( $_REQUEST['patreon_error'] ) ) {
			
			// If any specific error message is sent from Patreon, prepare it
			$patreon_error = ' - Patreon returned: ' . $_REQUEST['patreon_error'];
			
		}

		if ( isset( $_REQUEST['patreon_message'] ) ) {
			
			return '<p class="patreon_message">' . apply_filters( 'ptrn/error_message', self::$messages_map[ $_REQUEST['patreon_message'] ] . $patreon_error ) . '</p>';

يربط Patreon-Connect نموذج تسجيل الدخول إلى WordPress (wp-login.php) ويعرض السماح للمستخدمين بالمصادقة على الموقع باستخدام حساب Patreon الخاص بهم. لسوء الحظ ، سمح بعض منطق تسجيل الأخطاء وراء الكواليس بانعكاس الإدخال الذي يتحكم فيه المستخدم في صفحة تسجيل الدخول ، غير المصححة.

لاستغلال هذه الثغرة الأمنية بنجاح ، يحتاج المهاجم إلى خداع ضحيته لزيارة رابط مفخخ يحتوي على شفرة جافا سكريبت ضارة. نظرًا لأن Javascript يعمل في سياق متصفح الضحية ، يمكن للمهاجم ضبط الشفرة المخفية في هذا الرابط للقيام بأي شيء تسمح له امتيازات هذا المستخدم بذلك.

إذا نجح هذا الهجوم ضد مسؤول ، يمكن للبرنامج النصي السيطرة على الموقع بالكامل.

انعكاس XSS على إجراء AJAX "patreon_save_attachment_patreon_level"
الإصدارات المتأثرة: <1.7.2
معرف CVE: CVE-2021-24229
CVSSv3: 8.8
CWSS: 80.6

		$args = array (
			'attachment_id' => $attachment_id,
			'patreon_level' => $_REQUEST['patreon_attachment_patreon_level'],
			'message' => $message,
		);
		
		echo self::make_image_lock_interface( $args	);
	public function make_image_lock_interface( $args = array() ) {
		
		$interface = '';
		
		$interface .=  '<div class="patreon_image_lock_modal_content">';
		$interface .=  '<span class="patreon_image_lock_modal_close">&times;</span>';

		$interface .=  ' <form id="patreon_attachment_patreon_level_form" action="/wp-admin/admin-ajax.php" method="post">';
		$interface .=  '<h1 class="patreon_image_locking_interface_heading">Lock Image</h1>';
		$interface .=  '<div class="patreon_image_locking_interface_level">';
		$interface .=  '<span class="patreon_image_locking_interface_input_prefix">$<input id="patreon_attachment_patreon_level" type="text" name="patreon_attachment_patreon_level" value="' . $args['patreon_level'] . '" / ></span>';

يستخدم المكون الإضافي أيضًا خطاف AJAX لتحديث مستوى التعهد المطلوب من قبل مشتركي Patreon للوصول إلى مرفق معين. يمكن الوصول إلى هذا الإجراء لحسابات المستخدمين بامتياز "إدارة_خيارات" (على سبيل المثال ، المسؤولون فقط).

لسوء الحظ ، لم يتم تطهير إحدى المعلمات المستخدمة في نقطة نهاية AJAX هذه قبل إعادة طباعتها مرة أخرى إلى المستخدم ، وبالتالي فإن الخطر الذي تمثله هو نفس مشكلة عدم حصانة XSS السابقة التي وصفناها.

CSRF السماح للمهاجمين بالكتابة فوق / إنشاء بيانات تعريف المستخدم
الإصدارات المتأثرة: <1.7.0
معرّف CVE: CVE-2021-24230
CVSSv3: 6.5
CWSS: 42

	public function toggle_option() {
		
		if( !( is_admin() && current_user_can( 'manage_options' ) ) ) {
			return;
		}
		
		$current_user = wp_get_current_user();
		
		$option_to_toggle = $_REQUEST['toggle_id'];
		
		$current_value = get_user_meta( $current_user->ID, $option_to_toggle, true );
		
		$new_value = 'off';
		
		if( !$current_value OR $current_value == 'off' ) {
			$new_value = 'on';			
		}
		
		update_user_meta( $current_user->ID, $option_to_toggle, $new_value );
		
	}

لم تتحقق بعض نقاط النهاية من صحة الطلب الذي تم إرساله بعد إجراء شرعي من المستخدم ، والذي يمكنك القيام به باستخدام nonces. سمحت إحدى نقاط النهاية غير المحمية هذه للأفراد الأشرار بصياغة رابط مفخخ من شأنه استبدال أو إنشاء بيانات وصفية تعسفية للمستخدم على حساب الضحية بمجرد زيارته.

إذا تم استغلال هذا الخطأ ، يمكن استخدامه للكتابة فوق "wp_capabilities" الوصفية ، والتي تحتوي على امتيازات وأدوار حساب المستخدم المتأثر. سيؤدي القيام بذلك بشكل أساسي إلى منعهم من الخروج من الموقع ، ومنعهم من الوصول إلى المحتوى المدفوع.

CSRF يسمح للمهاجمين بفصل المواقع عن Patreon
الإصدارات المتأثرة: <1.7.0
معرف CVE : CVE-2021-24231
CVSSv3: 6.5
CWSS: 26.1.2

			if ( isset( $_REQUEST['patreon_wordpress_action'] ) AND $_REQUEST['patreon_wordpress_action'] == 'disconnect_site_from_patreon' AND is_admin() AND current_user_can( 'manage_options' ) ) {

			// Admin side, user is admin level. Perform action:
			
			// To disconnect the site from a particular creator account, we will delete all options related to creator account, but we will leave other plugin settings and post gating values untouched
			
			$options_to_delete = array(
				'patreon-custom-page-name',
				'patreon-fetch-creator-id',
				'patreon-creator-tiers',
				'patreon-creator-last-name',
				'patreon-creator-first-name',
				'patreon-creator-full-name',
				'patreon-creator-url',
				'patreon-campaign-id',
				'patreon-creators-refresh-token-expiration',
				'patreon-creator-id',
				'patreon-setup-wizard-last-call-result',
				'patreon-creators-refresh-token',
				'patreon-creators-access-token',
				'patreon-client-secret',
				'patreon-client-id',
				'patreon-setup_is_being_done',
				'patreon-setup-done',
				'patreon-currency-sign',
			);
			
			// Ask the API to delete this client:
			
			$creator_access_token = get_option( 'patreon-creators-access-token', false );
			$client_id 			  = get_option( 'patreon-client-id', false );
				
			// Exceptions until v1 v2 transition is complete
			
			$api_version = get_option( 'patreon-installation-api-version' );

			if ( $api_version == '1' ) {

				// Delete override - proceed with deleting local options
				
				foreach ( $options_to_delete as $key => $value ) {
					delete_option( $options_to_delete[$key] );
				}
				
				update_option( 'patreon-installation-api-version', '2' );
				update_option( 'patreon-can-use-api-v2', true );
				
				wp_redirect( admin_url( 'admin.php?page=patreon_wordpress_setup_wizard&setup_stage=reconnect_0') );
				exit;
			}
			

يشبه هذا الثغرة الأمنية الأخيرة من حيث أنه نفس نوع الهجوم (CSRF) ولكنه يستهدف المسؤولين. يعمل متجه الهجوم هذا مثل السابق. يحتاج المهاجم إلى الحصول على مسؤول قام بتسجيل الدخول لزيارة ارتباط تم إنشاؤه خصيصًا.

نظرًا لأن نقطة النهاية المحددة هذه يمكنها فصل أحد المواقع عن Patreon ، فإن المهاجمين الذين يستهدفون متجه الهجوم هذا يمكنهم أيضًا فعل ذلك بالضبط ، مما قد يمنع مزامنة المحتوى الجديد مع الموقع.

الجدول الزمني

  • محاولة الاتصال الأولية (غير ناجحة) - 4 كانون الأول (ديسمبر)
  • محاولة الاتصال الثانية - 11 ديسمبر
  • الكتاب تقر التقرير - 15 ديسمبر
  • تم إصدار الإصدار 1.7.0 - 5 يناير
  • أبلغنا عن مشكلتين إضافيتين لـ XSS - 9 مارس
  • واعترف المؤلفون بالتقرير الثاني - 9 مارس
  • تم إصدار الإصدار 1.7.2 - 11 مارس

خاتمة

نوصيك بالتحقق من الإصدار الحالي من المكون الإضافي Patreon-Connect الذي تستخدمه على موقعك ، وإذا لم يكن الأمر 1.7.2 ، فقم بتحديثه في أقرب وقت ممكن!

في Jetpack ، نعمل بجد للتأكد من حماية مواقع الويب الخاصة بك من هذه الأنواع من الثغرات الأمنية. للبقاء متقدمًا بخطوة واحدة على أي تهديدات جديدة ، تحقق من Jetpack Scan ، والذي يتضمن فحصًا أمنيًا وإزالة البرامج الضارة تلقائيًا.

الاعتمادات

أصبح هذا الكشف الأمني ​​ممكنًا بفضل جورج ستيفانيس وفيرافانتي سوزا وميغيل نيتو وبنديكت سينجر ومارك مونباس.