本頁說明如何執行工作,確認虛擬機器威脅偵測服務發現的核心模式 Rootkit 發現項目是否有效。核心模式 Rootkit 發現項目表示 VM 的核心記憶體可能遭到惡意軟體竄改。
如果 VM 威脅偵測功能偵測到核心模式 rootkit,建議您在受影響的 Compute Engine 執行個體上執行下列 Linux 指令,探查系統中可能指出異常狀況的資料點,例如遭劫持的系統呼叫或隱藏的核心模組。
或者,您也可以在受影響的 VM 上執行提供的資料收集指令碼。該指令碼會執行本頁面說明的指令。
除非另有說明,否則這個頁面上的每項檢查工作都與所有核心模式的 Rootkit 發現項目相關。
本文假設您已詳讀以下文章:
您是在收到 VM 威脅偵測服務的發現項目 (指出有核心模式 Rootkit) 後,才執行本文中的工作。如需相關發現項目類別的清單,請參閱「核心模式 Rootkit 威脅發現項目」。
您瞭解 Linux 指令列工具和 Linux 核心。
關於 VM 威脅偵測
虛擬機器威脅偵測是 Security Command Center 的內建服務,可掃描虛擬機器,偵測潛在的惡意應用程式,例如加密貨幣挖礦軟體、核心模式 Rootkit,以及在遭入侵的雲端環境中執行的惡意軟體。
VM 威脅偵測是 Security Command Center 威脅偵測套件的一部分,旨在輔助 Event Threat Detection 和 Container Threat Detection 的現有功能。
如要瞭解虛擬機器威脅偵測,請參閱 Virtual Machine Threat Detection 總覽。如要瞭解如何查看虛擬機器威脅偵測發現項目的詳細資料,請參閱在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 上尋找其他可疑程序。
檢查已啟動的 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 的執行程序排程器佇列行為,找出異常行為。
顯示每個執行中程序在每個 CPU 上耗費的時間量詳細資料。這有助於瞭解特定 CPU 是否非常忙碌。您可以將結果與從
/proc/interrupts釘選至 CPU 的中斷建立關聯。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 handlerDefense Evasion: Unexpected kernel modulesDefense 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 根程式碼套件的情況下,會有何種行為:$ 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 "=================================================="