VM에서 커널 메모리 조작 징후 검사

이 페이지에서는 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 DetectionContainer Threat Detection의 기존 기능을 보완하도록 설계되었습니다.

VM Threat Detection에 대한 자세한 내용은 Virtual Machine Threat Detection 개요를 참조하세요. VM Threat Detection 발견 항목의 세부정보를 보는 방법을 알아보려면 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 Threat Detection 감지를 방해할 수 있으며 거짓양성 발견 항목을 트리거할 수 있습니다.

라이브 패치를 확인하려면 다음 단계를 따르세요.

  1. syslog에서 라이브 패치 모듈 설치 및 로깅을 확인합니다. 라이브 패치는 일반적으로 커널 ftrace 포인트를 설치하여 커널 코드를 수정합니다.

    sudo grep livepatch /var/log/syslog*
    
  2. 라이브 패치용으로 설치된 새 커널 모듈을 검색합니다(일반적으로 livepatch 프리픽스가 추가됨).

    sudo lsmod | grep livepatch
    
  3. 패치 파일을 검색합니다.

    sudo ls -l /sys/kernel/livepatch
    

라이브 패치에 관한 자세한 내용은 Linux 커널 문서의 라이브 패치를 참조하세요.

VM에서 감지된 기타 잠재적 악성 활동 확인

  1. Security Command Center에서 조사 중인 VM Threat Detection 발견 항목의 세부정보를 확인합니다.
  2. 영향을 받는 리소스 섹션의 리소스 전체 이름 필드에서 드롭다운 화살표를 클릭한 다음 이 리소스 전체 이름이 있는 모든 발견 항목 표시를 클릭합니다. 이 VM에 대한 발견 항목만 표시되도록 발견 항목 쿼리가 업데이트됩니다.
  3. 잠재적인 암호화폐 채굴 활동, 멀웨어, 비정상적인 IAM 권한 부여, 기타 보안 위협을 나타내는 발견 항목을 확인합니다.

바이러스 백신 소프트웨어로 인해 거짓양성 발견 항목이 발생하는지 확인

바이러스 백신 소프트웨어는 VM Threat Detection 감지를 방해하고 거짓양성 발견 항목을 트리거할 수 있습니다.

시스템에서 실행 중인 모든 프로세스 확인

예기치 않은 프로세스 발생 시 VM Threat Detection 발견 항목이 유효하고 VM이 손상되었음을 나타낼 수 있습니다.

  1. VM에서 실행 중인 모든 프로세스를 나열합니다.

    ps -eAf
    
  2. 이 VM에서 일반적으로 실행하지 않는 디버거 프로세스(예: gdb, strace, pstack)를 찾습니다. 디버거 프로세스는 다른 프로세스를 스누핑할 수 있습니다.

  3. 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당 실행 중인 프로세스를 사용하여 스케줄러 큐 동작을 평가하여 비정상 동작을 찾을 수 있습니다.

  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 루트킷을 사용한 검사 예시

이 섹션에서는 Diamorphine 루트킷이 설치된 VM 검사를 설명합니다. Diamorphine은 널리 사용되는 로드 가능한 커널 모듈(LKM)입니다. 이 루트킷은 다음 발견 항목 카테고리를 트리거합니다.

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

이러한 발견 항목 카테고리에 대한 자세한 내용은 커널 모드 루트킷 위협 발견 항목을 참조하세요.

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)의 이상을 감사합니다.

  6. 시스템 호출 핸들러 조작을 확인하려면 시스템 호출을 감사하고 비정상적인 동작이 있는지 확인하세요. 이러한 동작은 시스템 호출마다 다릅니다.

    일반적으로 해킹되는 시스템 호출은 kill 호출입니다. kill 시스템 호출이 우회되었는지 확인할 수 있습니다. 다음 예시에서는 kill 시스템 호출이 감사되었습니다.

    1. 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의 동작을 보여줍니다.

    2. Diamorphine 루트킷이 설치된 후 신호에 대한 감사 로그 항목이 이제 없는지 확인합니다.

      $ sudo ausearch -k audit_kill | grep -A 3 "pid=1158"
      $ sleep 600 &
      [2] 1167
      
    3. 신호에 대한 감사 로그 항목에서 세부정보를 확인합니다. 이 예에서는 이 특정 신호가 루트킷에 의해 완전히 하이재킹되지는 않았지만 호출자 프로세스에 관한 정보를 사용할 수 있습니다.

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

다음 단계