이 페이지에서는 Virtual Machine Threat Detection에서 커널 모드 루트킷 발견 항목의 유효성을 확인하기 위해 수행할 수 있는 작업을 설명합니다. 커널 모드 루트킷 발견 사항은 VM의 커널 메모리가 멀웨어에 의해 조작되었을 가능성이 있음을 나타냅니다.
VM Threat Detection에서 커널 모드 루트킷 발견 항목을 수신하는 경우 영향을 받는 Compute Engine 인스턴스에서 다음 Linux 명령어를 실행하여 시스템에서 도용된 시스템 호출 또는 숨겨진 커널 모듈과 같이 이상치를 나타낼 수 있는 데이터 포인트를 조사하는 것이 좋습니다.
또는 영향을 받는 VM에서 제공된 데이터 수집 스크립트를 실행할 수 있습니다. 스크립트는 이 페이지에 설명된 명령어를 실행합니다.
달리 명시되지 않는 한 이 페이지의 각 검사 작업은 모든 커널 모드 루트킷 발견 항목과 관련이 있습니다.
이 문서에서는 다음을 가정합니다.
VM Threat Detection에서 커널 모드 루트킷 발견 항목을 받은 후 이 문서의 태스크를 실행하고 있습니다. 관련 발견 항목 카테고리 목록은 커널 모드 루트킷 위협 발견 항목을 참조하세요.
Linux 명령줄 도구 및 Linux 커널에 대한 이해가 있습니다.
VM Threat Detection 정보
VM Threat Detection은 Security Command Center의 기본 제공 서비스로, 엔터프라이즈 및 프리미엄 등급에서 사용할 수 있습니다. 이 서비스는 가상 머신을 스캔하여 암호화폐 채굴 소프트웨어, 커널 모드 루트킷, 손상된 클라우드 환경에서 실행되는 멀웨어 등 잠재적으로 악의적인 애플리케이션을 탐지합니다.
VM Threat Detection은 Security Command Center 위협 감지 제품군의 일부이며 Event Threat Detection 및 Container Threat Detection의 기존 기능을 보완하도록 설계되었습니다.
VM Threat Detection에 대한 자세한 내용은 Virtual Machine Threat Detection 개요를 참조하세요. VM Threat Detection 발견 항목의 세부정보를 보는 방법을 알아보려면 Google Cloud 콘솔에서 발견 항목 검토를 참조하세요.
시작하기 전에
Security Command Center에서 모든 리소스와 결과를 보고 영향을 받는 Compute Engine 인스턴스를 관리하는 데 필요한 권한을 얻으려면 관리자에게 다음 IAM 역할을 부여해 달라고 요청하세요.
-
조직의 보안 센터 관리자 뷰어(
roles/securitycenter.adminViewer
) -
Compute Engine 인스턴스의 Compute 인스턴스 관리자(v1)(
roles/compute.instanceAdmin.v1
)
역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.
커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.
영향을 받는 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 Threat Detection 감지를 방해할 수 있으며 거짓양성 발견 항목을 트리거할 수 있습니다.
라이브 패치를 확인하려면 다음 단계를 따르세요.
syslog
에서 라이브 패치 모듈 설치 및 로깅을 확인합니다. 라이브 패치는 일반적으로 커널ftrace
포인트를 설치하여 커널 코드를 수정합니다.sudo grep livepatch /var/log/syslog*
라이브 패치용으로 설치된 새 커널 모듈을 검색합니다(일반적으로
livepatch
프리픽스가 추가됨).sudo lsmod | grep livepatch
패치 파일을 검색합니다.
sudo ls -l /sys/kernel/livepatch
라이브 패치에 관한 자세한 내용은 Linux 커널 문서의 라이브 패치를 참조하세요.
VM에서 감지된 기타 잠재적 악성 활동 확인
- Security Command Center에서 조사 중인 VM Threat Detection 발견 항목의 세부정보를 확인합니다.
- 영향을 받는 리소스 섹션의 리소스 전체 이름 필드에서 드롭다운 화살표를 클릭한 다음 이 리소스 전체 이름이 있는 모든 발견 항목 표시를 클릭합니다. 이 VM에 대한 발견 항목만 표시되도록 발견 항목 쿼리가 업데이트됩니다.
- 잠재적인 암호화폐 채굴 활동, 멀웨어, 비정상적인 IAM 권한 부여, 기타 보안 위협을 나타내는 발견 항목을 확인합니다.
바이러스 백신 소프트웨어로 인해 거짓양성 발견 항목이 발생하는지 확인
바이러스 백신 소프트웨어는 VM Threat Detection 감지를 방해하고 거짓양성 발견 항목을 트리거할 수 있습니다.
시스템에서 실행 중인 모든 프로세스 확인
예기치 않은 프로세스 발생 시 VM Threat Detection 발견 항목이 유효하고 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 루트킷을 사용한 검사 예시를 참조하세요.
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 루트킷을 사용한 검사 예시
이 섹션에서는 Diamorphine 루트킷이 설치된 VM 검사를 설명합니다. Diamorphine은 널리 사용되는 로드 가능한 커널 모듈(LKM)입니다. 이 루트킷은 다음 발견 항목 카테고리를 트리거합니다.
Defense Evasion: Unexpected system call handler
Defense Evasion: Unexpected kernel modules
Defense Evasion: Unexpected kernel read-only data modification
이러한 발견 항목 카테고리에 대한 자세한 내용은 커널 모드 루트킷 위협 발견 항목을 참조하세요.
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
)의 이상을 감사합니다.시스템 호출 핸들러 조작을 확인하려면 시스템 호출을 감사하고 비정상적인 동작이 있는지 확인하세요. 이러한 동작은 시스템 호출마다 다릅니다.
일반적으로 해킹되는 시스템 호출은
kill
호출입니다.kill
시스템 호출이 우회되었는지 확인할 수 있습니다. 다음 예시에서는kill
시스템 호출이 감사되었습니다.auditd
를 설치하고 Diamorphine 루트킷 없이 VM의 동작을 관찰합니다.$ 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 루트킷이 설치되었습니다. 다음 단계에서는 루트킷 설치 후 VM의 동작을 보여줍니다.
Diamorphine 루트킷이 설치된 후 신호에 대한 감사 로그 항목이 이제 없는지 확인합니다.
$ sudo ausearch -k audit_kill | grep -A 3 "pid=1158" $ sleep 600 & [2] 1167
신호에 대한 감사 로그 항목에서 세부정보를 확인합니다. 이 예에서는 이 특정 신호가 루트킷에 의해 완전히 하이재킹되지는 않았지만 호출자 프로세스에 관한 정보를 사용할 수 있습니다.
$ 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 "=================================================="