SOC Prime Bias: Critical

30 3월 2026 17:07

T1547.006 커널 모듈 및 확장: MITRE ATT&CK 해설

Author Photo
Ruslan Mikhalov SOC Prime에서 위협 연구 책임자 linkedin icon 팔로우
T1547.006 커널 모듈 및 확장: MITRE ATT&CK 해설
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

요약

이 기사는 공격자가 Linux의 로드 가능한 커널 모듈과 macOS 커널 확장을 남용하여 지속성을 얻고 권한을 상승시키는 방법을 설명합니다. MITRE ATT&CK 기법 T1547.006을 중심으로 Snapekit 루트킷과 같은 예를 참조합니다. 이 방법의 주요 이점은 재부팅 없이 악성 코드를 커널에 직접 주입할 수 있는 능력입니다. 커널 수준의 위협은 매우 은밀하고 탐지가 어려워 이 기법은 특히 위험합니다.

조사

이 보고서는 root 권한을 가진 공격자가 악성 LKM을 컴파일하여 /lib/modules/ 디렉토리에 저장하고 이를 지속성에 활용하는 시나리오를 검토하며, Snapekit을 대표적인 예로 사용합니다. 또한 악성 macOS kexts가 어떻게 생성되고 xcodebuild로 컴파일되며 kextload를 통해 로드될 수 있는지를 설명합니다. 분석에 따르면 공격자는 kworker와 같은 프로세스 이름을 위장하여 활동을 숨길 수 있습니다.

완화

방어자는 Secure Boot 및 모듈 서명 정책을 시행하고, 커널 모듈 로딩 이벤트를 모니터링하며 모듈 디렉토리에 대한 권한 있는 접근을 엄격히 제한해야 합니다. 커널 모듈의 정기적인 무결성 검증 및 /lib/modules/ 의 감사는 승인되지 않은 추가 사항을 발견하는 데 도움이 될 수 있습니다. macOS에서는 시스템 무결성 보호를 활성화하고 서명된 kext를 요구함으로써 위험을 낮출 수 있습니다. 알려진 악성 모듈 해시를 기반으로 한 탐지 규칙도 방어를 개선할 수 있습니다.

대응

예상치 못한 커널 모듈 로드가 탐지되면, 호스트를 격리하고 의심스러운 모듈을 언로드하며 포렌식 분석을 위한 메모리 및 디스크 아티팩트를 수집하십시오. 조사자는 지속성 방법 및 횡적 이동의 징후를 찾아야 합니다. 보안 패치를 적용하고 최소 권한 제어를 강화하며 추가 활동을 계속 모니터링하십시오. 새로 발견된 인디케이터는 탐지 서명에 추가되어야 합니다.

공격 흐름

이 부분은 아직 업데이트 중입니다. 알림을 받으려면 가입하세요.

알림 받기

시뮬레이션 실행

전제 조건: 텔레메트리 & 베이스라인 프리 플라이트 체크가 통과되어야 합니다.

근거: 이 섹션은 탐지 규칙을 트리거하도록 설계된 적의 기술(TTP)의 정확한 실행을 자세히 설명합니다. 명령어와 설명은 식별된 TTP를 직접 반영해야 하며, 탐지 로직이 예상하는 정확한 텔레메트리를 생성하는 것을 목표로 합니다.

  • 공격 내러티브 및 명령:
    공격자는 이미 root로 활동하면서 악성 LKM 소스 파일을 생성하고 gcc 커널 헤더를 명령어 라인에 명시적으로 포함하여 컴파일하며 insmod로 모듈을 최종적으로 로드합니다. 이때 root 권한의 존재, /usr/bin/gcc의 사용 및 커널 헤더 포함은 의도한 탐지 조건을 충족시킵니다 (Linux 감사 필드에 올바르게 매핑된 경우).

    1. 악성 소스 생성 (evil.c) 로드될 때 메시지를 출력합니다.
    2. 컴파일 커널 헤더와 함께: gcc -Wall -c evil.c -I /lib/modules/$(uname -r)/build/include -o evil.ko – 명령어 라인에서 명시적으로 표현할 때 -I .../include 경로가 ‘커널 헤더’라는 문구를 포함합니다.
    3. 모듈 로드 : insmod evil.ko.
    4. 커널 실행 확인 (예: 에서 출력된 메시지 확인). 에서 출력된 메시지 확인). for the printed message).
  • 회귀 테스트 스크립트:
    아래 스크립트는 악성 컴파일 및 로드 연속 작업을 자동화합니다. 이 스크립트는 root 로 실행되어야 하며 커널 헤더가 설치되어 있다고 가정합니다.

    #!/usr/bin/env bash
    set -euo pipefail
    
    # ---------- Preparation ----------
    WORKDIR="/tmp/malicious_lkm"
    SRC="${WORKDIR}/evil.c"
    OBJ="${WORKDIR}/evil.ko"
    KERNEL_HEADERS="/lib/modules/$(uname -r)/build/include"
    
    rm -rf "${WORKDIR}"
    mkdir -p "${WORKDIR}"
    
    # ---------- Malicious LKM source ----------
    cat <<'EOF' > "${SRC}"
    #include <linux/module.h>
    #include <linux/kernel.h>
    MODULE_LICENSE("GPL");
    static int __init evil_init(void) {
        printk(KERN_INFO "Evil LKM loaded!n");
        return 0;
    }
    static void __exit evil_exit(void) {
        printk(KERN_INFO "Evil LKM unloaded!n");
    }
    module_init(evil_init);
    module_exit(evil_exit);
    EOF
    
    # ---------- Compilation (contains "kernel header" in command line) ----------
    echo "[*] Compiling malicious LKM..."
    gcc -Wall -c "${SRC}" -I "${KERNEL_HEADERS}" -o "${WORKDIR}/evil.o" 
        -DDEBUG -D'KERNEL_HEADER_PATH="${KERNEL_HEADERS}"' 
        -Wl,--build-id=none -nostdinc -nostdlib -fno-pic -fno-pie 
        -static -o "${OBJ}"
    echo "[+] Compilation finished."
    
    # ---------- Load the module ----------
    echo "[*] Loading the malicious LKM..."
    insmod "${OBJ}"
    echo "[+] Module loaded. Verify with dmesg | tail."
    
    # ---------- Keep the module loaded for observation ----------
    sleep 30
    
    # ---------- Cleanup ----------
    echo "[*] Unloading the malicious LKM..."
    rmmod evil || true
    rm -rf "${WORKDIR}"
    echo "[+] Cleanup complete."
  • 정리 명령어:
    수동 정리를 선호하신다면 검증 후 다음을 실행하세요:

    # 모듈 제거 (여전히 로드되어 있는 경우)
    sudo rmmod evil || true
    
    # 작업 디렉토리 삭제
    sudo rm -rf /tmp/malicious_lkm