Le 6 mai, notre équipe Threat Intelligence a été alertée d’une vulnérabilité zero-day présente dans Elementor Pro, un plugin WordPress installé sur environ 1 million de sites. Cette vulnérabilité était exploitée conjointement avec une autre vulnérabilité trouvée dans Extensions ultimes pour Elementor, un plugin WordPress installé sur environ 110 000 sites.

Nous avons immédiatement publié une règle de pare-feu pour protéger les utilisateurs de Wordfence Premium et contacté Elementor à propos de la vulnérabilité. Comme cette vulnérabilité était activement exploitée, nous avons également notifié publiquement la communauté de la vulnérabilité pour aider à protéger les utilisateurs contre toute compromission.

Elementor a rapidement publié une mise à jour pour Elementor Pro le même jour que nous avons publié un avis sur le blog Wordfence. Dans la publication d’aujourd’hui, nous fournissons les détails techniques des deux vulnérabilités ainsi qu’un examen plus approfondi de la façon dont ces deux vulnérabilités ont été utilisées ensemble pour compromettre les sites Web WordPress utilisant ces plugins.

Nous demandons instamment aux propriétaires de sites Web qui n’ont pas encore mis à jour les dernières versions de ces plugins de le faire immédiatement. Pour Elementor Pro, c’est la version 2.9.4 et dans Ultimate Addons pour Elementor, c’est la version 1.24.2.

Ultimate Addons for Elementor est un plugin créé par Brainstorm Force. Il s’agit d’une extension d’Elementor, fournissant de nombreux widgets supplémentaires à utiliser avec Elementor.

L’un des widgets ajoute un formulaire d’inscription, appelé «formulaire d’inscription utilisateur» à n’importe quelle page. Il s’agit d’un formulaire d’inscription facilement personnalisable qui peut être placé n’importe où sur le site. Malheureusement, il y avait une faille dans la fonctionnalité de ce formulaire qui permettait aux utilisateurs de s’inscrire même lorsque l’inscription était désactivée, et même si le widget de formulaire n’était pas activement utilisé sur le site.

L’enregistrement des utilisateurs est-il activé?

Les développeurs ont enregistré des actions nopriv et AJAX régulières liées à la get_form_data afin de fournir des fonctionnalités pour le widget Formulaire d’enregistrement de l’utilisateur.

	public function __construct() {
		parent::__construct();

		add_action( 'wp_ajax_uael_register_user', array( $this, 'get_form_data' ) );
		add_action( 'wp_ajax_nopriv_uael_register_user', array( $this, 'get_form_data' ) );
		add_filter( 'wp_new_user_notification_email', array( $this, 'custom_wp_new_user_notification_email' ), 10, 3 );

Plonger dans le get_form_data fonction, nous voyons qu’il a été conçu pour récupérer les informations soumises dans le formulaire d’inscription. Ces données ont ensuite été utilisées pour créer un nouvel utilisateur sur le site à l’aide de WordPress wp_insert_user crochet. Nulle part dans la fonction n’a-t-elle vérifié que l’enregistrement des utilisateurs était activé sur le site, ni effectué d’autres vérifications pour vérifier que le widget du formulaire d’inscription était actif.

	/**
	 * Get Form Data via AJAX call.
	 *
	 * @since 1.18.0
	 * @access public
	 */
	public function get_form_data() {

		check_ajax_referer( 'uael-form-nonce', 'nonce' );

		$data     = array();
		$error    = array();
		$response = array();

		if ( isset( $_POST['data'] ) ) {

			$data = $_POST['data'];

* Notez que plusieurs lignes sont omises par souci de concision.

			$user_args = apply_filters(
					'uael_register_insert_user_args',
					array(
						'user_login'      => isset( $user_login ) ? $user_login : '',
						'user_pass'       => isset( $user_pass ) ? $user_pass : '',
						'user_email'      => isset( $user_email ) ? $user_email : '',
						'first_name'      => isset( $first_name ) ? $first_name : '',
						'last_name'       => isset( $last_name ) ? $last_name : '',
						'user_registered' => gmdate( 'Y-m-d H:i:s' ),
						'role'            => isset( $user_role ) ? $user_role : '',
					)
				);

				$result = wp_insert_user( $user_args );

Ces vérifications manquantes ont permis aux attaquants de contourner les paramètres d’enregistrement des utilisateurs sur un site WordPress. Heureusement, Brainstorm Force a ajouté des vérifications dans la dernière version pour vérifier à la fois que l’enregistrement des utilisateurs est activé et que le widget est actif.

	/**
	 * Get Form Data via AJAX call.
	 *
	 * @since 1.18.0
	 * @access public
	 */
	public function get_form_data() {

		check_ajax_referer( 'uael-form-nonce', 'nonce' );

		$data             = array();
		$error            = array();
		$response         = array();
		$allow_register   = get_option( 'users_can_register' );
		$is_widget_active = UAEL_Helper::is_widget_active( 'RegistrationForm' );

		if ( isset( $_POST['data'] ) && '1' === $allow_register && true === $is_widget_active ) {

			$data = $_POST['data'];

Registration Nonce est toujours affiché

Bien que les nonces soient principalement utilisés pour atténuer les attaques CSRF et vérifier la légitimité d’une demande, ils peuvent également agir en tant que sécurité intrinsèque dans des cas comme celui-ci où une fonction contient un petit défaut, c’est-à-dire si le nonce n’est pas détectable par un attaquant.

le get_form_data La fonction a utilisé une vérification nonce qui aurait pu potentiellement arrêter l’enregistrement des utilisateurs non autorisés. Cependant, nous avons découvert que le form_nonce était toujours visible dans le code source d’une page où un widget UA pour Elementor était activé, même quand aucun formulaire n’était présent sur la page.

/**
	 * Setup Actions Filters.
	 *
	 * @since 0.0.1
	 */
	private function setup_actions_filters() {

		add_shortcode( 'uael-template', array( $this, 'uael_template_shortcode' ) );

		add_action( 'elementor/init', array( $this, 'elementor_init' ) );

		add_action( 'elementor/elements/categories_registered', array( $this, 'widget_category' ) );

		add_action( 'elementor/frontend/after_register_scripts', array( $this, 'register_widget_scripts' ) );

* Notez que plusieurs lignes sont omises par souci de concision.

			wp_localize_script(
			'jquery',
			'uaelRegistration',
			array(
				'invalid_mail'       => __( 'Enter valid Email!', 'uael' ),
				'pass_unmatch'       => __( 'The specified password do not match!', 'uael' ),
				'required'           => __( 'This Field is required!', 'uael' ),
				'form_nonce'         => wp_create_nonce( 'uael-form-nonce' ),
				'incorrect_password' => __( 'Error: The Password you have entered is incorrect.', 'uael' ),
				'invalid_username'   => __( 'Unknown username. Check again or try your email address.', 'uael' ),
				'invalid_email'      => __( 'Unknown email address. Check again or try your username.', 'uael' ),
			)
		);
	}

Cela signifiait que les attaquants devaient simplement gratter le code source des pages d’un site exécutant ce plugin pour var uaelRegistration. Si ce site avait au moins un widget en cours d’utilisation sur n’importe quelle page, il leur serait accordé un nonce utilisable pour s’inscrire sur le site.

Un regard sur le nonce UAE détectable dans le code source d’une page avec un widget UAE activé.

L’exploit

Combinées, ces failles ont permis aux attaquants de s’enregistrer en tant qu’abonné sur n’importe quel site vulnérable et d’utiliser potentiellement cet accès pour pivoter et exploiter les vulnérabilités qui nécessitaient un accès de niveau abonné. C’est précisément ce que nous avons vu exploité dans le cas de la vulnérabilité Elementor Pro.

Un merci spécial à Ramuel Gall pour ses contributions à la recherche sur cette vulnérabilité.

Elementor est un plugin de création de page WordPress populaire, actuellement installé sur plus de 5 millions de sites WordPress. La version Pro ajoute des améliorations supplémentaires comme la possibilité de télécharger des icônes et des polices personnalisées. Il ajoute également plus de 50 widgets supplémentaires pour améliorer le processus de création de page et une personnalisation améliorée.

Lorsqu’un plugin introduit la possibilité de télécharger des fichiers, quel que soit le type de fichier, les mesures de contrôle appropriées doivent toujours être incluses afin d’empêcher les utilisateurs non autorisés de télécharger des fichiers ou de contourner les filtres de fichiers ou les privilèges établis sur le site.

Malheureusement, la fonctionnalité de téléchargement d’icônes personnalisées d’Elementor Pro n’avait pas de mesures appropriées en place. Les attaquants ont découvert un moyen efficace de contourner les restrictions sur les types de fichiers pouvant être téléchargés, et une fois authentifiés, ils ont pu télécharger des fichiers PHP tels que des webshells et des backdoors.

Absence de vérification des autorisations

Elementor Pro enregistre un point de terminaison AJAX utilisé pour déclencher la fonction de téléchargement d’icônes. Ni l’action AJAX ni la fonction de téléchargement n’avaient de vérification des autorisations, permettant à tout utilisateur authentifié, y compris ceux disposant d’autorisations minimales, la possibilité de déclencher la fonction et de télécharger un fichier .zip.

	public function register_ajax_actions( Ajax $ajax ) {
		$ajax->register_ajax_action( 'pro_assets_manager_custom_icon_upload', [ $this, 'custom_icons_upload_handler' ] );

Heureusement, la version corrigée du plugin a implémenté une vérification des autorisations sur le custom_icons_upload_handler fonction qui empêche les utilisateurs de bas niveau de pouvoir télécharger des fichiers.

public function custom_icons_upload_handler( $data ) {
		if ( ! current_user_can( Icons_Manager::CAPABILITY ) ) {
			return new WP_Error( Exceptions::FORBIDDEN, 'Access denied.' );
		}

Importations non contrôlées

Il semble que la fonctionnalité de téléchargement d’icônes personnalisées était uniquement destinée à autoriser les fichiers .zip créés à partir des sites de création d’icônes Fontello, IcoMoon ou Fontastic. Il l’a fait en vérifiant les fichiers inclus dans le fichier .zip et en vérifiant que ceux alignés avec les fichiers générés à partir des sources d’icônes de confiance. Cependant, le plugin ne vérifie jamais si des fichiers supplémentaires ont été inclus dans ces fichiers .zip.

	$supported_icon_sets = self::get_supported_icon_sets();
		foreach ( $supported_icon_sets as $key => $handler ) {
			/**
			 * @var IconSetsIcon_Set_Base $icon_set_handler
			 */
			$icon_set_handler = new $handler( $results['directory'] );

			if ( ! $icon_set_handler ) {
				continue;
			}
			if ( ! $icon_set_handler->is_valid() ) {
				continue;

Cela a permis aux attaquants d’inclure des fichiers malveillants dans un fichier .zip de confiance, en contournant les restrictions que le plugin avait en place. Cela comprenait des fichiers .php.

Nonce découvrable

Il y avait une vérification de nonce sur la fonction, mais tout comme nous l’avons vu dans le plugin Ultimate Addons pour Elementor, le nonce était facilement détectable en raison de son inclusion dans var elementorCommonConfig comme “ajax” dans la page source de toutes les pages du tableau de bord administratif.

Un examen plus approfondi du nonce Elementor Pro découvert dans la page source de / wp-admin.

Un attaquant pourrait trouver un nonce utilisable en grattant la source de la page du tableau de bord / wp-admin lors de l’authentification. Cela pourrait ensuite être utilisé comme un élémentce AJAX Elementor légitime pour exécuter l’action vulnérable et télécharger des fichiers .zip spécialement conçus.

L’exploit

Ces trois failles ont permis aux attaquants de télécharger des fichiers arbitraires en créant un fichier .zip Fontello, IcoMoon ou Fontastic, en extrayant ce fichier, en injectant des fichiers arbitraires de leur choix dans le dossier, en recompressant le fichier .zip et en le téléchargeant. sur le site via l’action AJAX.

Les fichiers .zip téléchargés sont extraits dans /wp-content/upload/elementor/custom-icon dans un dossier nouvellement généré. Si le propriétaire du site n’avait précédemment téléchargé aucune icône personnalisée, les fichiers malveillants se trouveraient dans le dossier / -1. S’il y avait précédemment des fichiers d’icônes personnalisées téléchargés, ce répertoire pourrait avoir été un nombre différent tel que / -5, et l’attaquant devrait utiliser la force brute afin de trouver le répertoire dans lequel sa charge utile malveillante avait été extraite.

Un attaquant pourrait accéder à tous les nouveaux fichiers téléchargés, comme une webshell, en allant directement au fichier:

https://example.com/wp-content/wp-content/upload/elementor/custom-icon/-1/backdoor.php

Si le fichier téléchargé était un fichier .php, le code serait également exécuté lors de l’accès. Cela a permis l’exécution de code à distance (RCE) et finalement le compromis total du site WordPress et de l’environnement d’hébergement.

5 mai 2020 – Wordfence a été informé d’une vulnérabilité récemment corrigée dans Ultimate Addons pour Elementor. Dans le même avis, il a été mentionné qu’Elementor Pro peut avoir un «bug» qui a provoqué la présence de fichiers malveillants dans le /custom-icons annuaire. Nous commençons à enquêter sur Elementor Pro pour déterminer s’il existe un défaut de sécurité. Nous concluons qu’il existe une vulnérabilité de téléchargement de fichier arbitraire authentifié.
5 mai 2020 – Nous fournissons rapidement aux clients Premium une règle de pare-feu pour fournir une protection contre la vulnérabilité trouvée dans Elementor Pro.
5 mai 2020 – Nous contactons l’équipe d’Elementor pour les alerter de la présence de la vulnérabilité.
5 mai 2020 – La société d’hébergement nous fournit des fichiers journaux qui confirment qu’ils sont activement exploités.
6 mai 2020 – Nous publions une annonce de service public avec des détails limités pour informer les utilisateurs comment sécuriser leur site jusqu’à ce qu’un correctif soit disponible.
6 mai 2020 – Elementor publie un patch pour Elementor Pro.
4 juin 2020 – Les utilisateurs gratuits de Wordfence reçoivent une règle de pare-feu.

Dans l’article d’aujourd’hui, nous avons fourni des détails techniques sur la vulnérabilité trouvée dans le plugin Elementor Pro et comment cette vulnérabilité a été utilisée dans les exploits actifs en conjonction avec la vulnérabilité trouvée dans Ultimate Addons pour Elementor. Ces défauts ont tous deux été corrigés et nous recommandons aux utilisateurs de mettre à jour les dernières versions disponibles immédiatement.

Sites en cours d’exécution Wordfence Premium sont protégés contre les attaques contre la vulnérabilité dans Elementor Pro depuis le 5 mai 2020. Les sites exécutant la version gratuite de Wordfence recevront la mise à jour des règles de pare-feu le 4 juin 2020. Si vous connaissez un ami ou un collègue qui en exécute un, ou les deux , de ces plugins sur leur site, nous vous recommandons fortement de leur transmettre immédiatement ces informations pour les aider à sécuriser leur site.

Un merci spécial à l’équipe d’Elementor d’avoir travaillé rapidement pour obtenir un correctif afin de protéger les utilisateurs d’Elementor Pro. Merci également à Ramuel Gall, Kathy Zant, Gerroald Barron et Stephen Rees-Carter de l’équipe Wordfence pour leur aide dans la recherche de cette attaque et les tests d’atténuation.


Source link

%d blogueurs aiment cette page :