435. 지속성·재침투 — 커널 모듈·루트킷 지속성 탐지

changseop lee·6일 전

시스템 보안 · 취약점

목록 보기
435/450

시스템 보안 · 취약점 › I. 지속성 · 재침투 징후 · 35/50편 (전체 435/450)
학습 단계: 백도어·재침투 경로 탐지
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.

선행 학습

1. 개념

커널 모듈 루트킷은 커널 안에서 동작하기 때문에 사용자 공간 도구로는 보이지 않게 숨을 수 있습니다(T1547.006). 지속성을 위해서는 재부팅 후에도 다시 로드되어야 하므로, 자동 로드 설정이 반드시 어딘가에 남습니다.

커널 모듈 지속성 구조
 모듈 파일 : /lib/modules/$(uname -r)/kernel/.../x.ko  (또는 임의 경로)
 자동 로드 : /etc/modules-load.d/*.conf
             /etc/modprobe.d/*.conf (install 지시어로 명령 실행)
             /etc/modules (Ubuntu), rc.local·systemd 유닛의 insmod
 로드 흔적 : init_module/finit_module 감사, dmesg, taint 값
   ↓
 모듈이 숨어도 "자동 로드 설정"과 "로드 순간"은 남는다

핵심: 숨은 모듈을 찾기보다 로드 경로와 로드 시점을 잡는다

H영역 24편이 모듈의 은닉을 다뤘다면, 이번 편은 재부팅 후 다시 로드되는 지속성 경로를 찾는 데 집중합니다.

2. 왜 중요한가

  • 커널 루트킷은 모든 사용자 공간 점검 결과를 조작할 수 있습니다.
  • 자동 로드 설정은 여러 위치에 둘 수 있어 전수 점검이 필요합니다.
  • 서명되지 않은 모듈 로드는 커널 taint 값으로 흔적이 남습니다.

3. 핵심 명령어 / 설정

확인명령포인트
자동 로드cat /etc/modules-load.d/*.conf미승인 모듈명
modprobegrep -r '^install' /etc/modprobe.d/명령 실행 지시어
taintcat /proc/sys/kernel/tainted0 아님(O·E 비트)
로드 감사ausearch -k module_load -iexe·모듈명
모듈 정보modinfo <mod>서명·경로

4. 실습 (실습 예시)

# 커널 모듈 지속성 점검 (분석 방법)
grep -vhE '^(#|$)' /etc/modules-load.d/*.conf /etc/modules 2>/dev/null
grep -rnE '^\s*install ' /etc/modprobe.d/ 2>/dev/null
cat /proc/sys/kernel/tainted
sudo dmesg | grep -iE 'taint|module verification failed|loading out-of-tree' | tail
sudo ausearch -k module_load -i 2>/dev/null | grep -E 'exe=|name=|auid=' | tail
# lsmod 목록과 /sys/module 비교(불일치 시 은닉 가능성)
diff <(lsmod | awk 'NR>1{print $1}' | sort) <(ls /sys/module | sort) | grep '^>' | head

5. 정상 상태

modules-load.d: 패키지 기본(br_netfilter 등, 티켓 기록)
modprobe install 지시어: 없음
tainted: 0

자동 로드 목록이 승인된 모듈뿐이고, install 지시어가 없으며, taint 값이 0인 상태가 정상입니다.

6. 이상 상태

/etc/modules-load.d/net-acc.conf : nf_acc
tainted: 12288   (O: out-of-tree, E: unsigned)
dmesg: nf_acc: module verification failed: signature and/or required key missing
finit_module: auid=webadmin exe=/usr/sbin/insmod name=/var/lib/.m/nf_acc.ko
  • 미승인 자동 로드 설정 + 숨김 경로 모듈 → 커널 모듈 지속성
  • 서명 없는 out-of-tree 모듈로 taint 발생 → 비인가 모듈 로드
  • 침해 의심 계정이 insmod 수행 → 루트킷 설치 의심(정탐)

7. 로그 분석 (분석 방법)

커널 모듈 지속성 분석 흐름입니다(가상의 예시).

[로드 순간] init_module/finit_module 감사 · dmesg 서명 오류
   ↓
[자동 로드 경로] modules-load.d · modprobe.d install · 유닛·rc.local
   ↓
[모듈 확인] 파일 경로·해시·modinfo (호스트 도구 불신 시 오프라인)
   ↓
[판단] 은닉 가능성 → 디스크·메모리 이미지 확보 → 재설치 검토
taint 비트의미
O (4096)out-of-tree 모듈
E (8192)서명 없는 모듈
값 유지재부팅 전까지 남음

taint 값은 모듈을 내려도 재부팅 전까지 남으므로, 은닉된 모듈이 lsmod에서 사라졌더라도 "언젠가 비서명 모듈이 로드됐다"는 사실을 알려 줍니다.

8. SOC 관제 포인트

  • 모듈 로드 시스템 콜 감사를 기본 감사 정책에 포함합니다.
  • taint 값을 정기 수집해 0이 아닌 호스트를 경보합니다.
  • 커널 루트킷 의심 시 호스트 내 정리보다 재설치를 우선 검토합니다.

9. 탐지 규칙

<!-- 실습 예시 룰: 적용 전 wazuh-logtest 및 테스트 환경 검증 필요 -->
<group name="local,syssec_i,persistence,">
  <rule id="108340" level="15">
    <if_sid>108000</if_sid>
    <field name="audit.key">module_load</field>
    <field name="audit.syscall" type="pcre2">^(init_module|finit_module|175|313)$</field>
    <description>커널 모듈 로드(커널 모듈 지속성·루트킷 의심)</description>
    <mitre><id>T1547.006</id></mitre>
  </rule>
</group>

-S init_module -S finit_module -k module_load 감사를 걸고 로드 자체를 높은 레벨로 경보합니다. 정상 모듈 로드가 잦은 환경에서는 승인 모듈 목록을 CDB 리스트로 제외합니다.

10. 대응 방법

  1. 초기 확인 — 로드된 모듈·자동 로드 설정·로드 주체를 확인합니다.
  2. 범위 확인 — 같은 주체의 다른 지속성과 은닉 동작 여부를 확인합니다.
  3. 증거 확보 — 모듈 파일·메모리·디스크 이미지를 확보합니다.
  4. 차단/조치 — 자동 로드 설정을 제거하고, 은닉이 의심되면 시스템 재설치를 진행합니다.
  5. 재발 방지 — 모듈 로드 감사·taint 수집·모듈 서명 강제(Secure Boot·lockdown)를 검토합니다.

11. 핵심 정리

확인근거
로드 순간finit_module 감사
자동 로드modules-load.d·modprobe.d
흔적taint O·E 비트
판단은닉 시 재설치
면접 포인트"숨은 모듈은 못 찾아도 로드 순간과 자동 로드 설정은 남는다"

12. 다음 편 예고

다음 편 436. 지속성·재침투 — 시스템 바이너리 교체(트로이목마화) 탐지 에서는 sshd·passwd·ps 같은 시스템 바이너리를 백도어가 포함된 변조본으로 바꾸는 지속성을 패키지 검증·해시·감사 로그로 탐지하는 방법을 다룹니다.


이전 편: 434. 지속성·재침투 — 신뢰 관계 악용 재침투 탐지
📚 시리즈 전체 보기: 시스템 보안 · 취약점

profile
코드에 숨겨진 위협을 읽고 AI로 보안의 미래를 설계합니다. 프론트엔드 개발 경험을 자산 삼아 더 견고하고 지능적인 보안 운영 시스템을 구축해 나가는 과정을 기록합니다

0개의 댓글