¿Cómo saber si mi sitio de Drupal está compuesto por el exploit SA-CORE-2018-002 - 2018 March?

9

Exploit recién lanzado: https://www.drupal.org/sa-core-2018-002 --- Drupal core - Altamente crítico - Ejecución remota de código - SA-CORE-2018-002

  • ¿Cómo puedo saber si alguien usó este exploit para hackear mi sitio?
  • ¿Qué pueden hacer con este exploit si se ejecutan correctamente?
  • No puedo actualizar mis sitios de Drupal ahora, ¿cuál es una buena alternativa para reparar este agujero fácilmente?
Patoshi パ ト シ
fuente
1
Quería vincular esto a su publicación sobre el último gran exploit en caso de que sea útil para alguien: drupal.stackexchange.com/questions/133996/…
Christia
2
Es rastreable en sus registros de acceso. La ejecución remota de código hace que esto sea muy crítico. ¡Se puede ejecutar cualquier código PHP! Aplique los parches lo antes posible - vea la respuesta de Christia
rémy
1
To our knowledge the issue is not currently being exploited.Las posibilidades son muy bajas.
No Sssweat
1
Lo más probable es que ya haya sido explotado antes de la publicación del aviso de seguridad, pero no tanto como para que no sea explotado muy pronto.
rooby
44
Es trivial No espere para ver si está explotado, solo parchelo.
Kevin

Respuestas:

8

Qué podría pasar

Tuve un sitio personal de Drupal pirateado durante Drupalgeddon, una hazaña de gravedad similar (aunque de un tipo diferente). En términos de "lo que podría pasar", en ese caso, el hacker puso varios archivos de "puerta trasera" en mi base de código (sabía muy poco sobre el desarrollo en ese momento y no tenía un repositorio Git), desde el cual podía enviar correos electrónicos no deseados. . El dominio involucrado estaba en la lista negra de los filtros de spam, y fue un gran desastre poder enviar correos electrónicos desde ese dominio durante los meses que lo había guardado después.

Dado que esta vulnerabilidad permite la ejecución remota de código, el atacante podría instalar módulos para llevar a cabo ataques de phishing, ejecutar comandos en la línea de comandos con php exec (), robar contraseñas y comprometer gran parte de su servidor. El daño puede variar desde algo tan simple como que su máquina sea reclutada como un motor de spam o un nodo de botnet, o si tiene información confidencial, el atacante podría robarla y revenderla o chantajearla, dependiendo de la información y los motivos del atacante.

Cómo saber si has sido pirateado

La mayoría de las veces, su sitio no será dañado. Cuando dos grupos de niños de script de 14 años se enfrentan entre sí, es posible que vea un sitio desfigurado con imágenes de Goatse (NSFW), pero a menos que el pirata informático tenga algo en su contra personalmente, no va a hacer esto. El objetivo del pirata informático es dinero o la capacidad de cometer delitos con la computadora de otra persona.

Ahora con eso en mente, lo más común que verá son los nuevos usuarios que se están creando (especialmente los usuarios administradores), y en los registros puede ver que una IP en particular envía solo un tipo de solicitud (anormal). En el caso de Drupalgeddon, pude resolverlo viendo solicitudes POST a un archivo php en mi registro de acceso.

Si no puede parchear su sitio de inmediato

Si no puede parchear el sitio ahora, recomendaría cortar el servidor apache / nginx para que nadie pueda acceder a su sitio. O bien, haga que el servidor dirija todo el tráfico a una página HTML explicando que está inactivo por mantenimiento, también conocido como "modo de mantenimiento difícil". En todos los casos, no desea permitir que un visitante tenga ninguna oportunidad de poner en marcha Drupal, hasta que pueda obtener una actualización o parche en su lugar.

Y recordando que mi sitio fue pirateado, recuerde que los primeros ataques de Drupalgeddon comenzaron 7 horas después del lanzamiento, y fue en forma de un script que hackeó automáticamente miles de sitios. ¡Muévete rápido!

Si eres hackeado

Esperemos que tenga una copia de seguridad, en cuyo caso la mejor opción es "destruir el sitio entero desde la órbita" y comenzar de nuevo con un nuevo servidor. Hice un manual de auditoría de base de datos y archivo de una vez porque no tenía Git y copias de seguridad periódicas en su lugar - se necesita un muy largo tiempo, pero si sucede, tomar una respiración profunda, y aprender Git y aprender cómo configurar una entorno de respaldo adecuado. Si tiene un negocio y es un sitio para clientes, dígales la verdad por adelantado. Probablemente los perderá, pero es mejor perder un cliente (puede obtener nuevos) que su reputación.

Mike Nolan
fuente
10

¿Cómo puedo saber si alguien usó este exploit para hackear mi sitio?

Su sitio Drupal 7 u 8 puede experimentar pérdida o robo de datos, los datos se pueden eliminar, eliminar o cambiar, causando estragos en el sitio de muchas maneras diferentes.

Consulte esta publicación de Stack Exchange para obtener información general sobre cómo verificar si su sitio web ha sido pirateado.

¿Qué pueden hacer con este exploit si se ejecutan correctamente?

El exploit es una vulnerabilidad de ejecución remota de código, lo que significa que cualquier dato tiene el potencial de verse afectado.

Este exploit ha recibido una puntuación de riesgo de 21/25, que es casi la más alta que obtiene. Este puntaje de riesgo también define las siguientes vulnerabilidades, entre otras:

  • AC (complejidad de acceso): fácil (sin habilidad) para acceder y explotar
  • A (Autenticación): no se necesita autenticación especial
  • Cl (impacto de confidencialidad): todos los datos no públicos son accesibles
  • II (impacto de integridad): todos los datos se pueden modificar o eliminar

Lea más sobre puntuación de riesgo y definiciones aquí .

No puedo actualizar mis sitios de Drupal ahora, ¿cuál es una buena alternativa para reparar este agujero fácilmente?

Hay un parche disponible si no puede actualizar el núcleo de inmediato. De Drupal.org:

Si está ejecutando 7.x, actualice a Drupal 7.58 . (Si no puede actualizar de inmediato, puede intentar aplicar este parche para corregir la vulnerabilidad hasta el momento en que pueda actualizar por completo).

Si está ejecutando 8.5.x, actualice a Drupal 8.5.1 . (Si no puede actualizar de inmediato, puede intentar aplicar este parche para corregir la vulnerabilidad hasta el momento en que pueda actualizar por completo).

Para leer más, aquí hay un FAQ sobre el exploit

Christia
fuente
2
También me gustaría agregar un enlace a este anuncio de servicio público del 21 de marzo. Se pueden esperar hazañas en cuestión de horas o días. Así que actualice lo antes posible.
Neograph734
Aquí está la guía de Drupal para sitios pirateados, en caso de que alguien lo necesite: drupal.org/drupal-security-team/…
Christia
1
Diría que el mejor curso de acción es aplicar el parche de inmediato y luego actualizar sus sitios a la última versión. La razón es que, a menos que su sitio siempre se mantenga extremadamente actualizado, una ronda de actualizaciones de seguridad del módulo llevará más tiempo para proporcionar la cantidad adecuada de pruebas y probablemente también requiera una implementación más complicada. Por lo tanto, obtener la solución más importante lo más rápido posible debería ser el enfoque preferido.
rooby
1

Cómo parchear Drupal 7.x a mano contra el núcleo de Drupal - Altamente crítico - Ejecución remota de código - SA-CORE-2018-00

Si está en Drupal 7.x y no puede actualizar su sitio en vivo a 7.58, no está familiarizado con la aplicación de parches, o está en una versión de Drupal para la cual el parche falla, haga lo siguiente:

1> Descargar y extraer Drupal 7.58.

2> Copie el archivo /includes/request-sanitizer.inc de la distribución 7.58 en el directorio / include de su sitio web (lo más fácil a través de FTP o su administrador de archivos del panel de control de alojamiento).

3> Edite la versión de /includes/bootstrap.inc en su sitio web en vivo (¡primero haga una copia de seguridad!). Encuentre la función _drupal_bootstrap_configuration (). Agregue las siguientes 3 líneas después de la declaración drupal_settings_initialize (); :

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

Salvar.

Relajarse.

elb
fuente
0

Aquí hay un simple proceso 1-2-3 todo aquí:

  1. Copie el código al portapapeles desde aquí https://cgit.drupalcode.org/drupal/rawdiff/?h=7.x&id=2266d2a83db50e2f97682d9a0fb8a18e2722cba5 o como se cita a continuación.
  2. cree un archivo en blanco llamado archivo 2018march.patch en la carpeta raíz de su directorio drupal.
  3. Pega el código en el archivo
  4. Ejecute el comando en la terminal: patch -p1 <2018march.patch

Si no tiene SSH o acceso a la terminal. Deberá hacerlo manualmente con la solución @elb del usuario.

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;
+  }
+
+}
Patoshi パ ト シ
fuente
Necesita git instalado para hacer esto.
user2924019