จะทราบได้อย่างไรว่าเว็บไซต์ Drupal ของฉันประกอบด้วย SA-CORE-2018-002 - 2018 March exploit?


9

เพิ่งเปิดตัวช่องโหว่: https://www.drupal.org/sa-core-2018-002 --- แกน Drupal - สำคัญมาก - การเรียกใช้รหัสระยะไกล - SA-CORE-2018-002

  • ฉันจะบอกได้อย่างไรว่ามีคนใช้การฉวยประโยชน์นี้เพื่อแฮ็คไซต์ของฉัน
  • พวกเขาจะทำอะไรกับการหาประโยชน์จากการกระทำนี้หากดำเนินการอย่างเหมาะสม?
  • ฉันไม่สามารถอัปเดตไซต์ Drupal ของฉันได้ในตอนนี้อะไรเป็นทางเลือกที่ดีในการแก้ไขรูนี้

1
ฉันต้องการเชื่อมโยงสิ่งนี้กับโพสต์ของคุณเกี่ยวกับการหาประโยชน์ครั้งใหญ่ในกรณีที่เป็นประโยชน์กับทุกคน: drupal.stackexchange.com/questions/133996/…
Christia

2
สามารถติดตามได้ในบันทึกการเข้าถึงของคุณ การเรียกใช้โค้ดจากระยะไกลทำให้สิ่งนี้สำคัญมาก สามารถเรียกใช้งานโค้ด PHP ใด ๆ ได้! ใช้แผ่นแปะโดยเร็ว - ดูคำตอบจาก Christia
rémy

1
To our knowledge the issue is not currently being exploited.โอกาสต่ำทุกคน
ไม่มี Sssweat

1
โอกาสที่ต่ำมากที่ถูกนำไปใช้ประโยชน์แล้วก่อนที่จะมีการประกาศเกี่ยวกับความปลอดภัย แต่ไม่ใช่ทุกอย่างที่จะไม่ถูกใช้ในไม่ช้า
rooby

4
มันเป็นเรื่องเล็กน้อย อย่ารอเพื่อดูว่ามีการใช้ประโยชน์หรือไม่เพียงแค่แก้ไข
Kevin

คำตอบ:


8

อาจเกิดอะไรขึ้น

ฉันมีไซต์ Drupal ส่วนบุคคลที่ถูกแฮ็กในช่วง Drupalgeddon การใช้ประโยชน์จากความรุนแรงที่คล้ายกัน (แม้ว่าจะเป็นประเภทอื่น) ในแง่ของ "สิ่งที่อาจเกิดขึ้น" ในกรณีนั้นแฮ็กเกอร์ใส่ไฟล์ "ประตูหลัง" หลายไฟล์ลงใน codebase ของฉัน (ฉันรู้เรื่องการพัฒนาน้อยมากในเวลานั้นและไม่มีที่เก็บ Git) ซึ่งเขาสามารถส่งอีเมลขยะออกไปได้ . โดเมนที่เกี่ยวข้องถูกขึ้นบัญชีดำในตัวกรองสแปมและเป็นระเบียบมากที่สามารถส่งอีเมลจากโดเมนนั้นเป็นเวลาหลายเดือนที่ฉันเก็บไว้หลังจากนั้น

เนื่องจากช่องโหว่นี้อนุญาตให้มีการเรียกใช้รหัสจากระยะไกลผู้โจมตีจึงสามารถติดตั้งโมดูลเพื่อทำการโจมตีแบบฟิชชิงดำเนินการคำสั่งบนบรรทัดคำสั่งด้วย php exec () ขโมยรหัสผ่านและทำให้เซิร์ฟเวอร์ของคุณมีช่องโหว่จำนวนมาก ความเสียหายนั้นมีตั้งแต่สิ่งที่เรียบง่ายเช่นเดียวกับที่เครื่องของคุณกำลังถูกคัดเลือกเป็นสแปมเอ็นจิ้นหรือโหนดบ็อตเน็ตหรือหากคุณมีข้อมูลที่ละเอียดอ่อนผู้โจมตีอาจขโมยและขายต่อหรือแบล็กเมล์ของคุณขึ้นอยู่กับข้อมูล

จะบอกได้อย่างไรว่าคุณถูกแฮ็ค

ส่วนใหญ่แล้วเว็บไซต์ของคุณจะไม่ถูกลบออก เมื่อเด็กอายุ 14 ปีสองกลุ่มไปด้วยกันคุณอาจเห็นไซต์ที่มีภาพของ Goatse (NSFW) แต่ถ้าแฮ็กเกอร์มีบางสิ่งบางอย่างกับคุณเป็นการส่วนตัวเขาจะไม่ทำเช่นนี้ เป้าหมายของแฮ็กเกอร์คือเงินหรือความสามารถในการก่ออาชญากรรมด้วยคอมพิวเตอร์ของคนอื่น

ในขณะนี้โดยทั่วไปสิ่งที่คุณจะเห็นคือผู้ใช้ใหม่ที่ถูกสร้างขึ้น (โดยเฉพาะผู้ใช้ที่เป็นผู้ดูแลระบบ) และในบันทึกคุณอาจเห็น IP เฉพาะที่ส่งคำขอ (ผิดปกติ) ประเภทเดียวเท่านั้น ในกรณี Drupalgeddon ฉันสามารถคิดออกโดยเห็นคำขอ POST ไปยังไฟล์ php ในบันทึกการเข้าถึงของฉัน

หากคุณไม่สามารถแก้ไขไซต์ของคุณได้ทันที

หากคุณไม่สามารถแก้ไขไซต์ได้ในตอนนี้ฉันขอแนะนำให้ตัดเซิร์ฟเวอร์ apache / nginx ดังนั้นจึงไม่มีใครสามารถเข้าถึงไซต์ของคุณได้ หรือให้เซิร์ฟเวอร์ส่งทราฟฟิกทั้งหมดไปยังหน้า HTML ที่อธิบายว่าคุณอยู่ระหว่างการบำรุงรักษาหรือที่เรียกว่า "โหมดการบำรุงรักษาอย่างหนัก" ในทุกกรณีคุณไม่ต้องการอนุญาตให้ผู้เยี่ยมชมมีการยิงที่ bootstrapping Drupal จนกว่าคุณจะได้รับการอัปเกรดหรือติดตั้ง

และเมื่อคิดย้อนกลับไปที่เว็บไซต์ของฉันที่ถูกแฮ็กโปรดจำไว้ว่าการโจมตีครั้งแรกของ Drupalgeddon เริ่มขึ้นหลังจากเปิดตัว7 ชั่วโมงและอยู่ในรูปแบบของสคริปต์ที่แฮ็คไซต์นับพันโดยอัตโนมัติ ย้ายอย่างรวดเร็ว!

หากคุณถูกแฮ็ค

หวังว่าคุณจะมีการสำรองข้อมูลซึ่งในกรณีนี้ทางออกที่ดีที่สุดคือ "nuke ทั้งไซต์จากวงโคจร" และเริ่มต้นใหม่ด้วยเซิร์ฟเวอร์ใหม่ ฉันทำการตรวจสอบฐานข้อมูลด้วยตนเองและตรวจสอบไฟล์หนึ่งครั้งเพราะฉันไม่มี Git และการสำรองข้อมูลตามปกติ - ใช้เวลานานมากแต่ถ้ามันเกิดขึ้นลองหายใจเข้าลึก ๆ และเรียนรู้ Git และเรียนรู้วิธีตั้งค่า สภาพแวดล้อมการสำรองข้อมูลที่เหมาะสม หากคุณมีธุรกิจและเว็บไซต์ลูกค้าให้บอกความจริงล่วงหน้า คุณอาจจะสูญเสียพวกเขา แต่ดีกว่าที่จะสูญเสียลูกค้า (คุณสามารถหาลูกค้าใหม่) กว่าชื่อเสียงของคุณ


10

ฉันจะบอกได้อย่างไรว่ามีคนใช้การฉวยประโยชน์นี้เพื่อแฮ็คไซต์ของฉัน

ไซต์ Drupal 7 หรือ 8 ของคุณสามารถพบข้อมูลสูญหายหรือถูกขโมยข้อมูลสามารถลบลบหรือเปลี่ยนแปลงสร้างความหายนะบนเว็บไซต์ได้หลายวิธี

ดูโพสต์ Stack Exchangeนี้สำหรับข้อมูลทั่วไปเกี่ยวกับการตรวจสอบเพื่อดูว่าเว็บไซต์ของคุณถูกแฮ็คหรือไม่

พวกเขาจะทำอะไรกับการหาประโยชน์จากการกระทำนี้หากดำเนินการอย่างเหมาะสม?

ช่องโหว่นี้เป็นช่องโหว่ในการเรียกใช้โค้ดจากระยะไกลซึ่งหมายถึงข้อมูลใด ๆ ที่มีโอกาสได้รับผลกระทบ

การใช้ประโยชน์นี้ได้รับคะแนนความเสี่ยง 21/25 ซึ่งเกือบจะสูงที่สุดที่ได้รับ คะแนนความเสี่ยงนี้กำหนดช่องโหว่ดังต่อไปนี้และอื่น ๆ :

  • AC (ความซับซ้อนในการเข้าถึง): ง่าย (ไม่มีทักษะ) ในการเข้าถึงและใช้ประโยชน์
  • A (การรับรองความถูกต้อง): ไม่จำเป็นต้องมีการตรวจสอบสิทธิ์พิเศษ
  • Cl (Confidentiality Impact): สามารถเข้าถึงข้อมูลที่ไม่เปิดเผยต่อสาธารณะทั้งหมดได้
  • II (Impact Integrity): ข้อมูลทั้งหมดสามารถแก้ไขหรือลบได้

อ่านเพิ่มเติมเกี่ยวกับการให้คะแนนความเสี่ยงและความหมายที่นี่

ฉันไม่สามารถอัปเดตไซต์ Drupal ของฉันได้ในตอนนี้อะไรเป็นทางเลือกที่ดีในการแก้ไขรูนี้

มีโปรแกรมแก้ไขหากคุณไม่สามารถอัปเดตคอร์ได้ในทันที จาก Drupal.org:

ถ้าคุณกำลังเรียก 7.x, อัพเกรดDrupal 7.58 (หากคุณไม่สามารถอัปเดตได้ในทันทีคุณสามารถลองใช้โปรแกรมแก้ไขนี้เพื่อแก้ไขช่องโหว่ได้จนกว่าจะถึงเวลาที่คุณสามารถอัปเดตได้อย่างสมบูรณ์)

ถ้าคุณกำลังเรียก 8.5.x, อัพเกรดDrupal 8.5.1 (หากคุณไม่สามารถอัปเดตได้ในทันทีคุณสามารถลองใช้โปรแกรมแก้ไขนี้เพื่อแก้ไขช่องโหว่ได้จนกว่าจะถึงเวลาที่คุณสามารถอัปเดตได้อย่างสมบูรณ์)

หากต้องการอ่านเพิ่มเติมนี่คือคำถามที่พบบ่อยเกี่ยวกับการหาประโยชน์


2
ฉันต้องการเพิ่มลิงก์ไปยังประกาศการบริการสาธารณะฉบับวันที่ 21 มีนาคมเช่นกัน การหาประโยชน์อาจคาดว่าภายในไม่กี่ชั่วโมงหรือหลายวัน ดังนั้นอัปเดตโดยเร็ว
Neograph734

นี่คือคำแนะนำ Drupal สำหรับไซต์ที่ถูกแฮ็กในกรณีที่ทุกคนต้องการ: drupal.org/drupal-security-team/ …
Christia

1
ฉันจะบอกว่าวิธีที่ดีที่สุดในการดำเนินการคือการใช้โปรแกรมแก้ไขทันทีจากนั้นอัปเดตไซต์ของคุณเป็นเวอร์ชันล่าสุด สาเหตุที่เป็นเช่นนั้นเว้นแต่ว่าเว็บไซต์ของคุณจะได้รับการปรับปรุงให้ทันสมัยอยู่เสมอการอัปเดตความปลอดภัยของโมดูลจะใช้เวลามากขึ้นในการทดสอบในปริมาณที่เหมาะสมและอาจต้องใช้การปรับใช้ที่เกี่ยวข้องมากกว่า ดังนั้นการแก้ไขที่สำคัญที่สุดให้เร็วที่สุดควรเป็นวิธีที่ต้องการ
rooby

1

วิธีแก้ไข Drupal 7.x ด้วยมือกับแกน Drupal - สำคัญมาก - การเรียกใช้รหัสจากระยะไกล - SA-CORE-2018-00

หากคุณใช้ Drupal 7.x และไม่สามารถอัปเดตไซต์สดของคุณเป็น 7.58 ไม่คุ้นเคยกับการใช้โปรแกรมแก้ไขหรือเป็นรุ่น Drupal ซึ่งโปรแกรมแก้ไขไม่ทำงานดังต่อไปนี้:

1> ดาวน์โหลดและแยก Drupal 7.58

2> คัดลอกไฟล์ /includes/request-sanitizer.inc จากการแจกจ่าย 7.58 ไปยังไดเรกทอรี / รวมเว็บไซต์ของคุณ (ง่ายที่สุดผ่าน FTP หรือตัวจัดการไฟล์ของแผงควบคุมโฮสติ้ง)

3> แก้ไขเวอร์ชันของ /includes/bootstrap.inc บนเว็บไซต์สดของคุณ (สำรองไว้ก่อน!) ค้นหาฟังก์ชัน _drupal_bootstrap_configuration () เพิ่ม 3 บรรทัดต่อไปนี้หลังจากคำสั่ง drupal_settings_initialize (); :

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

บันทึก

ผ่อนคลาย.


0

นี่คือกระบวนการ 1-2-3 อย่างง่ายทั้งหมดที่นี่:

  1. คัดลอกรหัสไปยังคลิปบอร์ดจากที่นี่https://cgit.drupalcode.org/drupal/rawdiff/?h=7.x&id=2266d2a83db50e2f97682d9a0fb8a18e2722cba5หรือตามที่ระบุไว้ด้านล่าง
  2. สร้างไฟล์เปล่าชื่อ 2018march.patch ไฟล์ในโฟลเดอร์รูทของไดเรกทอรี drupal ของคุณ
  3. วางรหัสลงในไฟล์
  4. รันคำสั่งในเทอร์มินัล: patch -p1 <2018march.patch

หากคุณไม่มีการเข้าถึง SSH หรือเทอร์มินัล คุณจะต้องทำด้วยตนเองโดยใช้โซลูชัน @elb ของผู้ใช้

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;
+  }
+
+}

คุณต้องติดตั้งคอมไพล์เพื่อทำสิ่งนี้
user2924019
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.