Le 20 janvier 2021, notre équipe Threat Intelligence a divulgué de manière responsable quatre vulnérabilités dans Formes Ninja, un plugin WordPress utilisé par plus d’un million de sites. L’une de ces failles a permis aux attaquants de rediriger les administrateurs du site vers des emplacements arbitraires. La deuxième faille a permis aux attaquants disposant d’un accès au niveau abonné ou supérieur d’installer un plugin qui pourrait être utilisé pour intercepter tout le trafic de messagerie. La troisième faille a permis aux attaquants disposant d’un accès de niveau abonné à de récupérer la clé de connexion Ninja Form OAuth qui pouvait être utilisée pour établir une connexion avec le tableau de bord de gestion central Ninja Forms. La dernière faille a permis aux attaquants de déconnecter la connexion OAuth d’un site s’ils pouvaient inciter l’administrateur d’un site à effectuer une action. Ces failles pourraient être utilisées pour prendre le contrôle d’un site WordPress et rediriger les propriétaires de sites vers des sites malveillants.

Nous avons initialement contacté Saturday Drive, la société mère du plugin, le 20 janvier 2021 par l’intermédiaire de leur contact par e-mail de divulgation responsable et avons fourni tous les détails de la divulgation au moment du rapport. Quelques jours plus tard, le 25 janvier 2021, Ninja Forms a publié un correctif pour 3 des 4 vulnérabilités. Nous avons fait un suivi pour leur faire savoir qu’une des vulnérabilités était toujours présente. Ils ont publié un dernier patch le 8 février 2021.

Nous considérons qu’il s’agit de vulnérabilités graves qui pourraient finalement conduire à une prise de contrôle complète du site, par conséquent, nous vous recommandons vivement de mettre à jour immédiatement la version entièrement corrigée, 3.4.34.1.

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 20 janvier 2021. Les sites utilisant toujours la version gratuite de Wordfence recevront la même protection le 19 février 2021.


Description: Installation authentifiée du plug-in SendWP et divulgation de clé secrète client
Plugin concerné: Formulaire de contact Ninja Forms – Le générateur de formulaires par glisser-déposer pour WordPress
Plugin Slug: formes ninja
Versions concernées:
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: 3.4.34

Ninja Forms est l’un des plugins de création de formulaires intuitifs les plus populaires du référentiel de plugins WordPress. Il offre aux utilisateurs la possibilité de créer des formulaires à l’aide de capacités de glisser-déposer, rendant le processus de conception beaucoup plus simple pour les utilisateurs de WordPress.

Dans le cadre des fonctionnalités du plugin, il offre la possibilité d’installer des «modules complémentaires», dont certains offrent des services. L’un de ces services est SendWP, qui est un service de livraison et de journalisation des e-mails destiné à simplifier la gestion du courrier avec WordPress. Depuis le tableau de bord Addon du plugin Ninja Form, il offre la possibilité de configurer ce service en quelques clics. Afin de fournir cette fonctionnalité, le plugin enregistre l’action AJAX wp_ajax_ninja_forms_sendwp_remote_install.

 add_action( 'wp_ajax_ninja_forms_sendwp_remote_install', 'wp_ajax_ninja_forms_sendwp_remote_install_handler' );

Cette action AJAX est liée à la fonction wp_ajax_ninja_forms_sendwp_remote_install_handler, qui vérifie si le plugin SendWP est installé et activé. Si le plugin n’est pas actuellement installé, alors il effectue l’installation et l’activation du plugin SendWP.

 function wp_ajax_ninja_forms_sendwp_remote_install_handler () {

    $all_plugins = get_plugins();
    $is_sendwp_installed = false;
    foreach(get_plugins() as $path => $details ) {
        if(false === strpos($path, '/sendwp.php')) continue;
        $is_sendwp_installed = true;
        activate_plugin( $path );
        break;
    }

    if( ! $is_sendwp_installed ) {

        $plugin_slug = 'sendwp';

        include_once ABSPATH . 'wp-admin/includes/plugin-install.php';
        include_once ABSPATH . 'wp-admin/includes/file.php';
        include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
        
        /*
        * Use the WordPress Plugins API to get the plugin download link.
        */
        $api = plugins_api( 'plugin_information', array(
            'slug' => $plugin_slug,
        ) );
        if ( is_wp_error( $api ) ) {
            ob_end_clean();
            echo json_encode( array( 'error' => $api->get_error_message(), 'debug' => $api ) );
            exit;
        }
        
        /*
        * Use the AJAX Upgrader skin to quietly install the plugin.
        */
        $upgrader = new Plugin_Upgrader( new WP_Ajax_Upgrader_Skin() );
        $install = $upgrader->install( $api->download_link );
        if ( is_wp_error( $install ) ) {
            ob_end_clean();
            echo json_encode( array( 'error' => $install->get_error_message(), 'debug' => $api ) );
            exit;
        }
        
        /*
        * Activate the plugin based on the results of the upgrader.
        * @NOTE Assume this works, if the download works - otherwise there is a false positive if the plugin is already installed.
        */
        $activated = activate_plugin( $upgrader->plugin_info() );

Une fois que le plugin a été installé avec succès, la fonction renvoie l’URL d’enregistrement, ainsi que le nom_client, client_secret, register_url et client_url. Ceci est utilisé pour montrer aux utilisateurs la page d’inscription et connecter facilement leur instance WordPress avec SendWP.

 echo json_encode( array(
        'partner_id' => 16,
        'register_url' => esc_url(sendwp_get_server_url() . '_/signup'),
        'client_name' => esc_attr( sendwp_get_client_name() ),
        'client_secret' => esc_attr( sendwp_get_client_secret() ),
        'client_redirect' => esc_url(sendwp_get_client_redirect()),
        'client_url' => esc_url( sendwp_get_client_url() ),
    ) );
    exit;

Malheureusement, cette action AJAX n’avait pas de contrôle de capacité, ni de protection nonce, ce qui permettait aux utilisateurs de bas niveau, tels que les abonnés, d’installer et d’activer le plugin SendWP et de récupérer la clé client_secret nécessaire pour établir la connexion SendWP.

Comment cela pourrait-il affecter mon site WordPress?
Du fait que la clé client_secret est renvoyée avec la requête AJAX, les attaquants disposant d’un accès de bas niveau à un site WordPress vulnérable pourraient établir une connexion SendWP avec leur propre compte SendWP, rendant ainsi les sites avec enregistrement ouvert particulièrement vulnérables. Une fois cette connexion établie, tous les e-mails du site WordPress seraient acheminés et enregistrés dans le compte SendWP des attaquants. À ce stade, ils peuvent surveiller toutes les données envoyées par courrier électronique, qui peuvent aller des informations personnellement identifiables (PII) de l’utilisateur, des soumissions de formulaires aux rapports générés sur votre site.

De plus, un attaquant pourrait déclencher une réinitialisation du mot de passe pour un compte d’utilisateur administratif, s’il pouvait découvrir le nom d’utilisateur d’un compte. L’e-mail de réinitialisation du mot de passe avec le lien de réinitialisation du mot de passe serait connecté au compte SendWP des attaquants, qu’ils pourraient ensuite utiliser pour réinitialiser le mot de passe d’un administrateur et obtenir un accès administratif à un site. Cela pourrait finalement conduire à l’exécution de code à distance et à la prise de contrôle du site en modifiant les fichiers de thème / plugin ou en téléchargeant un thème / plugin malveillant.

Le service SendWP coûte 9 $ par mois et par site, avec un essai de 1 $ de 14 jours. En tant que tel, il est moins susceptible d’être largement exploité. Cependant, ce serait un point d’entrée très précieux pour les attaquants cherchant à compromettre des cibles de grande valeur.


Description: Divulgation de la clé de connexion OAuth authentifiée
Plugin concerné: Formulaire de contact Ninja Forms – Le générateur de formulaires par glisser-déposer pour WordPress
Plugin Slug: formes ninja
Versions concernées:
ID CVE: En attente.
Score CVSS: 7,7 (élevé)
Vecteur CVSS: CVSS: 3.1 / AV: N / AC: L / PR: L / UI: N / S: C / C: N / I: H / A: N
Version entièrement corrigée: 3.4.34.1

Une autre fonctionnalité de Ninja Forms est la possibilité de se connecter au service “Add-on Manager” de Ninja Forms, un tableau de bord centralisé qui vous permet de gérer tous les modules complémentaires Ninja Forms achetés pour les approvisionner à distance sur un site WordPress. Tout comme avec le service SendWP, il offre des capacités pour configurer ce service en quelques clics à partir du tableau de bord Addon du plugin Ninja Form. Afin de fournir cette fonctionnalité, le plugin enregistre l’action AJAX wp_ajax_nf_oauth qui est utilisé pour récupérer l’url_connexion qui contient les informations nécessaires, comme le client_secret, pour établir une connexion OAuth avec le portail de gestion des modules complémentaires Ninja Forms.

 public function setup() {
   add_action( 'wp_ajax_nf_oauth', function(){
     wp_die( json_encode( [
       'data' => [
         'connected' => ( $this->client_id ),
         'connect_url' => self::connect_url(),
       ]
     ] ) );
   });

Malheureusement, il n’y a pas eu de contrôle de capacité sur cette fonction. Les utilisateurs de bas niveau, tels que les abonnés, ont pu déclencher l’action et récupérer l’URL de connexion nécessaire pour établir une connexion. Ils peuvent également récupérer le client_id pour une connexion OAuth déjà établie.

Cela signifiait que les attaquants pouvaient potentiellement établir une connexion OAuth pour un site WordPress vulnérable avec leur propre compte. Cependant, il y aurait une certaine ingénierie sociale impliquée car l’attaquant aurait besoin de tromper l’administrateur du site en cliquant sur un lien pour mettre à jour le client_id dans la base de données avec le nf_oauth_connect Action AJAX pour que la connexion soit complètement terminée. À partir de là, ils peuvent installer tous les plugins complémentaires achetés.


Description: Administrateur Open Redirect
Plugin concerné: Formulaire de contact Ninja Forms – Le générateur de formulaires par glisser-déposer pour WordPress
Plugin Slug: formes ninja
Versions concernées:
ID CVE: En attente.
Score CVSS: 4,8 (moyen)
Vecteur CVSS: CVSS: 3.1 / AV: N / AC: L / PR: H / UI: R / S: C / C: L / I: L / A: N
Version entièrement corrigée: 3.4.34

Dans le cadre du processus de connexion OAuth, le plugin enregistre une action AJAX, wp_ajax_nf_oauth_connect, qui est enregistré dans la fonction connect() qui est utilisé pour rediriger un propriétaire de site vers la page de service Ninja Forms du site WordPress une fois que l’utilisateur a terminé le processus de connexion OAuth.

 public function connect() {
    // Does the current user have admin privileges
    if (!current_user_can('manage_options')) {
      return;
    }

    // wp_verify_nonce( $_REQUEST['nonce'], 'nf-oauth-connect' );

    if( ! isset( $_GET[ 'client_id' ] ) ) return;

    $client_id = sanitize_text_field( $_GET[ 'client_id' ] );
    update_option( 'ninja_forms_oauth_client_id', $client_id );

    if( isset( $_GET[ 'redirect' ] ) ){
      $redirect = sanitize_text_field( $_GET[ 'redirect' ] );
      $redirect = add_query_arg( 'client_id', $client_id, $redirect );
      wp_redirect( $redirect );
      exit;
    }

    wp_safe_redirect( admin_url( 'admin.php?page=ninja-forms#services' ) );
    exit;
  }

Cette fonction utilise wp_safe_redirect pour rediriger les propriétaires de sites vers le admin.php?page=ninja-forms#services Cependant, si le paramètre ‘redirect’ est fourni, alors il redirige l’administrateur du site vers une URL arbitraire fournie dans ce paramètre.

Heureusement, il y avait un contrôle de capacité sur cette fonction afin que seuls les administrateurs puissent l’utiliser. Cependant, il n’y a aucune protection sur l’URL de redirection validant la destination de la redirection, ni aucune protection pour empêcher un attaquant d’utiliser la fonction pour rediriger un administrateur de site vers un emplacement malveillant. Il y avait l’utilisation de wp_verify_nonce()cependant, il a été commenté et rendu inutilisable. Cela a permis aux attaquants de créer une URL avec le paramètre de redirection défini sur un site arbitraire. Si l’attaquant pouvait inciter un administrateur à cliquer sur le lien, il pourrait être redirigé vers un site malveillant externe qui pourrait infecter l’ordinateur de l’administrateur entre autres actions malveillantes.

Les vulnérabilités de redirection ouverte exploitent la confiance inhérente au domaine vulnérable pour aider quelqu’un à cliquer sur le lien de redirection ouvert. Par exemple, un attaquant pourrait créer un lien avec le paramètre de redirection contenant une URL raccourcie, puis demander à un propriétaire de site de vérifier le lien indiquant que la page répondait bizarrement sur son site. Cela inciterait probablement le propriétaire du site à cliquer sur le lien et à vérifier à quoi fait référence la «demande», et finalement à les rediriger vers un site externe et malveillant.


Description: Falsification de demande intersite à la déconnexion du service OAuth
Plugin concerné: Formulaire de contact Ninja Forms – Le générateur de formulaires par glisser-déposer pour WordPress
Plugin Slug: formes ninja
Versions concernées:
ID CVE: En attente.
Score CVSS: 6,1 (moyen)
Vecteur CVSS: CVSS: 3.1 / AV: N / AC: L / PR: N / UI: R / S: C / C: N / I: L / A: L
Version entièrement corrigée: 3.4.34

Une fonctionnalité supplémentaire du gestionnaire de modules complémentaires Ninja Forms était la possibilité de déconnecter facilement une connexion OAuth établie en quelques clics. Afin de fournir cette fonctionnalité, le plugin a enregistré une action AJAX wp_ajax_nf_oauth_disconnect lié à la fonction disconnect(). Le disconnect() Cette fonction déconnecterait simplement une connexion établie en supprimant les options associées aux paramètres de connexion dans la base de données.

add_action( 'wp_ajax_nf_oauth_disconnect', [ $this, 'disconnect' ] );

Malheureusement, cette fonctionnalité n’avait pas de protection nonce. Cela a permis aux attaquants de créer une demande légitime, de l’héberger en externe et, s’ils réussissent à inciter un administrateur à cliquer sur un lien ou une pièce jointe, d’envoyer une demande pour déconnecter la connexion OAuth actuelle. Bien qu’il n’y ait aucun dommage critique exploité par cette vulnérabilité, cela pourrait être une expérience déroutante pour un propriétaire de site.

 public function disconnect() {

  // Does the current user have admin privileges
  if (!current_user_can('manage_options')) {
    return;
  }

  do_action( 'ninja_forms_oauth_disconnect' );

  $url = trailingslashit( $this->base_url ) . 'disconnect';
  $args = [
    'blocking' => false,
    'method' => 'DELETE',
    'body' => [
      'client_id' => get_option( 'ninja_forms_oauth_client_id' ),
      'client_secret' => get_option( 'ninja_forms_oauth_client_secret' )
    ]
  ];
  $response = wp_remote_request( $url, $args );

  delete_option( 'ninja_forms_oauth_client_id' );
  delete_option( 'ninja_forms_oauth_client_secret' );
  wp_die( 1 );
}

Calendrier de divulgation

20 janvier 2021 – Conclusion de l’analyse du plugin qui a conduit à la découverte des quatre vulnérabilités. Nous développons des règles de pare-feu pour protéger les clients Wordfence et les diffusons aux utilisateurs de Wordfence Premium. Nous établissons notre premier contact et envoyons une divulgation complète via le contact de divulgation de sécurité répertorié sur le site Web de Ninja Forms.
21 janvier 2021 – Nous recevons une réponse confirmant que Saturday Drive a reçu nos informations et commencerons à travailler sur un correctif.
25 janvier 2021 – La première version corrigée du plugin est publiée en tant que version 3.4.34
26 janvier 2021 – Nous vérifions si la version résout tous les problèmes signalés. Nous découvrons qu’un point final est toujours vulnérable et faisons un suivi avec notre contact à Saturday Drive. Nous recevons la confirmation le jour même qu’ils enverront les détails aux développeurs pour travailler sur un correctif.
4 février 2021 – Nous effectuons un suivi pour vérifier l’état d’un correctif et nous sommes informés qu’il devrait être publié dans les prochains jours.
8 février 2021 – Une version finale corrigée du plugin est publiée en tant que version 3.4.34.1. Nous vérifions à nouveau que les vulnérabilités ont été corrigées.
19 février 2021 – Les utilisateurs gratuits de Wordfence reçoivent des règles de pare-feu.

Conclusion

Dans l’article d’aujourd’hui, nous avons détaillé quatre failles du plugin Ninja Forms qui permettaient aux attaquants d’obtenir des informations sensibles tout en leur permettant de rediriger les utilisateurs administratifs. Ces failles ont été entièrement corrigées dans la version 3.4.34.1. Nous recommandons aux utilisateurs de mettre immédiatement à jour vers la dernière version disponible, qui est la version 3.5.0 au moment de cette publication.

Wordfence Premium les utilisateurs ont reçu des règles de pare-feu protégeant contre cette vulnérabilité le 20 janvier 2021, tandis que ceux qui utilisent encore la version gratuite de Wordfence recevront la même protection le 19 février 2021.

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 ils sont considérés comme des problèmes de gravité critiques pouvant entraîner l’exécution de code à distance.

Un merci spécial aux créateurs de Ninja Forms, Saturday Drive, pour avoir travaillé rapidement à des correctifs rapides et pour avoir fourni un contact pour une divulgation responsable directement sur leur site Web.


Source link