檢查 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 的內建服務,適用於 Enterprise 和 Premium 方案。這項服務會掃描虛擬機器,偵測潛在的惡意應用程式,例如加密貨幣挖礦軟體、核心模式 Rootkit,以及在遭駭雲端環境中執行的惡意軟體。

VM 威脅偵測是 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 上尋找其他可疑程序。

檢查已啟動的核心

檢查已啟動的核心,找出 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 是否非常忙碌。您可以將結果與 CPU 中從 /proc/interrupts 釘選的中斷建立關聯。

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

後續步驟