Patreon WordPress eklentisinde bulunan güvenlik açıkları

Yayınlanan: 2021-03-26

WordPress için Patreon eklentisinin dahili denetimi sırasında, Jetpack Scan ekibi birinin bir web sitesini ele geçirmesine izin verecek birkaç zayıf nokta buldu.

Bu güvenlik açıkları, tüm bu sorunları gideren 1.7.2 sürümünü hemen yayınlayan eklenti yazarlarına açıklandı. Eklentinin daha eski bir sürümünü çalıştırıyorsanız, lütfen bugün güncelleyin!

Tüm teknik detaylar için okumaya devam edin. Bu kafanızı aşarsa, endişelenmeyin. Sizin için kötü amaçlı yazılım tarama ve otomatik yükseltme veya kaldırma işlemlerini gerçekleştirmek için Jetpack Scan'i sunuyoruz.

Ekibimiz, Yerel Dosya İfşası, Siteler Arası İstek Sahteciliği (CSRF) ve Yansıtılan Siteler Arası Komut Dosyası Çalıştırma (XSS) güvenlik açıkları dahil olmak üzere çeşitli saldırı vektörleri belirledi.

Yerel Dosya İfşası güvenlik açıkları, kötü niyetli kişilerin bir web sitesinin gizli anahtarları ve veritabanı kimlik bilgileri gibi kritik bilgilere erişmek için kullanabileceği hatalardır. Yansıtılan Siteler Arası Komut Dosyası Çalıştırma ve Siteler Arası İstek Sahteciliği güvenlik açıkları, saldırganların, dikkatli bir şekilde hazırlanmış kötü amaçlı bağlantıları tıklamaları için kandırarak, şüpheli olmayan kullanıcılar adına belirli eylemler gerçekleştirmesine olanak tanıyan sorunlardır.

Bunlardan bazıları istismar edilirse, kötü niyetli kişilerin savunmasız web sitelerini ele geçirmesini sağlayabilir.

Yerel Dosya İfşası Güvenlik Açığı
Etkilenen Sürümler: < 1.7.0
CVE Kimliği: 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, siteyi ziyaret eden herkes tarafından kötüye kullanılabilecek yerel bir dosya ifşa güvenlik açığı içeriyordu. Bir saldırgan, bu saldırı vektörünü kullanarak, veri tabanı kimlik bilgilerini ve nonces ve tanımlama bilgilerinin oluşturulmasında kullanılan şifreleme anahtarlarını içeren wp-config.php gibi önemli dahili dosyaları sızdırabilir.

Başarıyla kullanılırsa, bu güvenlik açığı kötü aktörler tarafından sitenin tamamen ele geçirilmesine yol açabilir.

Giriş Formuna Yansıyan XSS
Etkilenen Sürümler: < 1.7.2
CVE Kimliği: 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 oturum açma formuna (wp-login.php) bağlanır ve kullanıcıların Patreon hesaplarını kullanarak sitede kimlik doğrulaması yapmalarını sağlar. Ne yazık ki, sahnenin arkasındaki bazı hata günlüğü mantığı, kullanıcı tarafından kontrol edilen girdinin, temizlenmemiş olarak oturum açma sayfasına yansıtılmasına izin verdi.

Bu güvenlik açığından başarıyla yararlanmak için, bir saldırganın kurbanını kötü niyetli Javascript kodu içeren bubi tuzağına sahip bir bağlantıyı ziyaret etmesi için kandırması gerekir. Javascript, kurbanın tarayıcı bağlamında çalıştığından, bir saldırgan, bu kullanıcının ayrıcalıklarının kendisine izin verdiği her şeyi yapmak için bu bağlantıda gizlenen kodu ayarlayabilir.

Bu saldırı bir yöneticiye karşı başarılı olursa, komut dosyası siteyi tamamen ele geçirebilir.

AJAX eyleminde yansıtılan XSS 'patreon_save_attachment_patreon_level'
Etkilenen Sürümler: < 1.7.2
CVE Kimliği: 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>';

Eklenti ayrıca Patreon abonelerinin belirli bir eke erişmek için ihtiyaç duyduğu taahhüt seviyesini güncellemek için bir AJAX kancası kullanır. Bu eylem, 'manage_options' ayrıcalığına sahip kullanıcı hesapları için erişilebilirdir (yani, yalnızca yöneticiler).

Ne yazık ki, bu AJAX uç noktasında kullanılan parametrelerden biri, kullanıcıya geri yazdırılmadan önce temizlenmez, bu nedenle temsil ettiği risk, tanımladığımız önceki XSS güvenlik açığı ile aynıdır.

CSRF Saldırganların Kullanıcı Metalarının Üzerine Yazmasına/Oluşturmasına İzin Veriyor
Etkilenen Sürümler: < 1.7.0
CVE Kimliği: 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 );
		
	}

Bazı uç noktalar, nonces kullanarak yapabileceğiniz, bir kullanıcıdan gelen meşru bir işlemin ardından gönderilen isteği doğrulamadı. Bu korumasız uç noktalardan biri, kötü niyetli kişilerin, ziyaret edildikten sonra kurbanın hesabında rastgele kullanıcı meta verilerinin üzerine yazacak veya oluşturacak bubi tuzaklı bir bağlantı oluşturmasına izin verdi.

Bu hata istismar edilirse, etkilenen kullanıcı hesabının rollerini ve ayrıcalıklarını içeren “wp_capabilities” metasının üzerine yazmak için kullanılabilir. Bunu yapmak, onları sitenin dışında tutar ve ücretli içeriğe erişmelerini engeller.

CSRF, Saldırganların Sitelerin Patreon ile Bağlantısını Kesmesine İzin Veriyor
Etkilenen Sürümler: < 1.7.0
CVE Kimliği : 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;
			}
			

Bu, aynı tür saldırı (CSRF) olması, ancak yöneticileri hedef alması bakımından son güvenlik açığına benzer. Bu özel saldırı vektörü önceki gibi çalışır. Saldırganın, özel hazırlanmış bir bağlantıyı ziyaret etmesi için oturum açmış bir yönetici edinmesi gerekir.

Bu belirli uç nokta, bir sitenin Patreon'dan bağlantısını kesebildiğinden, bu saldırı vektörünü hedefleyen saldırganlar da tam olarak bunu yapabilir, bu da yeni içeriğin siteyle senkronize edilmesini engeller.

Zaman çizelgesi

  • İlk temas girişimi (başarısız) – 4 Aralık
  • İkinci temas girişimi – 11 Aralık
  • Yazarlar raporu onayladı – 15 Aralık
  • Sürüm 1.7.0 yayınlandı – 5 Ocak
  • İki ek XSS sorunu bildiriyoruz – 9 Mart
  • Yazarlar ikinci raporu onayladı – 9 Mart
  • Sürüm 1.7.2 yayınlandı – 11 Mart

Çözüm

Sitenizde kullandığınız Patreon-Connect eklentisinin güncel sürümünü kontrol etmenizi ve 1.7.2 değilse en kısa sürede güncellemenizi öneririz!

Jetpack'te web sitelerinizin bu tür güvenlik açıklarından korunmasını sağlamak için çok çalışıyoruz. Yeni tehditlerden bir adım önde olmak için güvenlik taraması ve otomatik kötü amaçlı yazılım temizlemeyi içeren Jetpack Scan'e göz atın.

Kredi

Bu güvenlik açıklaması George Stephanis, Fioravante Souza, Miguel Neto, Benedict Singer ve Marc Montpas sayesinde mümkün oldu.