Le 23 mars 2020, notre équipe Threat Intelligence a découvert 2 vulnérabilités dans Plugin SEO WordPress – Classement des mathématiques, un plugin WordPress avec plus de 200 000 installations. La vulnérabilité la plus critique permettait à un attaquant non authentifié de mettre à jour des métadonnées arbitraires, ce qui incluait la possibilité d’accorder ou de révoquer des privilèges administratifs pour tout utilisateur enregistré sur le site. La deuxième vulnérabilité a permis à un attaquant non authentifié de créer des redirections depuis presque n’importe quel emplacement du site vers la destination de son choix.

Nous avons contacté le développeur du plugin le lendemain, le 24 mars 2020, et avons reçu une réponse dans les 24 heures. Nous avons divulgué en privé tous les détails de la vulnérabilité le 25 mars 2020 et le développeur du plugin a publié un correctif le 26 mars 2020. Nous vous recommandons vivement de mettre à jour vers la dernière version, 1.0.41.1, dès que possible car cela est considéré comme une sécurité critique. problème.

Les clients Wordfence Premium ont reçu une nouvelle règle de pare-feu le 24 mars 2020 pour se protéger contre les exploits ciblant cette vulnérabilité. Les utilisateurs de Wordfence utilisant toujours la version gratuite recevront la règle après trente jours le 23 avril 2020.


Plugin WordPress SEO – Rank Math est un plugin WordPress conçu pour aider à l’optimisation des moteurs de recherche, et il a un certain nombre de fonctionnalités pour le faire plus facilement, y compris la possibilité de mettre à jour les métadonnées sur les publications. Pour ajouter cette fonctionnalité, le plug-in a enregistré un point de terminaison REST-API, rankmath/v1/updateMeta, qui n’a pas inclus de permission_callback utilisé pour la vérification des capacités.

La route REST vulnérable:

		register_rest_route(
			$this->namespace,
			'/updateMeta',
			[
				'methods'  => WP_REST_Server::CREATABLE,
				'callback' => [ $this, 'update_metadata' ],
				'args'     => $this->get_update_metadata_args(),
			]
		);

Le point final appelé une fonction, update_metadata qui pourrait être utilisé pour mettre à jour le slug sur les publications existantes, ou pourrait être utilisé pour supprimer ou mettre à jour les métadonnées des publications, des commentaires et des termes. Ce point de terminaison a également permis de mettre à jour les métadonnées pour les utilisateurs, conduisant à cette vulnérabilité critique.

le update_metadata une fonction:

	public function update_metadata( WP_REST_Request $request ) {
		$object_id   = $request->get_param( 'objectID' );
		$object_type = $request->get_param( 'objectType' );
		$meta        = $request->get_param( 'meta' );

		$new_slug = true;
		if ( isset( $meta['permalink'] ) && ! empty( $meta['permalink'] ) ) {
			$post     = get_post( $object_id );
			$new_slug = wp_unique_post_slug( $meta['permalink'], $post->ID, $post->post_status, $post->post_type, $post->post_parent );
			wp_update_post(
				[
					'ID'        => $object_id,
					'post_name' => $new_slug,
				]
			);
			unset( $meta['permalink'] );
		}

		$sanitizer = Sanitize::get();
		foreach ( $meta as $meta_key => $meta_value ) {
			if ( empty( $meta_value ) ) {
				delete_metadata( $object_type, $object_id, $meta_key );
				continue;
			}

			update_metadata( $object_type, $object_id, $meta_key, $sanitizer->sanitize( $meta_key, $meta_value ) );
		}

		return $new_slug;
	}

Les autorisations utilisateur WordPress sont stockées dans le usermeta , ce qui signifiait qu’un attaquant non authentifié pouvait accorder à n’importe quel utilisateur enregistré des privilèges administratifs en envoyant un $_POST demande à wp-json/rankmath/v1/updateMeta, avec un objectID paramètre défini sur l’ID utilisateur à modifier, un objectType paramètre défini sur user, une meta[wp_user_level] paramètre défini sur 10, et un meta[wp_capabilities][administrator] paramètre défini sur 1.

Alternativement, un attaquant pourrait révoquer complètement les privilèges d’un administrateur existant en envoyant une requête similaire avec un meta[wp_user_level] paramètre et un meta[wp_capabilities] paramètre défini sur des valeurs vides. Étant donné que de nombreux sites ont un seul administrateur avec un ID utilisateur de 1, cela signifiait qu’un attaquant pouvait verrouiller un administrateur de son propre site.

Notez que ces attaques ne sont que les possibilités les plus critiques. En fonction des autres plugins installés sur un site, la possibilité de mettre à jour les métadonnées de publication, de terme et de commentaire pourrait potentiellement être utilisée pour de nombreux autres exploits tels que Cross-Site Scripting (XSS).


Le plugin WordPress SEO – Plugin Rank Math comprend un certain nombre de modules facultatifs, y compris un module qui peut être utilisé pour créer des redirections sur un site. Pour ajouter cette fonctionnalité, le plug-in a enregistré un point de terminaison REST-API, rankmath/v1/updateRedirection, qui encore une fois n’a pas inclus un permission_callback pour la vérification des capacités.

La route REST vulnérable:

		register_rest_route(
			$this->namespace,
			'/updateRedirection',
			[
				'methods'  => WP_REST_Server::CREATABLE,
				'callback' => [ $this, 'update_redirection' ],
			]
		);

Le point final appelé une fonction, update_redirection, qui pourrait être utilisé pour créer de nouvelles redirections ou modifier des redirections existantes, avec une limitation importante. La redirection n’a pas pu être définie vers un fichier ou un dossier existant sur le serveur, y compris la page principale du site. Cela a limité les dommages dans une certaine mesure en ce sens que, même si un attaquant pouvait créer une redirection à partir de la plupart des emplacements sur le site, y compris de nouveaux emplacements, ou de toute publication ou page existante autre que la page d’accueil, il ne pouvait pas rediriger les visiteurs immédiatement en accédant au site.

le update_redirection une fonction:

	public function update_redirection( WP_REST_Request $request ) {
		$cmb     = new stdClass;
		$metabox = new RankMathRedirectionsMetabox;

		$cmb->object_id    = $request->get_param( 'objectID' );
		$cmb->data_to_save = [
			'has_redirect'            => $request->get_param( 'hasRedirect' ),
			'redirection_id'          => $request->get_param( 'redirectionID' ),
			'redirection_url_to'      => $request->get_param( 'redirectionUrl' ),
			'redirection_sources'     => str_replace( home_url( '/' ), '', $request->get_param( 'redirectionSources' ) ),
			'redirection_header_code' => $request->get_param( 'redirectionType' ) ? $request->get_param( 'redirectionType' ) : 301,
		];

		if ( false === $request->get_param( 'hasRedirect' ) ) {
			unset( $cmb->data_to_save['redirection_url_to'] );
		}

		if ( empty( $request->get_param( 'redirectionID' ) ) ) {
			unset( $cmb->data_to_save['redirection_id'] );
		}

		return $metabox->save_advanced_meta( $cmb );
	}

Pour effectuer cette attaque, un attaquant non authentifié pourrait envoyer un $_POST demande à rankmath/v1/updateRedirection avec un redirectionUrl ensemble de paramètres à l’emplacement où la redirection doit être effectuée, un redirectionSources paramètre défini sur l’emplacement à partir duquel rediriger, et un hasRedirect paramètre défini sur true. Cette attaque pourrait être utilisée pour empêcher l’accès à tout le contenu existant d’un site, à l’exception de la page d’accueil, en redirigeant les visiteurs vers un site malveillant.

Protection des points de terminaison REST-API

La fonctionnalité REST-API de WordPress offre une grande flexibilité aux développeurs de plugins. Bien sûr, cette flexibilité s’accompagne d’une grande responsabilité. Si votre plugin utilise l’API REST, assurez-vous d’inclure un permission_callback sur tous les terminaux que vous ne souhaitez pas mettre à la disposition du public, mais sachez que cela nécessite également qu’un wp_rest nonce être généré et envoyé avec toutes les demandes au point de terminaison protégé.

Calendrier de divulgation

23 mars 2020 – Wordfence Threat Intelligence découvre et analyse les vulnérabilités.
24 mars 2020– Premier contact avec l’équipe de développeurs du plugin. Règle de pare-feu publiée pour les utilisateurs de Wordfence Premium.
25 mars 2020 – Le développeur du plugin confirme la boîte de réception appropriée pour gérer la discussion. Divulgation complète de la vulnérabilité envoyée.
26 mars 2020 – Version corrigée du plugin publiée.
23 avril 2020 – La règle de pare-feu devient disponible pour les utilisateurs gratuits de Wordfence.

Conclusion

Dans l’article d’aujourd’hui, nous avons discuté de 2 vulnérabilités causées par des points de terminaison d’API REST non protégés dans le plugin WordPress SEO Plugin – Rank Math. Ces vulnérabilités ont été entièrement corrigées dans la version 10.0.41, et nous recommandons fortement à tous les utilisateurs de ce plugin de passer immédiatement à la dernière version disponible. Sites en cours d’exécution Wordfence Premium sont protégés contre ces vulnérabilités depuis le 24 mars 2020. Les sites exécutant la version gratuite de Wordfence recevront la mise à jour des règles de pare-feu le 23 avril 2020.

Un merci spécial aux développeurs de WordPress SEO Plugin – Rank Math pour leur réponse rapide et leur gestion exemplaire de notre divulgation.


Source link