Le 23 octobre 2020, notre équipe Threat Intelligence a divulgué de manière responsable plusieurs vulnérabilités dans Membre ultime, un plugin WordPress installé sur plus de 100 000 sites. Ces failles ont permis aux attaquants d’élever leurs privilèges à ceux d’un administrateur et de prendre le contrôle d’un site WordPress.

Nous avons initialement contacté le développeur du plugin le 23 octobre 2020. Après avoir établi un canal de communication approprié, nous avons fourni tous les détails de divulgation le 26 octobre 2020. Le développeur nous a fourni une copie du premier correctif prévu le 26 octobre 2020 pour nous de tester. Nous avons confirmé que le correctif corrigeait l’une des vulnérabilités, mais il en restait deux. Le 29 octobre 2020, le développeur du plugin nous a fourni une copie mise à jour qui corrigeait entièrement toutes les vulnérabilités. Le développeur du plugin a publié une version corrigée d’Ultimate Member, 2.1.12, le 29 octobre 2020.

Ce sont des vulnérabilités critiques et graves faciles à exploiter. Donc, nous vous recommandons fortement de mettre immédiatement à jour la version corrigée, 2.1.12.

Les utilisateurs de Wordfence Premium ont reçu une règle de pare-feu pour se protéger contre tout exploit visant ces vulnérabilités le 23 octobre 2020. Les sites utilisant toujours la version gratuite de Wordfence recevront la même protection le 22 novembre 2020.


Escalade de privilèges non authentifiée via la méta utilisateur

La description: Escalade de privilèges
Plugin concerné: Membre ultime
Plugin Slug: membre ultime
Versions concernées: <= 2.1.11
ID CVE: En attente
Score CVSS: 10,0 (CRITIQUE)
Vecteur CVSS: CVSS: 3.1 / AV: N / AC: L / PR: N / UI: N / S: C / C: H / I: H / A: H
Version entièrement corrigée: 2.1.12

Ultimate Member est un plugin populaire conçu pour améliorer l’enregistrement des utilisateurs et le contrôle des comptes sur les sites WordPress. Il permet aux propriétaires de sites de créer des rôles personnalisés et de gérer les privilèges des membres du site. Dans le cadre de ses fonctionnalités, le plugin crée automatiquement trois formulaires: enregistrement de l’utilisateur, connexion de l’utilisateur et gestion du profil de l’utilisateur.

Nous avons découvert que le formulaire d’inscription de l’utilisateur manquait de contrôles sur les données utilisateur soumises. Cet oubli a permis à un attaquant de fournir des méta clés utilisateur arbitraires pendant le processus d’enregistrement qui mettraient à jour ces méta clés dans la base de données. Cela signifiait qu’un attaquant pouvait fournir un paramètre de tableau pour les métadonnées sensibles telles que wp_capabilities user meta qui définit le rôle d’un utilisateur. Pendant le processus d’inscription, les détails d’inscription soumis ont été transmis au update_profile et toutes les métadonnées respectives soumises, indépendamment de ce qui a été soumis, seraient mises à jour pour cet utilisateur nouvellement enregistré.

do_action( 'um_before_save_registration_details', $this->id, $submitted );

			update_user_meta( $this->id, 'submitted', $submitted );

			$this->update_profile( $submitted );
function update_profile( $changes ) {

			$args['ID'] = $this->id;
$changes = apply_filters( 'um_before_update_profile', $changes, $args['ID'] );

			foreach ( $changes as $key => $value ) {
				if ( ! in_array( $key, $this->update_user_keys ) ) {
					if ( $value === 0 ) {
						update_user_meta( $this->id, $key, '0' );
					} else {
						update_user_meta( $this->id, $key, $value );
					}
				} else {
					$args[ $key ] = esc_attr( $changes[ $key ] );
				}
			}

Cela signifiait qu’un attaquant devait simplement fournir wp_capabilities[administrator] dans le cadre d’une demande d’enregistrement, et cet attaquant mettrait effectivement à jour le wp_capabilities champ avec le rôle d’administrateur. Cette simple demande accorderait un accès administrateur lors de l’inscription.

Cette vulnérabilité est considérée comme très critique car elle permet aux utilisateurs non authentifiés à l’origine d’élever facilement leurs privilèges à ceux d’un administrateur. Une fois qu’un attaquant a un accès administratif à un site WordPress, il a effectivement repris l’intégralité du site et peut effectuer n’importe quelle action, de la mise hors ligne du site à l’infection du site avec des logiciels malveillants.


Escalade de privilèges non authentifiée via les rôles d’utilisateur

La description: Escalade de privilèges
Plugin concerné: Membre ultime
Plugin Slug: membre ultime
Versions concernées: <= 2.1.11
ID CVE: En attente.
Score CVSS: 10,0 (CRITIQUE)
Vecteur CVSS: CVSS: 3.1 / AV: N / AC: L / PR: N / UI: N / S: C / C: H / I: H / A: H
Version entièrement corrigée: 2.1.12

Cette vulnérabilité est liée à la vulnérabilité précédemment détaillée. En raison du manque de filtrage sur le paramètre de rôle qui pourrait être fourni pendant le processus d’enregistrement, un attaquant pourrait fournir le paramètre de rôle avec une fonctionnalité WordPress ou tout rôle de membre ultime personnalisé et se voir effectivement accorder ces privilèges. Après avoir mis à jour la méta utilisateur, le plugin a vérifié si le paramètre de rôle était fourni. Si tel est le cas, quelques vérifications ont été effectuées pour vérifier le rôle fourni.

// update user
			if ( count( $args ) > 1 ) {
				//if isset roles argument validate role to properly for security reasons
				if ( isset( $args['role'] ) ) {
					global $wp_roles;
					$um_roles = get_option( 'um_roles' );

					if ( ! empty( $um_roles ) ) {
						$role_keys = array_map( function( $item ) {
							return 'um_' . $item;
						}, get_option( 'um_roles' ) );
					} else {
						$role_keys = array();
					}

					$exclude_roles = array_diff( array_keys( $wp_roles->roles ), array_merge( $role_keys, array( 'subscriber' ) ) );

					if ( in_array( $args['role'], $exclude_roles ) ) {
						unset( $args['role'] );
					}
				}

				wp_update_user( $args );
			}

		}

Heureusement, le plugin a bloqué la fourniture des rôles WordPress par défaut dans le paramètre de rôle, ce qui rend plus difficile pour les attaquants de pouvoir exploiter cette vulnérabilité pour obtenir des privilèges accrus. De plus, si le sélecteur de rôle était activé pour le formulaire d’inscription, seuls les rôles spécifiés par l’administrateur du site pouvaient être sélectionnés et fournis lors de l’inscription.

Cependant, cela n’a pas empêché la fourniture de rôles de membre ultime personnalisés ou de fonctionnalités WordPress individuelles avant la mise à jour du rôle d’utilisateur. Par conséquent, malgré les protections initiales, un attaquant pourrait toujours obtenir facilement des privilèges élevés.

Les attaquants pourraient énumérer les rôles de membres ultimes personnalisés actuels et fournir un rôle privilégié plus élevé lors de l’enregistrement dans le paramètre de rôle. Ou, un attaquant pourrait fournir une capacité spécifique, puis l’utiliser pour basculer vers un autre compte utilisateur avec des privilèges élevés. Dans les deux cas, si l’accès wp-admin était activé pour cet utilisateur ou ce rôle, cette vulnérabilité pourrait être utilisée en conjonction avec la vulnérabilité finale détaillée ci-dessous.

Encore une fois, cette vulnérabilité est considérée comme critique car elle permet aux utilisateurs non authentifiés à l’origine d’élever leurs privilèges sous certaines conditions. Une fois qu’un attaquant a un accès élevé à un site WordPress, il peut potentiellement prendre en charge l’intégralité du site et infecter davantage le site avec des logiciels malveillants.


Escalade des privilèges authentifiés via la mise à jour du profil

La description: Escalade de privilèges
Plugin concerné: Membre ultime
Plugin Slug: membre ultime
Versions concernées: <= 2.1.11
ID CVE: En attente.
Score CVSS: 9,9 (CRITIQUE)
Vecteur CVSS: CVSS: 3.1 / AV: N / AC: L / PR: L / UI: N / S: C / C: H / I: H / A: H
Version entièrement corrigée: 2.1.12

Cette dernière vulnérabilité a été introduite en raison d’un manque de vérification de capacité sur une mise à jour de profil. Étant donné que Ultimate Member permettait la création de nouveaux rôles, ce plugin a également permis aux administrateurs de site d’attribuer des rôles secondaires Ultimate Member à tous les utilisateurs. Cela visait à permettre à un utilisateur de disposer de privilèges par défaut pour un rôle intégré, tel que rédacteur, mais également de privilèges secondaires supplémentaires pour étendre les capacités d’un site d’adhésion en utilisant Ultimate Member. Le plugin utilise une fonction, profile_update qui s’exécute chaque fois que le profil d’un utilisateur est mis à jour pour mettre à jour le rôle de membre ultime pour un utilisateur donné. Cette fonction a utilisé is_admin() seul sans vérification de capacité, ce qui permet à tout utilisateur de fournir le champ de poste um-role et de définir son rôle sur celui de son choix.

			function profile_update( $user_id, $old_data ) {
			// Bail if no user ID was passed
			if ( empty( $user_id ) ) {
				return;
			}

			$old_roles = $old_data->roles;
			$userdata  = get_userdata( $user_id );
			$new_roles = $userdata->roles;

			if ( is_admin() ) {
				if ( ! empty( $_POST['um-role'] ) ) {
					$new_roles = array_merge( $new_roles, array( $_POST['um-role'] ) );
					if ( ! user_can( $user_id, $_POST['um-role'] ) ) {
						UM()->roles()->set_role( $user_id, $_POST['um-role'] );
					}
				}
			}
}
			}

Cela signifiait que tout utilisateur disposant d’un accès wp-admin à la page profile.php, qu’il soit explicitement autorisé ou via une autre vulnérabilité utilisée pour obtenir cet accès, pouvait fournir le paramètre um-role avec une valeur définie sur n’importe quel rôle, y compris «administrateur» lors d’une mise à jour de profil et augmenter efficacement leurs privilèges vers ceux de ce rôle.

Comme pour les vulnérabilités précédentes décrites ci-dessus, cette vulnérabilité est considérée comme critique car elle permet aux utilisateurs authentifiés d’élever leurs privilèges avec très peu de difficulté. Une fois qu’un attaquant a les privilèges d’administrateur sur un site WordPress, il a effectivement pris en charge l’ensemble du site.


Calendrier de divulgation

  • 19-23 octobre 2020 – Découverte initiale d’une vulnérabilité et enquête plus approfondie sur le plugin qui conduit à la découverte de deux autres vulnérabilités.
  • 23 octobre 2020 – Nous développons une règle de pare-feu pour protéger les clients Wordfence et la diffusons aux utilisateurs de Wordfence Premium. Nous prenons contact avec le développeur du plugin.
  • 26 octobre 2020 – Le développeur du plugin confirme la boîte de réception pour gérer la discussion. Nous envoyons une divulgation complète.
  • 26 octobre 2020 – Le développeur du plugin confirme la vulnérabilité et nous fournit une copie corrigée pour vérifier les correctifs. Nous les informons que certains défauts existent toujours.
  • 29 octobre 2020 – Le développeur du plugin nous fournit une deuxième copie corrigée pour vérifier les correctifs supplémentaires. Nous vérifions que tout a été corrigé.
  • 29 octobre 2020 – Le correctif est publié dans la version 2.1.12.
  • 22 novembre 2020 – Les utilisateurs gratuits de Wordfence reçoivent une règle de pare-feu.

Conclusion

Dans l’article d’aujourd’hui, nous avons détaillé plusieurs failles critiques d’escalade de privilèges dans Ultimate Member qui permettaient aux attaquants d’augmenter leurs privilèges de différentes manières. Ces failles ont été entièrement corrigées dans la version 2.1.12. Nous recommandons aux utilisateurs de mettre immédiatement à jour vers la dernière version disponible, qui est la version 2.1.12 au moment de cette publication.

Wordfence Premium les utilisateurs ont reçu des règles de pare-feu protégeant contre ces vulnérabilités le 23 octobre 2020, tandis que ceux qui utilisent encore la version gratuite de Wordfence recevront la même protection le 22 novembre 2020.

Si vous connaissez un ami ou un collègue qui utilise ce plugin sur son site, nous vous recommandons vivement de lui transmettre cet avis pour aider à garder ses sites protégés car il s’agit de vulnérabilités de haute gravité qui sont faciles à exploiter.


Source link