檢查 VM 是否有核心記憶體竄改行為的跡象

本頁說明如何執行工作,確認 Virtual Machine Threat Detection 發現的核心模式 Rootkit 是否有效。核心模式 Rootkit 發現項目指出,惡意軟體可能已竄改 VM 的核心記憶體。

如果 VM 威脅偵測功能偵測到核心模式 Rootkit,建議您在受影響的 Compute Engine 執行個體上執行下列 Linux 指令,探查系統中可能指出異常狀況的資料點,例如遭劫持的系統呼叫或隱藏的核心模組。

或者,您也可以在受影響的 VM 上執行提供的資料收集指令碼。指令碼會執行本頁所述的指令。

除非另有說明,否則這個頁面上的每項檢查工作都與所有核心模式 Rootkit 發現項目相關。

本文假設您符合下列條件:

  • 您是在收到 VM 威脅偵測服務的發現結果 (指出有核心模式 Rootkit) 後,才執行本文中的工作。如需相關發現項目類別的清單,請參閱「核心模式 Rootkit 威脅發現項目」。

  • 您瞭解 Linux 指令列工具和 Linux 核心。

關於 VM 威脅偵測

Virtual Machine Threat Detection 是 Security Command Center 的內建服務。這項服務會掃描虛擬機器,偵測潛在的惡意應用程式,例如加密貨幣挖礦軟體、核心模式 Rootkit,以及在遭入侵的雲端環境中執行的惡意軟體。

VM Threat Detection 是 Security Command Center 威脅偵測套件的一部分,旨在輔助 Event Threat DetectionContainer Threat Detection 的現有功能。

如要瞭解 VM 威脅偵測,請參閱虛擬機器威脅偵測簡介。如要瞭解如何查看 VM 威脅偵測結果的詳細資料,請參閱「在Google Cloud 控制台中查看結果」。

事前準備

如要取得必要權限,以便在 Security Command Center 中查看所有資源和發現項目,並管理受影響的 Compute Engine 執行個體,請要求管理員授予下列 IAM 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

您或許還可透過自訂角色或其他預先定義的角色取得必要權限。

找出受影響的 VM

  1. 查看發現項目的詳細資料
  2. 在「受影響的資源」部分,按一下「資源完整名稱」欄位中的連結。受影響的 Compute Engine 執行個體詳細資料檢視畫面會在新分頁中開啟。
  3. 連線至執行個體。詳情請參閱 Compute Engine 說明文件中的「連線至 Linux VM」。

找出非預期的核心模組

如果 VM 中出現非預期的模組,可能表示 VM 的核心記憶體遭到入侵。

如要找出非預期的核心模組,請按照下列步驟操作:

  1. 列出 VM 中載入的所有核心模組:

    lsmod
    cat /proc/modules
    
  2. 列出已載入和卸載模組的 sysfs 項目:

    ls -l /sys/module/
    
  3. 將這些清單的結果與專案中其他 VM 的清單進行比較。 找出受影響 VM 中有,但其他 VM 沒有的模組。

搜尋 syslog 樹狀結構外的模組

如果 VM 中載入樹外模組,可能表示已載入非典型核心模組。您可以搜尋核心記錄緩衝區和 syslog 訊息,判斷是否已載入樹狀結構外的模組。在記錄項目中,樹外模組會標示為遭汙染的負載。

在核心記錄緩衝區和 syslog 訊息中,搜尋類似下列內容的記錄項目:

MODULE_NAME: loading out-of-tree module taints kernel.
  • 在核心記錄緩衝區中,搜尋指出樹外模組存在的記錄項目:

    sudo dmesg | grep out-of-tree
    
  • 在所有 syslog 訊息中,搜尋指出樹外模組存在的記錄項目:

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

檢查是否已啟用即時修補

VM 中的即時修補功能可能會干擾 VM 威脅偵測,並觸發誤判結果。

如要檢查即時修補功能,請按照下列步驟操作:

  1. 檢查 syslog,瞭解即時修補程式模組安裝和記錄情形。即時修補通常會安裝核心 ftrace 點,藉此修改核心程式碼。

    sudo grep livepatch /var/log/syslog*
    
  2. 搜尋為即時修補安裝的新核心模組 (通常會加上 livepatch 前置字元):

    sudo lsmod | grep livepatch
    
  3. 搜尋修補程式檔案:

    sudo ls -l /sys/kernel/livepatch
    

如要瞭解即時修補,請參閱 Linux 核心說明文件中的「Livepatch」。

檢查 VM 中偵測到的其他疑似惡意活動

  1. 在 Security Command Center 中,查看您正在調查的 VM 威脅偵測發現項目詳細資料
  2. 在「受影響的資源」部分,按一下「資源全名」欄位中的下拉式箭頭,然後按一下「顯示使用這個完整資源名稱的所有發現項目」。系統會更新查詢結果,只顯示這個 VM 的發現項目。
  3. 檢查是否有發現潛在的加密貨幣挖礦活動、惡意軟體、異常 IAM 授權和其他安全威脅。

檢查防毒軟體是否造成誤判

防毒軟體可能會干擾 VM 威脅偵測,並觸發誤判。

檢查系統上所有正在執行的程序

如果出現非預期的程序,可能表示 VM 威脅偵測結果有效,且 VM 已遭入侵。

  1. 列出在 VM 上執行的所有程序:

    ps -eAf
    
  2. 找出您通常不會在這個 VM 上執行的偵錯工具程序,例如 gdbstracepstack。偵錯工具程序可以監控其他程序。

  3. 在 VM 上尋找其他可疑程序。

檢查已啟動的 Kernel

檢查已啟動的核心,找出 Linux 核心:

cat /proc/version

如果傳回的值不是預期的核心版本,可能表示有人利用核心中的 kexec 工具發動劫持攻擊。kexec 工具可軟啟動系統,以使用其他核心。

Unexpected system call handler」的額外工作

如果收到Defense Evasion: Unexpected system call handler發現項目,請執行這項工作。

稽核系統呼叫,並找出使用情況和呼叫者中的異常狀況。稽核記錄會提供系統呼叫的叫用程序和引數相關資訊。您也可以執行驗證工作,檢查常見系統呼叫的預期行為。詳情請參閱本頁的檢查範例:Diamorphine Rootkit

Unexpected interrupt handler」的額外工作

如果收到Defense Evasion: Unexpected interrupt handler發現項目,請執行這項工作。

列出系統上的即時中斷處理常式,並將結果與專案中其他類似 VM 的資訊進行比較。非預期的中斷處理常式可能表示 VM 遭到入侵。

如要列出即時中斷處理常式,請執行下列指令:

cat /proc/interrupts

輸出結果會與下列內容相似:

           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

Unexpected processes in runqueue」的額外工作

如果收到 Defense Evasion: Unexpected processes in runqueue 發現項目,請按照下列步驟操作。本節有助於收集額外的資料點,以調查發現的問題。這些資料點可能無法直接指出惡意軟體問題。

在這項工作中,您會查看每個 CPU 的排程器佇列。雖然部分程序可能只會短暫存在,您還是可以評估每個 CPU 的執行程序,藉此瞭解排程器佇列的行為,找出異常行為。

  1. 顯示每個執行中程序在每個 CPU 上所花費的時間量詳細資料。 這有助於瞭解特定 CPU 是否非常忙碌。您可以將結果與從 /proc/interrupts 釘選至 CPU 的中斷建立關聯。

    cat /proc/schedstat
    

    如要進一步瞭解這個指令,請參閱 Linux 核心說明文件中的「排程器統計資料」。

  2. 列出所有目前可執行的工作,以及每個 CPU 的內容切換詳細資料。

    cat /proc/sched_debug
    

    輸出結果會與下列內容相似:

    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. 請找出以下項目:

    • 正在執行的程序名稱。
    • 每個 CPU 的內容切換次數。查看程序在 CPU 上是否發生過少或過多的切換。
    • 耗費的 CPU 作業時間 (非閒置時間)。

以 Diamorphine Rootkit 進行檢查的範例

本節將示範如何檢查已安裝 Diamorphine Rootkit 的 VM。Diamorphine 是常見的可載入核心模組 (LKM)。這個 Rootkit 會觸發下列發現項目類別:

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

如要進一步瞭解這些發現項目類別,請參閱核心模式 Rootkit 威脅發現項目

檢查步驟和觀察到的 VM 症狀如下:

  1. 搜尋 syslog,找出所有已載入的樹外核心模組。

    1. 搜尋核心記錄緩衝區:

      sudo dmesg | grep out-of-tree
      

      輸出:

      diamorphine: loading out-of-tree module taints kernel.
      
    2. 搜尋 syslog 訊息:

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

      輸出:

      /var/log/syslog: diamorphine: loading out-of-tree module taints kernel.
      
  2. 搜尋 syslog 任何模組驗證失敗的項目 (並非所有 Linux 發行版本都提供這項功能)。

    1. 搜尋核心記錄緩衝區:

      sudo dmesg | grep "module verification failed"
      

      輸出:

      diamorphine: module verification failed: signature and/or required key missing - tainting kernel
      
    2. 搜尋 syslog 訊息:

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

      輸出:

      /var/log/syslog: diamorphine: module verification failed: signature and/or required key missing - tainting kernel
      
  3. 確認模組已從 /proc/moduleslsmod 指令中隱藏。

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

    未顯示任何結果。

  4. 確認模組在 sysfs 中有項目。

    sudo cat /sys/module/diamorphine/coresize
    

    輸出:

    16384
    
  5. 取得架構的系統呼叫表:

    sudo ausyscall --dump
    

    輸出:

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

    稽核系統呼叫 (例如 killgetdents) 的異常狀況,這些呼叫通常會遭到 Rootkit 竄改。

  6. 如要檢查系統呼叫處理常式是否遭到竄改,請稽核系統呼叫並檢查異常行為。這些行為會因每個系統呼叫而異。

    通常遭到入侵的系統呼叫是 kill 呼叫。您可以檢查 kill 系統呼叫是否遭到略過。在以下範例中,系統稽核了 kill 系統呼叫。

    1. 安裝 auditd,並觀察 VM 在沒有 Diamorphine Rootkit 時的行為:

      $ 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"
      

      在檢查的此階段,Diamorphine Rootkit 已安裝。後續步驟會顯示安裝 Rootkit 後的 VM 行為。

    2. 確認安裝 Diamorphine Rootkit 後,信號的稽核記錄項目已不存在:

      $ sudo ausearch -k audit_kill | grep -A 3 "pid=1158"
      $ sleep 600 &
      [2] 1167
      
    3. 在信號的稽核記錄項目中查看詳細資料。在這個範例中,雖然這個特定信號並未完全遭到 Rootkit 劫持,但仍可取得有關呼叫端程序的資訊。

      $ 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"
      

偵錯資料收集指令碼

下列指令碼會執行本頁面所述的許多偵錯工作。您可以在 sudoroot 模式下執行這項指令碼。指令碼只會從系統讀取偵錯資訊。

$ 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 "=================================================="

後續步驟