Kerentanan Parah Tetap Di UpdraftPlus 1.22.3

Diterbitkan: 2022-02-18

Selama audit internal plugin UpdraftPlus, kami menemukan kerentanan unduhan cadangan sewenang-wenang yang dapat memungkinkan pengguna dengan hak istimewa rendah seperti pelanggan untuk mengunduh cadangan terbaru situs.

Jika dieksploitasi, kerentanan dapat memberi penyerang akses ke informasi istimewa dari database situs yang terpengaruh (misalnya, nama pengguna dan kata sandi yang di-hash).

Kami melaporkan kerentanan kepada pembuat plugin, dan mereka baru-baru ini merilis versi 1.22.3 untuk mengatasinya. Pembaruan otomatis paksa juga telah didorong karena parahnya masalah ini. Jika situs Anda belum melakukannya, kami sangat menyarankan Anda memperbarui ke versi terbaru (1.22.3) dan memiliki solusi keamanan yang mapan di situs Anda, seperti Jetpack Security.

Anda dapat menemukan saran UpdraftPlus sendiri di sini.

rincian

Nama Plugin: UpdraftPlus
URI Plugin: https://wordpress.org/plugins/updraftplus/
Penulis: https://updraftplus.com/

Kerentanan

Unduhan Cadangan Sewenang-wenang

Versi yang terpengaruh: Setiap versi antara 1.16.7 dan 1.22.3 (Versi gratis), dan
CVE-ID: CVE-2022-0633
ID WPVDB: d257c28f-3c7e-422b-a5c2-e618ed3c0bf3
CVSSv3.1: 8.5
CWSS: 87.6

Plugin menggunakan "nonces" dan cap waktu khusus untuk mengidentifikasi cadangan dengan aman. Mengingat pengetahuan tentang nonce dan cap waktu tersebut dapat memberi seseorang akses ke beberapa fitur plugin, memastikan info ini hanya dapat diakses oleh mereka yang benar-benar membutuhkannya sangatlah penting.

Sayangnya, seperti yang akan kami tunjukkan, bukan itu masalahnya.

Kebocoran Nonce

Pelaku pertama terletak di UpdraftPlus_Admin::process_status_in_heartbeat metode.

	/**
	 * Receive Heartbeat data and respond.
	 *
	 * Processes data received via a Heartbeat request, and returns additional data to pass back to the front end.
	 *
	 * @param array $response - Heartbeat response data to pass back to front end.
	 * @param array $data     - Data received from the front end (unslashed).
	 */
	public function process_status_in_heartbeat($response, $data) {
		if (!is_array($response) || empty($data['updraftplus'])) return $response;
		try {
			$response['updraftplus'] = $this->get_activejobs_list(UpdraftPlus_Manipulation_Functions::wp_unslash($data['updraftplus']));
		} catch (Exception $e) {
			$log_message = 'PHP Fatal Exception error ('.get_class($e).') has occurred during get active job list. Error Message: '.$e->getMessage().' (Code: '.$e->getCode().', line '.$e->getLine().' in '.$e->getFile().')';
			error_log($log_message);
			$response['updraftplus'] = array(
				'fatal_error' => true,
				'fatal_error_message' => $log_message
			);
		// @codingStandardsIgnoreLine
		} catch (Error $e) {
			$log_message = 'PHP Fatal error ('.get_class($e).') has occurred during get active job list. Error Message: '.$e->getMessage().' (Code: '.$e->getCode().', line '.$e->getLine().' in '.$e->getFile().')';
			error_log($log_message);
			$response['updraftplus'] = array(
				'fatal_error' => true,
				'fatal_error_message' => $log_message
			);
		}

		if (UpdraftPlus_Options::user_can_manage() && isset($data['updraftplus']['updraft_credentialtest_nonce'])) {
			if (!wp_verify_nonce($data['updraftplus']['updraft_credentialtest_nonce'], 'updraftplus-credentialtest-nonce')) {
				$response['updraftplus']['updraft_credentialtest_nonce'] = wp_create_nonce('updraftplus-credentialtest-nonce');
			}
		}

		$response['updraftplus']['time_now'] = get_date_from_gmt(gmdate('Y-m-d H:i:s'), 'D, F j, Y H:i');

		return $response;
	}

Itu tidak memastikan dengan benar bahwa pengguna yang mengirim permintaan detak jantung ini adalah seorang administrator (misalnya melalui fungsi seperti current_user_can), yang merupakan masalah karena hal pertama yang coba dilakukan fungsi ini adalah mengambil daftar pekerjaan pencadangan aktif melalui metode get_activejobs_list .

Dengan demikian, penyerang dapat membuat permintaan jahat yang menargetkan panggilan balik detak jantung ini untuk mendapatkan akses ke informasi tentang cadangan terbaru situs hingga saat ini, yang antara lain akan berisi nonce cadangan.

Unduh Cadangan

Ada beberapa cara untuk mengunduh cadangan di UpdraftPlus, yang sebagian besar diamankan dengan benar.

	/**
	 * Find out if the current request is a backup download request, and proceed with the download if it is
	 */
	public function maybe_download_backup_from_email() {
		global $pagenow;
		if ((!defined('DOING_AJAX') || !DOING_AJAX) && UpdraftPlus_Options::admin_page() === $pagenow && isset($_REQUEST['page']) && 'updraftplus' === $_REQUEST['page'] && isset($_REQUEST['action']) && 'updraft_download_backup' === $_REQUEST['action']) {
			$findexes = empty($_REQUEST['findex']) ? array(0) : $_REQUEST['findex'];
			$timestamp = empty($_REQUEST['timestamp']) ? '' : $_REQUEST['timestamp'];
			$nonce = empty($_REQUEST['nonce']) ? '' : $_REQUEST['nonce'];
			$type = empty($_REQUEST['type']) ? '' : $_REQUEST['type'];
			if (empty($timestamp) || empty($nonce) || empty($type)) wp_die(__('The download link is broken, you may have clicked the link from untrusted source', 'updraftplus'), '', array('back_link' => true));
			$backup_history = UpdraftPlus_Backup_History::get_history();
			if (!isset($backup_history[$timestamp]['nonce']) || $backup_history[$timestamp]['nonce'] !== $nonce) wp_die(__("The download link is broken or the backup file is no longer available", 'updraftplus'), '', array('back_link' => true));
			$this->do_updraft_download_backup($findexes, $type, $timestamp, 2, false, '');
			exit; // we don't need anything else but an exit
		}
	}
}

Sayangnya, metode UpdraftPlus_Admin::maybe_download_backup_from_email, yang terhubung ke admin_init juga tidak secara langsung memvalidasi peran pengguna.

Meskipun menerapkan beberapa pemeriksaan secara tidak langsung, seperti memeriksa variabel global $pagenow , penelitian sebelumnya menunjukkan bahwa variabel ini dapat berisi input pengguna yang berubah-ubah. Pelaku jahat dapat menggunakan titik akhir ini untuk mengunduh cadangan file & basis data berdasarkan informasi yang mereka bocorkan dari bug detak jantung yang disebutkan di atas.

Linimasa

2022-02-14 – Kontak awal dengan UpdraftPlus
2022-02-15 – Kami mengirimi mereka detail tentang kerentanan ini
2022-02-16 – UpdraftPlus 1.22.3 dirilis, pembaruan otomatis paksa diluncurkan

Kesimpulan

Kami menyarankan Anda memeriksa versi plugin UpdraftPlus yang digunakan situs Anda, dan jika berada dalam kisaran yang terpengaruh, perbarui sesegera mungkin!

Di Jetpack, kami bekerja keras untuk memastikan situs web Anda terlindungi dari jenis kerentanan ini. Kami menyarankan Anda memiliki rencana keamanan untuk situs Anda yang mencakup pemindaian dan pencadangan file berbahaya. Jetpack Security adalah salah satu opsi keamanan WordPress yang bagus untuk memastikan situs dan pengunjung Anda aman.

kredit

Peneliti asli: Marc Montpas

Terima kasih kepada tim Jetpack Scan lainnya atas umpan balik, bantuan, dan koreksinya.