本頁說明如何執行工作,確認 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 Detection 和 Container Threat Detection 的現有功能。
如要瞭解 VM 威脅偵測,請參閱虛擬機器威脅偵測簡介。如要瞭解如何查看 VM 威脅偵測結果的詳細資料,請參閱「在Google Cloud 控制台中查看結果」。
事前準備
如要取得必要權限,以便在 Security Command Center 中查看所有資源和發現項目,並管理受影響的 Compute Engine 執行個體,請要求管理員授予下列 IAM 角色:
-
安全中心管理員檢視者 (
roles/securitycenter.adminViewer
) 機構 -
Compute 執行個體管理員 (v1) (
roles/compute.instanceAdmin.v1
) Compute Engine 執行個體
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
找出受影響的 VM
- 查看發現項目的詳細資料。
- 在「受影響的資源」部分,按一下「資源完整名稱」欄位中的連結。受影響的 Compute Engine 執行個體詳細資料檢視畫面會在新分頁中開啟。
- 連線至執行個體。詳情請參閱 Compute Engine 說明文件中的「連線至 Linux VM」。
找出非預期的核心模組
如果 VM 中出現非預期的模組,可能表示 VM 的核心記憶體遭到入侵。
如要找出非預期的核心模組,請按照下列步驟操作:
列出 VM 中載入的所有核心模組:
lsmod cat /proc/modules
列出已載入和卸載模組的
sysfs
項目:ls -l /sys/module/
將這些清單的結果與專案中其他 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 威脅偵測,並觸發誤判結果。
如要檢查是否已啟用即時修補,請按照下列步驟操作:
檢查
syslog
,瞭解即時修補程式模組安裝和記錄情形。即時修補通常會安裝核心ftrace
點,藉此修改核心程式碼。sudo grep livepatch /var/log/syslog*
搜尋為即時修補安裝的新核心模組 (通常會加上
livepatch
前置字元):sudo lsmod | grep livepatch
搜尋修補程式檔案:
sudo ls -l /sys/kernel/livepatch
如要瞭解即時修補,請參閱 Linux 核心說明文件中的「Livepatch」。
檢查 VM 中偵測到的其他疑似惡意活動
- 在 Security Command Center 中,查看您正在調查的 VM 威脅偵測發現項目詳細資料。
- 在「受影響的資源」部分,按一下「資源全名」欄位中的下拉式箭頭,然後按一下「顯示使用這個完整資源名稱的所有發現項目」。系統會更新查詢結果,只顯示這個 VM 的發現項目。
- 檢查是否有發現潛在的加密貨幣挖礦活動、惡意軟體、異常 IAM 授權和其他安全威脅。
檢查防毒軟體是否造成誤判
防毒軟體可能會干擾 VM 威脅偵測,並觸發誤判結果。
檢查系統上所有正在執行的程序
如果出現非預期的程序,可能表示 VM 威脅偵測結果有效,且 VM 已遭入侵。
列出在 VM 上執行的所有程序:
ps -eAf
找出您通常不會在這個 VM 上執行的偵錯工具程序,例如
gdb
、strace
和pstack
。偵錯工具程序可以監控其他程序。在 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 的執行程序,藉此瞭解排程器佇列的行為,找出異常行為。
顯示每個執行中程序在每個 CPU 上所花費的時間量詳細資料。 這有助於瞭解特定 CPU 是否非常忙碌。您可以將結果與 CPU 中從
/proc/interrupts
釘選的中斷建立關聯。cat /proc/schedstat
如要進一步瞭解這個指令,請參閱 Linux 核心說明文件中的「排程器統計資料」。
列出所有目前可執行的工作,以及每個 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 /
請找出以下項目:
- 正在執行的程序名稱。
- 每個 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 症狀如下:
搜尋
syslog
,找出所有已載入的樹外核心模組。搜尋核心記錄緩衝區:
sudo dmesg | grep out-of-tree
輸出:
diamorphine: loading out-of-tree module taints kernel.
搜尋
syslog
訊息:grep "out-of-tree" /var/log/syslog*
輸出:
/var/log/syslog: diamorphine: loading out-of-tree module taints kernel.
搜尋
syslog
任何模組驗證失敗 (不適用於所有 Linux 發行版本)。搜尋核心記錄緩衝區:
sudo dmesg | grep "module verification failed"
輸出:
diamorphine: module verification failed: signature and/or required key missing - tainting kernel
搜尋
syslog
訊息:sudo grep "module verification failed" /var/log/syslog*
輸出:
/var/log/syslog: diamorphine: module verification failed: signature and/or required key missing - tainting kernel
確認模組已從
/proc/modules
和lsmod
指令中隱藏。sudo grep diamorphine /proc/modules sudo lsmod | grep diamorphine
未顯示任何結果。
確認模組在
sysfs
中有項目。sudo cat /sys/module/diamorphine/coresize
輸出:
16384
取得架構的系統呼叫表:
sudo ausyscall --dump
輸出:
Using x86_64 syscall table: 0 read 1 write 2 open 3 close
稽核系統呼叫 (例如
kill
和getdents
) 的異常狀況,這些呼叫通常會遭到 Rootkit 竄改。如要檢查系統呼叫處理常式是否遭到竄改,請稽核系統呼叫並檢查異常行為。這些行為會因每個系統呼叫而異。
通常遭到入侵的系統呼叫是
kill
呼叫。您可以檢查kill
系統呼叫是否遭到略過。在以下範例中,系統稽核了kill
系統呼叫。安裝
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 行為。
確認安裝 Diamorphine Rootkit 後,信號的稽核記錄項目已不存在:
$ sudo ausearch -k audit_kill | grep -A 3 "pid=1158" $ sleep 600 & [2] 1167
在信號的稽核記錄項目中查看詳細資料。在這個範例中,雖然這個特定信號並未完全遭到 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"
偵錯資料收集指令碼
下列指令碼會執行本頁面所述的許多偵錯工作。您可以在 sudo
或 root
模式下執行這項指令碼。指令碼只會從系統讀取偵錯資訊。
$ 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 "=================================================="