Schwachstellen im Patreon-WordPress-Plugin gefunden

Veröffentlicht: 2021-03-26

Bei einem internen Audit des Patreon-Plugins für WordPress hat das Team von Jetpack Scan mehrere Schwachstellen gefunden, die es jemandem ermöglichen würden, eine Website zu übernehmen.

Diese Schwachstellen wurden den Plugin-Autoren offengelegt, die umgehend Version 1.7.2 veröffentlichten, die alle diese Probleme behebt. Wenn Sie eine ältere Version des Plugins verwenden, aktualisieren Sie bitte noch heute!

Lesen Sie weiter für alle technischen Details. Wenn Ihnen das über den Kopf wächst, machen Sie sich keine Sorgen. Wir bieten Jetpack Scan an, um Malware-Scans und automatisierte Upgrades oder Entfernungen für Sie durchzuführen.

Unser Team identifizierte verschiedene Angriffsvektoren, darunter Local File Disclosure, Cross-Site Request Forgery (CSRF) und Reflected Cross-Site Scripting (XSS) Schwachstellen.

Local File Disclosure-Schwachstellen sind Fehler, die Angreifer ausnutzen können, um Zugang zu kritischen Informationen zu erhalten, wie z. B. den geheimen Schlüsseln einer Website und Datenbank-Anmeldeinformationen. Reflected Cross-Site Scripting und Cross-Site Request Forgery-Schwachstellen sind Probleme, die es Angreifern ermöglichen, bestimmte Aktionen im Namen ahnungsloser Benutzer auszuführen, indem sie sie dazu verleiten, auf sorgfältig gestaltete bösartige Links zu klicken.

Wenn sie ausgenutzt werden, könnten einige davon böswilligen Personen ermöglichen, anfällige Websites zu übernehmen.

Schwachstelle bei der Offenlegung lokaler Dateien
Betroffene Versionen: < 1.7.0
CVE-ID: 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 enthielt eine Schwachstelle zur Offenlegung lokaler Dateien, die von jedem Besucher der Website missbraucht werden konnte. Mit diesem Angriffsvektor könnte ein Angreifer wichtige interne Dateien wie wp-config.php durchsickern lassen, die Datenbankanmeldeinformationen und kryptografische Schlüssel enthalten, die bei der Generierung von Nonces und Cookies verwendet werden.

Bei erfolgreicher Ausnutzung könnte diese Sicherheitslücke zu einer vollständigen Übernahme der Website durch schlechte Akteure führen.

Reflektiertes XSS im Anmeldeformular
Betroffene Versionen: < 1.7.2
CVE-ID: 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 hängt sich in das WordPress-Anmeldeformular (wp-login.php) ein und bietet Benutzern die Möglichkeit, sich mit ihrem Patreon-Konto auf der Website zu authentifizieren. Leider ermöglichte ein Teil der Fehlerprotokollierungslogik hinter den Kulissen, dass benutzergesteuerte Eingaben ungesäubert auf der Anmeldeseite widergespiegelt wurden.

Um diese Schwachstelle erfolgreich auszunutzen, muss ein Angreifer sein Opfer dazu verleiten, einen mit Sprengfallen versehenen Link zu besuchen, der schädlichen Javascript-Code enthält. Da Javascript im Browserkontext des Opfers ausgeführt wird, kann ein Angreifer den in diesem Link versteckten Code so anpassen, dass er alles tut, was die Privilegien dieses Benutzers ihm erlauben.

Gelingt dieser Angriff gegen einen Administrator, kann das Skript die Seite vollständig übernehmen.

Reflektiertes XSS auf AJAX-Aktion 'patreon_save_attachment_patreon_level'
Betroffene Versionen: < 1.7.2
CVE-ID: 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>';

Das Plugin verwendet auch einen AJAX-Hook, um die von Patreon-Abonnenten benötigte Unterstützungsstufe zu aktualisieren, um auf einen bestimmten Anhang zugreifen zu können. Diese Aktion ist für Benutzerkonten mit der Berechtigung „manage_options“ (dh nur Administratoren) zugänglich.

Leider wird einer der in diesem AJAX-Endpunkt verwendeten Parameter nicht bereinigt, bevor er an den Benutzer zurückgesendet wird, sodass das Risiko, das er darstellt, das gleiche ist wie bei der zuvor beschriebenen XSS-Schwachstelle.

CSRF ermöglicht es Angreifern, Benutzer-Meta zu überschreiben/erstellen
Betroffene Versionen: < 1.7.0
CVE-ID: 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 );
		
	}

Einige Endpunkte haben die empfangene Anfrage nicht validiert, da sie nach einer legitimen Aktion eines Benutzers gesendet wurde, was Sie mit Nonces tun können. Einer dieser ungeschützten Endpunkte ermöglichte es böswilligen Personen, einen mit Sprengfallen versehenen Link zu erstellen, der nach dem Besuch willkürliche Benutzermetadaten auf dem Konto des Opfers überschreibt oder erstellt.

Wenn er ausgenutzt wird, kann dieser Fehler verwendet werden, um das „wp_capabilities“-Meta zu überschreiben, das die Rollen und Berechtigungen des betroffenen Benutzerkontos enthält. Dies würde sie im Wesentlichen von der Website aussperren und sie daran hindern, auf kostenpflichtige Inhalte zuzugreifen.

CSRF ermöglicht es Angreifern, Websites von Patreon zu trennen
Betroffene Versionen: < 1.7.0
CVE-ID : 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;
			}
			

Diese ähnelt der letzten Schwachstelle insofern, als es sich um die gleiche Art von Angriff (CSRF) handelt, aber auf Administratoren abzielt. Dieser spezielle Angriffsvektor funktioniert wie der vorherige. Ein Angreifer muss einen angemeldeten Administrator dazu bringen, einen speziell gestalteten Link zu besuchen.

Da dieser spezifische Endpunkt eine Website von Patreon trennen kann, können Angreifer, die auf diesen Angriffsvektor abzielen, genau das tun, was verhindern würde, dass neue Inhalte mit der Website synchronisiert werden.

Zeitleiste

  • Erster Kontaktversuch (erfolglos) – 4. Dezember
  • Zweiter Kontaktversuch – 11. Dezember
  • Die Autoren erkennen den Bericht an – 15. Dezember
  • Version 1.7.0 wird veröffentlicht – 5. Januar
  • Wir melden zwei weitere XSS-Probleme – 9. März
  • Die Autoren bestätigen den zweiten Bericht – 9. März
  • Version 1.7.2 wird veröffentlicht – 11. März

Fazit

Wir empfehlen Ihnen, die aktuelle Version des Patreon-Connect-Plug-ins, das Sie auf Ihrer Website verwenden, zu überprüfen und, falls nicht 1.7.2, so schnell wie möglich zu aktualisieren!

Bei Jetpack arbeiten wir hart daran sicherzustellen, dass Ihre Websites vor dieser Art von Schwachstellen geschützt sind. Um neuen Bedrohungen immer einen Schritt voraus zu sein, sehen Sie sich Jetpack Scan an, der Sicherheitsscans und automatische Malware-Entfernung umfasst.

Kredite

Diese Sicherheitsoffenlegung wurde ermöglicht durch George Stephanis, Fioravante Souza, Miguel Neto, Benedict Singer und Marc Montpas.