web-dev-qa-db-fra.com

Comment savoir si mon site Drupal est composé de l'exploit SA-CORE-2018-002 - mars 2018?

Exploit qui vient d'être publié: https://www.drupal.org/sa-core-2018-002 --- Drupal core - Hautement critique - Exécution de code à distance - SA-CORE-2018-002

  • Comment savoir si quelqu'un a utilisé cet exploit pour pirater mon site?
  • Que peuvent-ils faire avec cet exploit s'il est exécuté correctement?
  • Je ne peux pas mettre à jour mes sites Drupal maintenant, quelle est une bonne alternative pour réparer facilement ce trou?
9
Patoshi パトシ

Qu'est-ce qui pourrait arriver

J'ai eu un Drupal site piraté pendant Drupalgeddon, un exploit de gravité similaire (bien que d'un type différent). En termes de "ce qui pourrait arriver", dans ce cas, le pirate a mis plusieurs "en arrière" portes "fichiers dans ma base de code (je connaissais très peu de développement à l'époque, et n'avait pas de référentiel Git), à partir de laquelle il pouvait envoyer du courrier indésirable. Le domaine concerné était mis sur liste noire dans les filtres anti-spam, et c'était un énorme gâchis d'être capable d'envoyer des e-mails à partir de ce domaine pendant plusieurs mois, je l'avais gardé par la suite.

Étant donné que cette vulnérabilité permet l'exécution de code à distance, l'attaquant pourrait vraisemblablement installer des modules pour exécuter des attaques de phishing, exécuter des commandes sur la ligne de commande avec php exec (), voler des mots de passe et ainsi compromettre une grande partie de votre serveur. Les dommages peuvent aller de quelque chose d'aussi simple que le recrutement de votre machine en tant que moteur de spam ou nœud de botnet, ou si vous avez des informations sensibles, l'attaquant peut les voler et les revendre ou vous faire chanter, selon les informations et les motivations de l'attaquant.

Comment savoir si vous avez été piraté

La plupart du temps, votre site ne sera pas dégradé. Lorsque deux groupes de script kiddies de 14 ans s'affrontent, vous pouvez voir un site défiguré avec des images de chèvre (NSFW), mais à moins que le pirate ait quelque chose contre vous personnellement, il ne le fera pas. Le but du pirate est soit l'argent, soit la capacité de commettre des délits avec l'ordinateur de quelqu'un d'autre.

Maintenant, avec cela à l'esprit, les choses courantes que vous verrez sont de nouveaux utilisateurs en cours de création (en particulier les utilisateurs administrateurs), et dans les journaux, vous pouvez voir une adresse IP particulière envoyer un seul type de demande (anormale). Dans le cas Drupalgeddon, j'ai pu le comprendre en voyant POST requêtes vers un fichier php dans mon journal d'accès.

Si vous ne pouvez pas corriger votre site tout de suite

Si vous ne pouvez pas corriger le site maintenant, je recommanderais de couper le serveur Apache/nginx afin que personne ne puisse accéder à votre site. Ou, demandez au serveur de diriger tout le trafic vers une page HTML expliquant que vous êtes en panne pour maintenance, alias "mode de maintenance matérielle". Dans tous les cas, vous ne souhaitez pas permettre à un visiteur de tirer sur Drupal, jusqu'à ce que vous puissiez obtenir une mise à niveau ou un correctif.

Et en repensant à mon site piraté, rappelez-vous que les premières attaques Drupalgeddon ont commencé 7 heures après la sortie, et c'était sous la forme d'un script qui piraté automatiquement des milliers de sites. Bouge rapidement!

Si vous êtes piraté

J'espère que vous avez une sauvegarde, auquel cas le meilleur pari est de "neutraliser tout le site depuis l'orbite" et de recommencer avec un nouveau serveur. J'ai effectué une vérification manuelle de la base de données et des fichiers une fois parce que je n'avais pas de sauvegardes Git et régulières en place - cela prend très très longtemps, mais si cela arrive, prenez une grande respiration, et apprenez Git et apprenez à configurer un environnement de sauvegarde approprié. Si vous avez une entreprise et son site client, dites-leur la vérité dès le départ. Vous les perdrez probablement, mais mieux vaut perdre un client (vous pouvez en obtenir de nouveaux) que votre réputation.

8
Mike Nolan

Comment puis-je savoir si quelqu'un a utilisé cet exploit pour pirater mon site?

Votre Drupal 7 ou 8 peut subir une perte ou un vol de données, les données peuvent être supprimées, supprimées ou modifiées, faisant des ravages sur le site de nombreuses manières différentes.

Voir ceci Stack Exchange post pour des informations générales sur la vérification pour voir si votre site Web a été piraté.

Que peuvent-ils faire avec cet exploit s'il est exécuté correctement?

L'exploit est une vulnérabilité d'exécution de code à distance, ce qui signifie que toutes les données peuvent être affectées.

Cet exploit a reçu un score de risque de 21/25, ce qui est presque le plus élevé qu'il obtient. Ce score de risque définit également les vulnérabilités suivantes, entre autres:

  • AC (complexité d'accès): facile (aucune compétence) à accéder et à exploiter
  • A (Authentification): aucune authentification spéciale n'est requise
  • Cl (Impact sur la confidentialité): toutes les données non publiques sont accessibles
  • II (impact sur l'intégrité): toutes les données peuvent être modifiées ou supprimées

En savoir plus sur la notation des risques et les définitions ici .

Je ne peux pas mettre à jour mes sites Drupal maintenant, quelle est une bonne alternative pour corriger ce trou facilement?

Un correctif est disponible si vous ne pouvez pas mettre à jour le noyau immédiatement. De Drupal.org:

Si vous utilisez 7.x, passez à Drupal 7.58 . (Si vous ne pouvez pas mettre à jour immédiatement, vous pouvez essayer d'appliquer ce correctif pour corriger la vulnérabilité jusqu'à ce que vous puissiez mettre à jour complètement.)

Si vous utilisez 8.5.x, passez à Drupal 8.5.1 . (Si vous ne pouvez pas mettre à jour immédiatement, vous pouvez essayer d'appliquer ce correctif pour corriger la vulnérabilité jusqu'à ce que vous puissiez mettre à jour complètement.)

Pour en savoir plus, voici un FAQ sur l'exploit

10
Christia

Comment corriger Drupal 7.x à la main contre Drupal core - Hautement critique - Exécution de code à distance - SA-CORE-2018-00)

Si vous êtes sur Drupal 7.x et que vous ne parvenez pas à mettre à jour votre site en ligne vers la version 7.58, que vous n'êtes pas familier avec l'application de correctifs ou que vous êtes sur un Drupal version pour laquelle le correctif échoue, procédez comme suit:

1> Téléchargez et extrayez Drupal 7.58.

2> Copiez le fichier /includes/request-sanitizer.inc de la distribution 7.58 dans le répertoire/includes de votre site Web (le plus simple via FTP ou le gestionnaire de fichiers de votre panneau de contrôle d'hébergement).

3> Modifiez la version de /includes/bootstrap.inc sur votre site Web en direct (sauvegardez d'abord!). Recherchez la fonction _drupal_bootstrap_configuration (). Ajoutez les 3 lignes suivantes après l'instruction drupal_settings_initialize (); :

// Sanitize unsafe keys from the request.
require_once DRUPAL_ROOT . '/includes/request-sanitizer.inc';
DrupalRequestSanitizer::sanitize();

Sauver.

Se détendre.

1
elb

Voici un processus 1-2-3 simple ici:

  1. Copiez le code dans le presse-papiers d'ici https://cgit.drupalcode.org/drupal/rawdiff/?h=7.x&id=2266d2a83db50e2f97682d9a0fb8a18e2722cba5 ou comme indiqué ci-dessous.
  2. créez un fichier vierge appelé fichier 2018march.patch dans le dossier racine de votre répertoire drupal.
  3. Collez le code dans le fichier
  4. Exécutez la commande dans le terminal: patch -p1 <2018march.patch

Si vous n'avez pas d'accès SSH ou terminal. Vous devrez le faire manuellement à la main en utilisant la solution @elb de l'utilisateur.

diff --git a/includes/bootstrap.inc b/includes/bootstrap.inc
index 655db6d..880557e 100644
--- a/includes/bootstrap.inc
+++ b/includes/bootstrap.inc
@@ -2632,6 +2632,10 @@ function _drupal_bootstrap_configuration() {
   timer_start('page');
   // Initialize the configuration, including variables from settings.php.
   drupal_settings_initialize();
+
+  // Sanitize unsafe keys from the request.
+  require_once DRUPAL_ROOT . '/includes/request-sanitizer.inc';
+  DrupalRequestSanitizer::sanitize();
 }

 /**
diff --git a/includes/request-sanitizer.inc b/includes/request-sanitizer.inc
new file mode 100644
index 0000000..1daa6b5
--- /dev/null
+++ b/includes/request-sanitizer.inc
@@ -0,0 +1,82 @@
+<?php
+
+/**
+ * @file
+ * Contains code for sanitizing user input from the request.
+ */
+
+/**
+ * Sanitizes user input from the request.
+ */
+class DrupalRequestSanitizer {
+
+  /**
+   * Tracks whether the request was already sanitized.
+   */
+  protected static $sanitized = FALSE;
+
+  /**
+   * Modifies the request to strip dangerous keys from user input.
+   */
+  public static function sanitize() {
+    if (!self::$sanitized) {
+      $whitelist = variable_get('sanitize_input_whitelist', array());
+      $log_sanitized_keys = variable_get('sanitize_input_logging', FALSE);
+
+      // Process query string parameters.
+      $get_sanitized_keys = array();
+      $_GET = self::stripDangerousValues($_GET, $whitelist, $get_sanitized_keys);
+      if ($log_sanitized_keys && $get_sanitized_keys) {
+        _drupal_trigger_error_with_delayed_logging(format_string('Potentially unsafe keys removed from query string parameters (GET): @keys', array('@keys' => implode(', ', $get_sanitized_keys))), E_USER_NOTICE);
+      }
+
+      // Process request body parameters.
+      $post_sanitized_keys = array();
+      $_POST = self::stripDangerousValues($_POST, $whitelist, $post_sanitized_keys);
+      if ($log_sanitized_keys && $post_sanitized_keys) {
+        _drupal_trigger_error_with_delayed_logging(format_string('Potentially unsafe keys removed from request body parameters (POST): @keys', array('@keys' => implode(', ', $post_sanitized_keys))), E_USER_NOTICE);
+      }
+
+      // Process cookie parameters.
+      $cookie_sanitized_keys = array();
+      $_COOKIE = self::stripDangerousValues($_COOKIE, $whitelist, $cookie_sanitized_keys);
+      if ($log_sanitized_keys && $cookie_sanitized_keys) {
+        _drupal_trigger_error_with_delayed_logging(format_string('Potentially unsafe keys removed from cookie parameters (COOKIE): @keys', array('@keys' => implode(', ', $cookie_sanitized_keys))), E_USER_NOTICE);
+      }
+
+      $request_sanitized_keys = array();
+      $_REQUEST = self::stripDangerousValues($_REQUEST, $whitelist, $request_sanitized_keys);
+
+      self::$sanitized = TRUE;
+    }
+  }
+
+  /**
+   * Strips dangerous keys from the provided input.
+   *
+   * @param mixed $input
+   *   The input to sanitize.
+   * @param string[] $whitelist
+   *   An array of keys to whitelist as safe.
+   * @param string[] $sanitized_keys
+   *   An array of keys that have been removed.
+   *
+   * @return mixed
+   *   The sanitized input.
+   */
+  protected static function stripDangerousValues($input, array $whitelist, array &$sanitized_keys) {
+    if (is_array($input)) {
+      foreach ($input as $key => $value) {
+        if ($key !== '' && $key[0] === '#' && !in_array($key, $whitelist, TRUE)) {
+          unset($input[$key]);
+          $sanitized_keys[] = $key;
+        }
+        else {
+          $input[$key] = self::stripDangerousValues($input[$key], $whitelist, $sanitized_keys);
+        }
+      }
+    }
+    return $input;
+  }
+
+}
0
Patoshi パトシ