Memeriksa VM untuk mengetahui tanda-tanda modifikasi memori kernel

Halaman ini menjelaskan tugas yang dapat Anda lakukan untuk mengonfirmasi validitas temuan rootkit mode kernel dari Virtual Machine Threat Detection. Temuan rootkit mode kernel menunjukkan bahwa memori kernel VM berpotensi dirusak oleh malware.

Saat Anda menerima temuan rootkit mode kernel dari Deteksi Ancaman VM, sebaiknya jalankan perintah Linux ini pada instance Compute Engine yang terpengaruh untuk menyelidiki sistem Anda terkait titik data yang mungkin menunjukkan anomali, seperti panggilan sistem yang dibajak atau modul kernel tersembunyi.

Atau, Anda dapat menjalankan skrip pengumpulan data yang disediakan di VM yang terpengaruh. Skrip menjalankan perintah yang dijelaskan di halaman ini.

Kecuali dinyatakan lain, setiap tugas inspeksi di halaman ini relevan dengan semua temuan rootkit mode kernel.

Dokumen ini mengasumsikan hal berikut:

  • Anda melakukan tugas-tugas dalam dokumen ini setelah menerima temuan rootkit mode kernel dari Deteksi Ancaman VM. Untuk mengetahui daftar kategori temuan yang relevan, lihat Temuan ancaman rootkit mode kernel.

  • Anda memahami alat command line Linux dan kernel Linux.

Tentang VM Threat Detection

Virtual Machine Threat Detection adalah layanan bawaan Security Command Center yang tersedia di paket Enterprise dan Premium. Layanan ini memindai virtual machine untuk mendeteksi aplikasi yang berpotensi berbahaya, seperti software penambangan mata uang kripto, rootkit mode kernel, dan malware yang berjalan di lingkungan cloud yang terkompromi.

Deteksi Ancaman VM adalah bagian dari rangkaian deteksi ancaman Security Command Center dan dirancang untuk melengkapi kemampuan Deteksi Ancaman Peristiwa dan Deteksi Ancaman Container yang sudah ada.

Untuk mengetahui informasi tentang VM Threat Detection, lihat Ringkasan Virtual Machine Threat Detection. Untuk mempelajari cara melihat detail temuan Deteksi Ancaman VM, lihat Meninjau temuan di konsol Google Cloud .

Sebelum memulai

Untuk mendapatkan izin yang diperlukan untuk melihat semua resource dan temuan di Security Command Center dan mengelola instance Compute Engine yang terpengaruh, minta administrator Anda untuk memberi Anda peran IAM berikut:

Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat Mengelola akses ke project, folder, dan organisasi.

Anda mungkin juga bisa mendapatkan izin yang diperlukan melalui peran khusus atau peran bawaan lainnya.

Identifikasi VM yang terpengaruh

  1. Lihat detail temuan.
  2. Di bagian Resource yang terpengaruh, di kolom Nama lengkap resource, klik link. Tampilan detail instance Compute Engine yang terpengaruh akan terbuka di tab baru.
  3. Hubungkan ke instance. Untuk mengetahui informasi selengkapnya, lihat Menghubungkan ke VM Linux dalam dokumentasi Compute Engine.

Menemukan modul kernel yang tidak terduga

Keberadaan modul yang tidak terduga di VM dapat menunjukkan bahwa memori kernel VM berpotensi disusupi.

Untuk menemukan modul kernel yang tidak terduga, ikuti langkah-langkah berikut:

  1. Mencantumkan semua modul kernel yang dimuat di VM:

    lsmod
    cat /proc/modules
    
  2. Buat daftar entri sysfs untuk modul yang dimuat dan dibongkar:

    ls -l /sys/module/
    
  3. Bandingkan hasil daftar ini dengan daftar dari VM lain dalam project. Cari modul yang muncul di VM yang terpengaruh, tetapi tidak di VM lainnya.

Telusuri syslog untuk modul di luar pohon

Tanda bahwa modul di luar pohon telah dimuat di VM dapat menunjukkan bahwa modul kernel yang tidak biasa telah dimuat. Anda dapat menelusuri buffer log kernel dan pesan syslog untuk menentukan apakah modul di luar pohon telah dimuat. Dalam entri log, modul di luar pohon ditandai sebagai pemuatan yang rusak.

Di buffer log kernel dan pesan syslog, telusuri entri log yang menyerupai berikut ini:

MODULE_NAME: loading out-of-tree module taints kernel.
  • Telusuri buffer log kernel untuk menemukan entri log yang menunjukkan keberadaan modul di luar struktur:

    sudo dmesg | grep out-of-tree
    
  • Telusuri semua pesan syslog untuk entri log yang menunjukkan keberadaan modul di luar pohon:

    grep "out-of-tree" /var/log/syslog*
    

Memeriksa livepatching

Livepatching di VM dapat mengganggu deteksi Deteksi Ancaman VM dan dapat memicu temuan positif palsu.

Untuk memeriksa livepatching, ikuti langkah-langkah berikut:

  1. Periksa syslog untuk penginstalan dan logging modul livepatching. Patching langsung biasanya mengubah kode kernel dengan menginstal titik ftrace kernel.

    sudo grep livepatch /var/log/syslog*
    
  2. Telusuri modul kernel baru yang diinstal untuk livepatching (biasanya diawali dengan livepatch):

    sudo lsmod | grep livepatch
    
  3. Menelusuri file patch:

    sudo ls -l /sys/kernel/livepatch
    

Untuk mengetahui informasi tentang livepatching, lihat Livepatch di dokumentasi Kernel Linux.

Periksa aktivitas berpotensi berbahaya lainnya yang terdeteksi di VM

  1. Di Security Command Center, lihat detail temuan Deteksi Ancaman VMyang sedang Anda selidiki.
  2. Di bagian Resource yang terpengaruh, di kolom Nama lengkap resource, klik panah drop-down, lalu klik Tampilkan semua temuan dengan nama lengkap resource ini. Kueri temuan diperbarui untuk hanya menampilkan temuan untuk VM ini.
  3. Periksa temuan yang mengarah pada potensi aktivitas cryptomining, malware, pemberian IAM yang tidak biasa, dan ancaman keamanan lainnya.

Memeriksa apakah software antivirus menyebabkan temuan positif palsu

Software antivirus dapat mengganggu deteksi Deteksi Ancaman VM dan dapat memicu temuan positif palsu.

Memeriksa semua proses yang berjalan di sistem

Keberadaan proses yang tidak terduga dapat menunjukkan bahwa temuan VM Threat Detection valid dan VM telah disusupi.

  1. Mencantumkan semua proses yang berjalan di VM:

    ps -eAf
    
  2. Cari proses debugger—seperti gdb, strace, dan pstack—yang biasanya tidak Anda jalankan di VM ini. Proses debugger dapat mengintai proses lain.

  3. Cari proses mencurigakan lainnya di VM.

Memeriksa kernel yang di-boot

Periksa kernel yang di-boot untuk mengidentifikasi kernel Linux Anda:

cat /proc/version

Jika nilai yang ditampilkan bukan versi kernel yang Anda harapkan, hal itu dapat mengindikasikan serangan pembajakan yang dilakukan dengan mengeksploitasi alat kexec di kernel. Alat kexec dapat melakukan softboot pada sistem untuk menggunakan kernel yang berbeda.

Tugas tambahan untuk Unexpected system call handler

Lakukan tugas ini jika Anda mendapatkan temuan Defense Evasion: Unexpected system call handler.

Mengaudit panggilan sistem dan mencari anomali dalam penggunaan dan pemanggilnya. Log audit memberikan informasi tentang proses dan argumen pemanggilan untuk panggilan sistem. Anda juga dapat melakukan tugas verifikasi untuk memeriksa perilaku yang diharapkan dari panggilan sistem umum. Untuk mengetahui informasi selengkapnya, lihat Contoh pemeriksaan dengan rootkit Diamorphine di halaman ini.

Tugas tambahan untuk Unexpected interrupt handler

Lakukan tugas ini jika Anda mendapatkan temuan Defense Evasion: Unexpected interrupt handler.

Buat daftar handler interupsi langsung di sistem dan bandingkan hasilnya dengan informasi dari VM serupa lainnya dalam project. Handler interupsi yang tidak terduga dapat menunjukkan bahwa VM telah disusupi.

Untuk mencantumkan handler interupsi aktif, jalankan perintah berikut:

cat /proc/interrupts

Outputnya akan terlihat seperti berikut:

           CPU0       CPU1
  0:         44          0   IO-APIC   0-edge      timer
  1:          9          0   IO-APIC   1-edge      i8042
  4:      17493          0   IO-APIC   4-edge      ttyS0
  8:          0          0   IO-APIC   8-edge      rtc0
  9:          0          0   IO-APIC   9-fasteoi   acpi
 12:          0        152   IO-APIC  12-edge      i8042
 24:         16          0   PCI-MSI 81920-edge      virtio2-config
 25:          0      40194   PCI-MSI 81921-edge      virtio2-inflate
 26:      58528          0   PCI-MSI 81922-edge      virtio2-deflate
 27:          0     966356   PCI-MSI 81923-edge      virtio2-stats
 28:          0          0   PCI-MSI 49152-edge      virtio0-config
 29:          0          0   PCI-MSI 49153-edge      virtio0-control
 30:          0          0   PCI-MSI 49154-edge      virtio0-event
 31:          0     555807   PCI-MSI 49155-edge      virtio0-request
 32:          0          0   PCI-MSI 98304-edge      virtio3-config
 33:        184          0   PCI-MSI 98305-edge      virtio3-input
 34:          0          0   PCI-MSI 65536-edge      virtio1-config
 35:     556203          0   PCI-MSI 65537-edge      virtio1-input.0
 36:     552746          1   PCI-MSI 65538-edge      virtio1-output.0
 37:          1     426036   PCI-MSI 65539-edge      virtio1-input.1
 38:          0     408475   PCI-MSI 65540-edge      virtio1-output.1

Tugas tambahan untuk Unexpected processes in runqueue

Lakukan langkah-langkah berikut jika Anda mendapatkan temuan Defense Evasion: Unexpected processes in runqueue. Bagian ini membantu Anda mengumpulkan titik data tambahan untuk menyelidiki temuan Anda. Titik data ini mungkin tidak secara langsung menunjukkan masalah malware.

Dalam tugas ini, Anda akan meninjau antrean penjadwal per-CPU. Meskipun beberapa proses mungkin berumur pendek, Anda tetap dapat mengevaluasi perilaku antrean penjadwal dengan proses yang berjalan per CPU untuk mencari perilaku anomali.

  1. Menampilkan detail tentang jumlah waktu yang dihabiskan setiap proses yang sedang berjalan per CPU. Hal ini membantu Anda melihat apakah CPU tertentu sangat sibuk. Anda dapat mengorelasikan hasil dengan interupsi yang disematkan ke CPU dari /proc/interrupts.

    cat /proc/schedstat
    

    Untuk mengetahui informasi selengkapnya tentang perintah ini, lihat Statistik Scheduler dalam dokumentasi Kernel Linux.

  2. Mencantumkan semua tugas yang dapat dijalankan saat ini dan detail tentang peralihan konteks untuk setiap CPU.

    cat /proc/sched_debug
    

    Outputnya akan terlihat seperti berikut:

    Sched Debug Version: v0.11, 5.4.0-1081-gke #87-Ubuntu
    ktime                                   : 976187427.733850
    sched_clk                               : 976101974.761097
    cpu_clk                                 : 976101973.335113
    jiffies                                 : 4538939132
    sched_clock_stable()                    : 1
    
    sysctl_sched
      .sysctl_sched_latency                    : 12.000000
      .sysctl_sched_min_granularity            : 1.500000
      .sysctl_sched_wakeup_granularity         : 2.000000
      .sysctl_sched_child_runs_first           : 0
      .sysctl_sched_features                   : 2059067
      .sysctl_sched_tunable_scaling            : 1 (logarithmic)
    
    cpu#0, 2199.998 MHz
      .nr_running                    : 0
      .nr_switches                   : 16250401
      .nr_load_updates               : 0
      .nr_uninterruptible            : 12692
      .next_balance                  : 4538.939133
      .curr->pid                     : 0
      .clock                         : 976101971.732857
      .clock_task                    : 976101971.732857
      .avg_idle                      : 880408
      .max_idle_balance_cost         : 500000
    
    runnable tasks:
     S           task   PID         tree-key  switches  prio     wait-time             sum-exec        sum-sleep
    -----------------------------------------------------------------------------------------------------------
     S        systemd     1     51740.602172    326778   120         0.000000    165741.786097         0.000000 0 0 /init.scope
     S       kthreadd     2   1482297.917240      1361   120         0.000000       112.028205         0.000000 0 0 /
     I      rcu_sched    11   1482642.606136   1090339   120         0.000000     17958.156471         0.000000 0 0 /
     S        cpuhp/1    15       537.058588         8   120         0.000000         2.275927         0.000000 0 0 /
     S  idle_inject/1    16        -2.994953         3    49         0.000000         0.012780         0.000000 0 0 /
     S    migration/1    17         0.000000    245774     0         0.000000      5566.508869         0.000000 0 0 /
     S    ksoftirqd/1    18   1482595.656315     47766   120         0.000000      1235.099147         0.000000 0 0 /
     I   kworker/1:0H    20       536.961474         5   100         0.000000         0.043908         0.000000 0 0 /
     S      kdevtmpfs    21     11301.343465       177   120         0.000000         3.195291         0.000000 0 0 /
     I          netns    22         6.983329         2   100         0.000000         0.021870         0.000000 0 0 /
     Srcu_tasks_kthre    23        10.993528         2   120         0.000000         0.010200         0.000000 0 0 /
     S        kauditd    24   1482525.828948       319   120         0.000000        14.489652         0.000000 0 0 /
    
  3. Cari hal berikut:

    • Nama proses yang sedang berjalan.
    • Jumlah pengalihan konteks per CPU. Lihat apakah suatu proses mengalami terlalu sedikit atau terlalu banyak peralihan pada CPU.
    • Waktu CPU yang dihabiskan (waktu tidak dalam kondisi idle).

Contoh pemeriksaan dengan rootkit Diamorphine

Bagian ini menunjukkan pemeriksaan VM yang telah menginstal rootkit Diamorphine. Diamorphine adalah modul kernel yang dapat dimuat (LKM) yang populer. Rootkit ini memicu kategori temuan berikut:

  • Defense Evasion: Unexpected system call handler
  • Defense Evasion: Unexpected kernel modules
  • Defense Evasion: Unexpected kernel read-only data modification

Untuk mengetahui informasi selengkapnya tentang kategori temuan ini, lihat Temuan ancaman rootkit mode kernel.

Langkah-langkah pemeriksaan yang dilakukan dan gejala yang diamati pada VM adalah sebagai berikut:

  1. Telusuri syslog untuk semua modul kernel di luar pohon yang dimuat.

    1. Menelusuri buffer log kernel:

      sudo dmesg | grep out-of-tree
      

      Output:

      diamorphine: loading out-of-tree module taints kernel.
      
    2. Menelusuri pesan syslog:

      grep "out-of-tree" /var/log/syslog*
      

      Output:

      /var/log/syslog: diamorphine: loading out-of-tree module taints kernel.
      
  2. Cari syslog jika ada kegagalan verifikasi modul (tidak tersedia di semua distribusi Linux).

    1. Menelusuri buffer log kernel:

      sudo dmesg | grep "module verification failed"
      

      Output:

      diamorphine: module verification failed: signature and/or required key missing - tainting kernel
      
    2. Menelusuri pesan syslog:

      sudo grep "module verification failed" /var/log/syslog*
      

      Output:

      /var/log/syslog: diamorphine: module verification failed: signature and/or required key missing - tainting kernel
      
  3. Konfirmasi bahwa modul disembunyikan dari perintah /proc/modules dan lsmod.

    sudo grep diamorphine /proc/modules
    sudo lsmod | grep diamorphine
    

    Tidak ada hasil yang ditampilkan.

  4. Pastikan modul memiliki entri di sysfs.

    sudo cat /sys/module/diamorphine/coresize
    

    Output:

    16384
    
  5. Dapatkan tabel panggilan sistem untuk arsitektur:

    sudo ausyscall --dump
    

    Output:

    Using x86_64 syscall table:
    0       read
    1       write
    2       open
    3       close
    

    Audit anomali dalam panggilan sistem—seperti kill dan getdents—yang biasanya dirusak oleh rootkit.

  6. Untuk memeriksa apakah ada gangguan pada pengendali panggilan sistem, audit panggilan sistem dan periksa apakah ada perilaku anomali. Perilaku ini bervariasi untuk setiap panggilan sistem.

    Panggilan sistem yang biasanya diretas adalah panggilan kill. Anda dapat memeriksa apakah panggilan sistem kill telah dilewati. Pada contoh berikut, panggilan sistem kill diaudit.

    1. Instal auditd dan amati perilaku VM tanpa rootkit Diamorphine:

      $ sudo apt-get update && sudo apt-get install auditd
      $ # Add audit rules for specific system calls
      $ sudo echo "-a exit,always -F arch=b64 -S kill -k audit_kill" >> /etc/audit/rules.d/audit.rules
      $  sudo /etc/init.d/auditd restart
      Restarting auditd (via systemctl): auditd.service.
      
      $ # Behavior observed without rootkit
      $ sleep 600 &
      [1] 1119
      $ sudo kill -9 1119
      $ sudo ausearch -k audit_kill | grep -A 3 "pid=1119"
      type=OBJ_PID msg=audit(1677517839.523:198): opid=1119 oauid=1001 ouid=0 oses=1 obj=unconfined ocomm="sleep"
      type=SYSCALL msg=audit(1677517839.523:198): arch=c000003e syscall=62 success=yes exit=0 a0=45f a1=9 a2=0 a3=7f61c64b2ac0 items=0 ppid=1034 pid=1035 auid=1001 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0
      tty=pts0 ses=1 comm="bash" exe="/usr/bin/bash" subj=unconfined key="audit_kill"
      $ sleep 600 &
      [1] 1087
      $ sudo kill -31 1087
      $ sudo ausearch -k audit_kill | grep -A 3 "pid=1087"
      type=OBJ_PID msg=audit(1677517760.844:168): opid=1087 oauid=1001 ouid=0 oses=1 obj=unconfined ocomm="sleep"
      type=SYSCALL msg=audit(1677517760.844:168): arch=c000003e syscall=62 success=yes exit=0 a0=43f a1=1f a2=0 a3=7f61c64b2ac0 items=0 ppid=1034 pid=1035 auid=1001 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0        ses=1 comm="bash" exe="/usr/bin/bash" subj=unconfined key="audit_kill"
      

      Pada titik pemeriksaan ini, rootkit Diamorphine telah diinstal. Langkah berikutnya menunjukkan perilaku VM setelah penginstalan rootkit.

    2. Konfirmasi bahwa entri log audit untuk sinyal kini tidak ada setelah rootkit Diamorphine diinstal:

      $ sudo ausearch -k audit_kill | grep -A 3 "pid=1158"
      $ sleep 600 &
      [2] 1167
      
    3. Periksa detail di entri log audit untuk sinyal. Dalam contoh ini, meskipun sinyal khusus ini tidak sepenuhnya dibajak oleh rootkit, informasi tentang proses pemanggil tersedia.

      $ sudo kill -9 1167
      $ sudo ausearch -k audit_kill | grep -A 3 "pid=1167"
      type=OBJ_PID msg=audit(1677518008.586:237): opid=1167 oauid=1001 ouid=0 oses=1 obj=unconfined ocomm="sleep"
      type=SYSCALL msg=audit(1677518008.586:237): arch=c000003e syscall=62 success=yes exit=0 a0=48f a1=9 a2=0 a3=7f61c64b2ac0 items=0 ppid=1034 pid=1035 auid=1001 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0
      tty=pts0 ses=1 comm="bash" exe="/usr/bin/bash" subj=unconfined key="audit_kill"
      

Men-debug skrip pengumpulan data

Skrip berikut melakukan banyak tugas penelusuran bug yang dijelaskan di halaman ini. Anda dapat menjalankan skrip ini dalam mode sudo atau root. Skrip hanya membaca informasi debug dari sistem.

$ cat kprot.sh
#!/bin/bash

echo "Boot command line"
cat /proc/cmdline
echo "=================================================="
echo "Loaded modules"
cat /proc/modules
echo "=================================================="
echo "Current tracer"
cat /sys/kernel/debug/tracing/current_tracer
echo "=================================================="
echo "Tracing event enable"
cat /sys/kernel/debug/tracing/events/enable
echo "=================================================="
echo "Tracing sub events enable"
for en in `find /sys/kernel/debug/tracing/events/*/enable`; do printf "\b$en\n"; cat $en; done
echo "=================================================="
echo "IP table rules"
iptables -L
echo "=================================================="
echo "Ftrace list"
cat /sys/kernel/debug/tracing/enabled_functions
echo "=================================================="
echo "Kprobes enabled"
cat /sys/kernel/debug/kprobes/enabled
echo "=================================================="
echo "Kprobes list"
cat /sys/kernel/debug/kprobes/list
echo "=================================================="
echo "Kprobes blocklist"
cat /sys/kernel/debug/kprobes/blacklist
echo "=================================================="
echo "BPF trace"
sudo apt update && sudo apt-get update && sudo apt-get install bpftrace
bpftrace -l
echo "=================================================="
echo "BPF prog list"
sudo apt update && sudo apt install linux-tools-`uname -r`
bpftool prog
echo "=================================================="

Langkah berikutnya