Kerentanan Ditemukan di plugin Patreon WordPress

Diterbitkan: 2021-03-26

Selama audit internal plugin Patreon untuk WordPress, tim Jetpack Scan menemukan beberapa titik lemah yang memungkinkan seseorang mengambil alih sebuah situs web.

Kerentanan ini diungkapkan kepada pembuat plugin, yang segera merilis versi 1.7.2, yang memperbaiki semua masalah ini. Jika Anda menjalankan versi plugin yang lebih lama, harap perbarui hari ini!

Baca terus untuk semua detail teknis. Jika ini melampaui kepala Anda, jangan khawatir. Kami menawarkan Jetpack Scan untuk menangani pemindaian malware dan pemutakhiran atau penghapusan otomatis untuk Anda.

Tim kami mengidentifikasi berbagai vektor serangan, termasuk Local File Disclosure, Cross-Site Request Forgery (CSRF), dan kerentanan Reflected Cross-Site Scripting (XSS).

Kerentanan Pengungkapan File Lokal adalah bug yang dapat digunakan oleh pelaku jahat untuk mendapatkan akses ke informasi penting, seperti kunci rahasia situs web dan kredensial basis data. Kerentanan Pemalsuan Skrip Lintas Situs dan Permintaan Lintas Situs yang Tercermin adalah masalah yang memungkinkan penyerang melakukan tindakan tertentu atas nama pengguna yang tidak menaruh curiga dengan menipu mereka untuk mengeklik tautan berbahaya yang dibuat dengan hati-hati.

Jika dieksploitasi, beberapa di antaranya dapat memungkinkan individu jahat mengambil alih situs web yang rentan.

Kerentanan Pengungkapan File Lokal
Versi yang Terkena Dampak: < 1.7.0
ID 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 berisi kerentanan pengungkapan file lokal yang dapat disalahgunakan oleh siapa pun yang mengunjungi situs. Dengan menggunakan vektor serangan ini, penyerang dapat membocorkan file internal penting seperti wp-config.php, yang berisi kredensial basis data dan kunci kriptografik yang digunakan dalam pembuatan nonces dan cookie.

Jika berhasil dieksploitasi, kelemahan keamanan ini dapat menyebabkan pengambilalihan situs sepenuhnya oleh aktor jahat.

XSS Tercermin pada Formulir Login
Versi yang Terkena Dampak: < 1.7.2
ID 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 mengaitkan formulir login WordPress (wp-login.php) dan menawarkan untuk memungkinkan pengguna mengautentikasi situs menggunakan akun Patreon mereka. Sayangnya, beberapa logika logging kesalahan di belakang layar memungkinkan input yang dikontrol pengguna direfleksikan pada halaman login, tidak bersih.

Agar berhasil mengeksploitasi kerentanan ini, penyerang perlu mengelabui korbannya agar mengunjungi tautan jebakan yang berisi kode Javascript berbahaya. Karena Javascript berjalan dalam konteks browser korban, penyerang dapat menyesuaikan kode yang disembunyikan di tautan itu untuk melakukan apa pun yang diizinkan oleh hak istimewa pengguna ini.

Jika serangan ini berhasil terhadap administrator, skrip dapat sepenuhnya mengambil alih situs.

Merefleksikan XSS pada tindakan AJAX 'patreon_save_attachment_patreon_level'
Versi yang Terkena Dampak: < 1.7.2
ID 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>';

Plugin ini juga menggunakan pengait AJAX untuk memperbarui tingkat janji yang diperlukan oleh pelanggan Patreon untuk mengakses lampiran yang diberikan. Tindakan ini dapat diakses oleh akun pengguna dengan hak istimewa 'manage_options' (mis., hanya administrator).

Sayangnya, salah satu parameter yang digunakan dalam titik akhir AJAX ini tidak disanitasi sebelum dicetak kembali ke pengguna, sehingga risiko yang diwakilinya sama dengan kerentanan XSS sebelumnya yang kami jelaskan.

CSRF Mengizinkan Penyerang Menimpa/Membuat Meta Pengguna
Versi yang Terkena Dampak: < 1.7.0
ID 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 );
		
	}

Beberapa titik akhir tidak memvalidasi permintaan yang diterimanya yang dikirim setelah tindakan sah dari pengguna, yang dapat Anda lakukan menggunakan nonce. Salah satu titik akhir yang tidak dilindungi ini memungkinkan individu jahat untuk membuat tautan jebakan yang akan menimpa atau membuat metadata pengguna sewenang-wenang di akun korban setelah dikunjungi.

Jika dieksploitasi, bug ini dapat digunakan untuk menimpa meta “wp_capabilities”, yang berisi peran dan hak istimewa akun pengguna yang terpengaruh. Melakukan hal ini pada dasarnya akan mengunci mereka dari situs, memblokir mereka dari mengakses konten berbayar.

CSRF Mengizinkan Penyerang Memutuskan Sambungan Situs Dari Patreon
Versi yang Terkena Dampak: < 1.7.0
ID CVE : CVE-2021-24231
CVSSv3: 6.5
CWSS: 26.1

			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;
			}
			

Yang ini mirip dengan kerentanan terakhir dalam jenis serangan yang sama (CSRF) tetapi menargetkan administrator. Vektor serangan khusus ini bekerja seperti sebelumnya. Penyerang perlu meminta administrator yang masuk untuk mengunjungi tautan yang dibuat khusus.

Karena titik akhir khusus ini dapat memutuskan situs dari Patreon, penyerang yang menargetkan vektor serangan ini juga dapat melakukan hal itu, yang akan mencegah konten baru disinkronkan ke situs.

Linimasa

  • Upaya kontak awal (tidak berhasil) – 4 Desember
  • Upaya kontak kedua – 11 Desember
  • Penulis mengakui laporan tersebut – 15 Desember
  • Versi 1.7.0 dirilis – 5 Jan
  • Kami melaporkan dua masalah XSS tambahan – 9 Maret
  • Penulis mengakui laporan kedua – 9 Maret
  • Versi 1.7.2 dirilis – 11 Maret

Kesimpulan

Kami menyarankan Anda memeriksa versi plugin Patreon-Connect saat ini yang Anda gunakan di situs Anda dan, jika bukan 1.7.2, perbarui sesegera mungkin!

Di Jetpack, kami bekerja keras untuk memastikan situs web Anda terlindungi dari jenis kerentanan ini. Untuk tetap selangkah lebih maju dari ancaman baru, lihat Jetpack Scan, yang mencakup pemindaian keamanan dan penghapusan malware otomatis.

kredit

Pengungkapan keamanan ini dimungkinkan berkat George Stephanis, Fioravante Souza, Miguel Neto, Benedict Singer, dan Marc Montpas.