Bagaimana cara mengetahui apakah situs Drupal saya terdiri dari eksploitasi SA-CORE-2018-002 - 2018 Maret?

9

Eksploitasi yang baru dirilis: https://www.drupal.org/sa-core-2018-002 --- inti Drupal - Sangat kritis - Eksekusi Kode Jarak Jauh - SA-CORE-2018-002

  • Bagaimana saya bisa tahu jika seseorang menggunakan exploit ini untuk meretas situs saya?
  • Apa yang bisa mereka lakukan dengan exploit ini jika dijalankan dengan benar?
  • Saya tidak dapat memperbarui situs Drupal saya sekarang, apa alternatif yang baik untuk menambal lubang ini dengan mudah?
Patoshi パ ト シ
sumber
1
Saya ingin menautkan ini ke posting Anda tentang exploit besar terakhir jika bermanfaat bagi siapa pun: drupal.stackexchange.com/questions/133996/…
Christia
2
Itu dapat dilacak di log akses Anda. Eksekusi Kode Jarak Jauh membuat ini sangat kritis. Kode PHP apa pun dapat dieksekusi !.
Segera terapkan
1
To our knowledge the issue is not currently being exploited.kemungkinannya adalah setiap rendah.
Tidak ada Sssweat
1
Kemungkinannya sangat rendah sehingga sudah dieksploitasi sebelum dikeluarkannya pemberitahuan keamanan, tetapi tidak semua yang terlalu rendah sehingga tidak akan segera dieksploitasi.
rooby
4
Itu sepele. Jangan menunggu untuk melihat apakah itu dieksploitasi, tambal saja.
Kevin

Jawaban:

8

Apa yang bisa terjadi?

Saya memiliki situs Drupal pribadi yang diretas selama Drupalgeddon, sebuah eksploitasi dengan tingkat keparahan yang sama (meskipun dari jenis yang berbeda). Dalam hal "apa yang bisa terjadi," dalam hal itu peretas memasukkan beberapa file "pintu belakang" ke dalam basis kode saya (saya tahu sedikit tentang pengembangan pada saat itu, dan tidak memiliki repositori Git), dari mana ia dapat mengirimkan email spam . Domain yang terlibat dimasukkan dalam daftar hitam di filter spam, dan itu adalah kekacauan besar untuk dapat mengirim email dari domain itu selama beberapa bulan saya telah menyimpannya setelah itu.

Karena kerentanan ini memungkinkan eksekusi kode jarak jauh, penyerang mungkin dapat menginstal modul untuk melakukan serangan phishing, melaksanakan perintah pada baris perintah dengan php exec (), mencuri kata sandi, dan dengan demikian membahayakan sebagian besar server Anda. Kerusakan dapat berkisar dari sesuatu yang sederhana seperti mesin Anda direkrut sebagai mesin spam atau simpul botnet, atau jika Anda memiliki informasi sensitif, penyerang mungkin mencurinya dan menjualnya kembali atau memeras Anda, tergantung pada informasi dan motif penyerang.

Bagaimana cara mengetahui apakah Anda telah diretas

Sebagian besar waktu, situs Anda tidak akan dirusak. Ketika dua kelompok kiddies skrip berusia 14 tahun saling bertabrakan, Anda mungkin melihat sebuah situs dirusak dengan gambar Goatse (NSFW), tetapi kecuali jika peretas memiliki sesuatu terhadap Anda secara pribadi, ia tidak akan melakukan ini. Tujuan peretas adalah uang atau kemampuan untuk melakukan kejahatan dengan komputer orang lain.

Sekarang dengan itu dalam pikiran, hal-hal umum yang akan Anda lihat adalah pengguna baru sedang dibuat (terutama pengguna admin), dan dalam log Anda mungkin melihat IP tertentu mengirim hanya satu jenis permintaan (tidak normal). Dalam kasus Drupalgeddon, saya dapat mengetahuinya dengan melihat permintaan POST ke file php di log akses saya.

Jika Anda tidak dapat menambal situs Anda segera

Jika Anda tidak dapat menambal situs sekarang, saya akan merekomendasikan memotong server apache / nginx sehingga tidak ada yang bisa sampai ke situs Anda. Atau, minta server mengarahkan semua lalu lintas ke halaman HTML yang menjelaskan bahwa Anda tidak dapat melakukan pemeliharaan, alias "mode pemeliharaan sulit." Dalam semua kasus, Anda tidak ingin membolehkan pengunjung untuk mengambil suntikan di bootstrap Drupal, sampai Anda bisa mendapatkan pembaruan atau tambalan di tempat.

Dan berpikir kembali ke situs saya yang diretas, ingat bahwa serangan Drupalgeddon pertama dimulai 7 jam setelah rilis, dan itu dalam bentuk skrip yang meretas ribuan situs secara otomatis. Bergerak cepat!

Jika Anda diretas

Semoga Anda memiliki cadangan, dalam hal ini taruhan terbaik adalah untuk "nuke seluruh situs dari orbit" dan mulai lagi dengan server baru. Saya melakukan DB manual dan mengaudit sekali karena saya tidak memiliki Git dan cadangan reguler di tempat - dibutuhkan waktu yang sangat lama, tetapi jika itu terjadi, ambil napas dalam-dalam, dan pelajari Git dan pelajari cara mengatur lingkungan cadangan yang tepat. Jika Anda memiliki bisnis dan ini adalah situs pelanggan, katakan yang sebenarnya di depan mereka. Anda mungkin akan kehilangan mereka, tetapi lebih baik kehilangan pelanggan (Anda bisa mendapatkan yang baru) daripada reputasi Anda.

Mike Nolan
sumber
10

Bagaimana saya bisa tahu jika seseorang menggunakan exploit ini untuk meretas situs saya?

Situs Drupal 7 atau 8 Anda dapat mengalami kehilangan atau pencurian data, data dapat dihapus, dihapus atau diubah, mendatangkan malapetaka di situs dengan berbagai cara.

Lihat posting Stack Exchange ini untuk informasi umum tentang memeriksa untuk melihat apakah situs web Anda telah diretas.

Apa yang bisa mereka lakukan dengan exploit ini jika dijalankan dengan benar?

Eksploitasi adalah kerentanan eksekusi kode jauh, yang berarti setiap data berpotensi terpengaruh.

Eksploitasi ini telah diberi skor risiko 21/25, yang merupakan nilai tertinggi yang didapatnya. Skor risiko ini juga mendefinisikan kerentanan berikut, antara lain:

  • AC (Kompleksitas akses): mudah (tanpa keahlian) untuk mengakses dan mengeksploitasi
  • A (Otentikasi): tidak diperlukan otentikasi khusus
  • Cl (Dampak kerahasiaan): semua data non-publik dapat diakses
  • II (Dampak integritas): Semua data dapat dimodifikasi atau dihapus

Baca lebih lanjut tentang penilaian risiko dan definisi di sini .

Saya tidak dapat memperbarui situs Drupal saya sekarang, apa alternatif yang baik untuk menambal lubang ini dengan mudah?

Ada tambalan yang tersedia jika Anda tidak dapat segera memperbarui inti. Dari Drupal.org:

Jika Anda menjalankan 7.x, tingkatkan ke Drupal 7.58 . (Jika Anda tidak dapat segera memperbarui, Anda dapat mencoba menerapkan tambalan ini untuk memperbaiki kerentanan sampai Anda dapat memperbarui sepenuhnya.)

Jika Anda menjalankan 8.5.x, tingkatkan ke Drupal 8.5.1 . (Jika Anda tidak dapat segera memperbarui, Anda dapat mencoba menerapkan tambalan ini untuk memperbaiki kerentanan sampai Anda dapat memperbarui sepenuhnya.)

Untuk membaca lebih lanjut, berikut ini adalah FAQ tentang exploit

Christia
sumber
2
Saya ingin menambahkan tautan ke pengumuman layanan publik 21 Maret ini juga. Eksploitasi mungkin diharapkan dalam hitungan jam atau hari. Jadi perbarui ASAP.
Neograph734
Berikut ini adalah panduan Drupal untuk situs-situs yang diretas, kalau-kalau ada yang membutuhkannya: drupal.org/drupal-security-team/…
Christia
1
Saya akan mengatakan tindakan terbaik adalah menerapkan tambalan segera, lalu perbarui situs Anda ke versi terbaru. Alasannya adalah bahwa, kecuali jika situs Anda selalu selalu terbarui, putaran pembaruan keamanan modul akan membutuhkan lebih banyak waktu untuk memberikan jumlah pengujian yang tepat dan juga kemungkinan membutuhkan penyebaran yang lebih terlibat. Jadi mendapatkan perbaikan yang paling penting secepat mungkin harus menjadi pendekatan yang disukai.
rooby
1

Cara menambal Drupal 7.x dengan tangan terhadap inti Drupal - Sangat kritis - Eksekusi Kode Jarak Jauh - SA-CORE-2018-00

Jika Anda menggunakan Drupal 7.x dan tidak dapat memperbarui situs langsung Anda ke 7.58, tidak terbiasa menerapkan tambalan, atau menggunakan versi Drupal yang tambalannya gagal lakukan hal berikut:

1> Unduh dan ekstrak Drupal 7.58.

2> Salin file /includes/request-sanitizer.inc dari distribusi 7,58 ke direktori situs / sertakan Anda (termudah melalui FTP atau manajer file panel kontrol hosting Anda).

3> Edit versi /includes/bootstrap.inc di situs web langsung Anda (backup terlebih dahulu!). Temukan fungsi _drupal_bootstrap_configuration (). Tambahkan 3 baris berikut setelah pernyataan drupal_settings_initialize (); :

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

Menyimpan.

Bersantai.

elb
sumber
0

Berikut adalah proses 1-2-3 sederhana di sini:

  1. Salin kode ke papan klip dari sini https://cgit.drupalcode.org/drupal/rawdiff/?h=7.x&id=2266d2a83db50e2f97682d9a0fb8a18e2722cba5 atau seperti yang dikutip di bawah ini.
  2. buat file kosong bernama 2018march.patch file di folder root direktori drupal Anda.
  3. Tempel kode ke dalam file
  4. Jalankan perintah di terminal: patch -p1 <2018march.patch

Jika Anda tidak memiliki akses SSH atau terminal. Anda harus melakukannya secara manual menggunakan solusi @elb pengguna.

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 パ ト シ
sumber
Anda perlu menginstal git untuk melakukan ini.
user2924019