Le 16 mars 2020, LearnPress – Plugin WordPress LMS, un plugin WordPress avec plus de 80 000 installations, a corrigé une vulnérabilité très grave qui permettait aux utilisateurs de niveau abonné d’élever leurs autorisations à celles d’un «LP Instructor», un rôle personnalisé avec des capacités similaires au rôle «auteur» de WordPress, y compris le rôle possibilité de télécharger des fichiers et de créer des publications contenant du HTML non filtré, les deux pouvant être utilisés dans le cadre d’une chaîne d’exploit permettant la reprise du site.

Notre équipe Threat Intelligence a analysé la vulnérabilité afin de créer une règle de pare-feu pour protéger les clients Wordfence. Ce faisant, nous avons découvert deux vulnérabilités supplémentaires. L’une de ces vulnérabilités était presque identique en termes de conséquences à la vulnérabilité d’origine en ce qu’elle permettait à un attaquant d’élever les autorisations de n’importe quel utilisateur à «LP Instructor». L’autre a permis à un utilisateur connecté avec des autorisations minimales, comme un abonné, de créer de nouvelles pages sur le site avec des titres arbitraires et de modifier le statut de toute publication ou page existante.

Nous avons divulgué ces vulnérabilités en privé à l’auteur du plugin le lendemain, le 17 mars 2020, et avons rapidement reçu une réponse. Malheureusement, aucun correctif n’a été publié pendant plus d’un mois. Nous avons fait un suivi auprès de l’auteur du plugin le 16 avril 2020, et après avoir reçu aucune réponse, nous avons contacté l’équipe des plugins WordPress. Quelques heures plus tard, le développeur du plugin a repris contact et nous a fait savoir qu’un correctif était en préparation. Une version suffisamment corrigée a finalement été publiée le 22 avril 2020.

Nous vous recommandons vivement de mettre à jour la version 3.2.6.9 immédiatement car ces problèmes de sécurité sont entièrement corrigés dans cette version.

Les utilisateurs de Wordfence Premium ont reçu une nouvelle règle de pare-feu le 16 mars 2020 pour se protéger contre les exploits ciblant à la fois la vulnérabilité d’origine et les failles nouvellement découvertes. Les utilisateurs de Wordfence gratuits ont reçu cette règle le 15 avril 2020.


LearnPress est un plugin WordPress qui permet aux propriétaires de sites de créer un portail d’apprentissage en ligne, y compris la possibilité d’affecter des utilisateurs comme «instructeurs LP» capables d’ajouter leur propre matériel de cours au site. Une fonctionnalité du plugin envoie un e-mail à l’administrateur chaque fois qu’un utilisateur demande à devenir instructeur, permettant à cet administrateur d’approuver la demande en cliquant sur un lien. La fonction qui gère cette demande s’exécute automatiquement dès que les plug-ins sont chargés et en tant que telle est toujours “à l’écoute” de paramètres spécifiques:

function learn_press_accept_become_a_teacher() {
   $action  = ! empty( $_REQUEST['action'] ) ? $_REQUEST['action'] : '';
   $user_id = ! empty( $_REQUEST['user_id'] ) ? $_REQUEST['user_id'] : '';
   if ( ! $action || ! $user_id || ( $action != 'accept-to-be-teacher' ) ) {
       return;
   }

   if ( ! learn_press_user_maybe_is_a_teacher( $user_id ) ) {
       $be_teacher = new WP_User( $user_id );
       $be_teacher->set_role( LP_TEACHER_ROLE );
       delete_transient( 'learn_press_become_teacher_sent_' . $user_id );
       do_action( 'learn_press_user_become_a_teacher', $user_id );
       $redirect = add_query_arg( 'become-a-teacher-accepted', 'yes' );
       $redirect = remove_query_arg( 'action', $redirect );
       wp_redirect( $redirect );
   }
}

add_action( 'plugins_loaded', 'learn_press_accept_become_a_teacher' );

En raison de la façon dont cette fonction a été ajoutée, il était possible pour un attaquant d’envoyer une demande à n’importe quel emplacement valide dans wp-admin avec le action paramètre défini sur accept-to-be-teacher et le user_id paramètre défini sur l’ID de l’utilisateur à qui accorder les privilèges d’instructeur. Cela signifie que même un attaquant non authentifié pouvait envoyer une demande à wp-admin/admin-post.php contenant ces paramètres et élevant les autorisations d’un utilisateur de leur choix, bien qu’il aurait besoin de son propre ID utilisateur pour tirer pleinement parti de la vulnérabilité.

Une fois qu’un utilisateur a obtenu le LP Instructor rôle, ils avaient accès à créer de nouveaux messages, cours, leçons et quiz. Aditionellement, LP Instructor les utilisateurs ont obtenu une capacité généralement réservée aux éditeurs et aux administrateurs: le unfiltered_html , qui leur permettrait d’insérer du code personnalisé dans l’une des pages qu’ils ont créées. Grâce à cette capacité, un attaquant pourrait facilement insérer du code JavaScript malveillant dans toutes les publications qu’il a créées, ce qui pourrait ensuite être utilisé pour rediriger les visiteurs vers des sites malveillants ou même être utilisé pour la prise de contrôle du site si un administrateur connecté consultait l’une de ces publications.


Le plugin LearnPress a également géré plusieurs tâches via des actions AJAX qui manquaient de vérifications de nonce et de vérifications de capacité. Il enregistre les actions AJAX dans une boucle, bien que beaucoup de ces fonctions aient au moins utilisé des vérifications de capacité:

			$ajaxEvents = array(
				'create_page'             => false,
				'plugin_action'           => false,
				'modal_search_items'      => false,
				'dismiss_notice'          => false,
				'search_users'            => false,
				'load_chart'              => false,
				'search_course_category'  => false,
				/////////////
				//'be_teacher'              => false,
				'custom_stats'            => false,
				'ignore_setting_up'       => false,
				'get_page_permalink'      => false,
				'dummy_image'             => false,
				'update_add_on_status'    => false,
				//'plugin_install'          => false,
				'bundle_activate_add_ons' => false,
				'install_sample_data'     => false,

				// Remove Notice
				'remove_notice_popup'     => false,
				// Update order status
				'update_order_status'     => false,
			);
			foreach ( $ajaxEvents as $ajaxEvent => $nopriv ) {
				add_action( 'wp_ajax_learnpress_' . $ajaxEvent, array( __CLASS__, $ajaxEvent ) );

Une action, update_order_status, est destiné à permettre aux administrateurs de marquer les commandes LearnPress comme payées ou remboursées. Malheureusement, la fonction a accepté tout ID de poste et tout statut, même inexistant. En tant que tel, il était possible pour un attaquant d’envoyer une demande à wp-admin/admin-ajax.php avec le action paramètre défini sur learnpress_update_order_status, le order_id défini sur l’ID de poste à modifier, et le value paramètre défini sur l’état de publication souhaité. Cela permettrait à l’attaquant de publier ou de supprimer toute publication ou page existante, ou même de le mettre dans un état inexistant, auquel cas il n’apparaîtrait plus sur le site ou ne serait plus accessible à partir de wp-admin, et ne pourrait être récupéré qu’en modifiant son statut dans la base de données.

       public static function update_order_status() {

           $order_id = learn_press_get_request( 'order_id' );
           $value    = learn_press_get_request( 'value' );

           $order = array(
               'ID'          => $order_id,
               'post_status' => $value,
           );

           wp_update_post( $order ) ? $response['success'] = true : $response['success'] = false;

           learn_press_send_json( $response );

           die();
       }

L’autre action vulnérable appelle une fonction, create_page, qui est destiné à être utilisé pendant l’assistant de configuration, afin de créer les pages par défaut que LearnPress doit fonctionner. Cela signifie qu’un attaquant pourrait envoyer une demande à wp-admin/admin-ajax.php avec le action paramètre défini sur learnpress_create_page et le page_name paramètre défini sur une valeur de leur choix.

		public static function create_page() {
			$page_name = ! empty( $_REQUEST['page_name'] ) ? $_REQUEST['page_name'] : '';
			$response  = array();
			if ( $page_name ) {

				if ( $page_id = LP_Helper::create_page( $page_name ) ) {
					$response['page'] = get_post( $page_id );
					$html             = learn_press_pages_dropdown( '', '', array( 'echo' => false ) );
					preg_match_all( '!value="([0-9]+)"!', $html, $matches );
					$response['positions'] = $matches[1];
					$response['html']      = '' . __( 'Edit Page', 'learnpress' ) . ' ';
					$response['html']      .= '' . __( 'View Page', 'learnpress' ) . '';
				} else {
					$response['error'] = __( 'Error! Page creation failed. Please try again.', 'learnpress' );
				}
			} else {
				$response['error'] = __( 'Empty page name!', 'learnpress' );
			}
			learn_press_send_json( $response );
		}

Bien que moins grave, cette vulnérabilité permettrait toujours à un attaquant de publier des pages contenant des liens de spam dans les titres, qui pourraient être utilisées dans le cadre d’une campagne de référencement illicite.

Calendrier de divulgation

16 mars 2020 – Wordfence Threat Intelligence découvre des vulnérabilités non corrigées dans le plug-in LearnPress lors de l’analyse de vulnérabilités récemment corrigées. Règle de pare-feu publiée pour les utilisateurs de Wordfence Premium. Ouverture initiale au développeur du plugin.
17 mars 2020 – Le développeur du plugin confirme la boîte de réception appropriée pour gérer la discussion. Une divulgation complète des vulnérabilités est envoyée.
15 avril 2020 – La règle de pare-feu devient disponible pour les utilisateurs gratuits de Wordfence.
16 avril 2020 – Suivi avec le développeur du plugin car les problèmes ne sont pas encore corrigés.
20 avril 2020 – Nous contactons l’équipe de plugins WordPress à propos du problème et recevons une réponse du développeur du plugin peu de temps après.
22 avril 2020 – Version suffisamment corrigée publiée.

Conclusion

Dans cet article, nous avons détaillé deux vulnérabilités dans le plugin LearnPress, y compris une vulnérabilité d’élévation de privilèges et une vulnérabilité de création et de modification de publication. Ces failles ont été entièrement corrigées dans la version 3.2.6.9, et nous exhortons les utilisateurs à mettre à jour vers la dernière version disponible dès que possible. Sites en cours d’exécution Wordfence Premium sont protégés contre ces vulnérabilités depuis le 16 mars 2020, tandis que les sites encore sur la version gratuite de Wordfence sont protégés depuis le 15 avril 2020. Si vous utilisez actuellement un site exécutant LearnPress en tant qu’étudiant, veuillez transmettre cet avis à l’administrateur du site.


Source link