시스템 보안 · 취약점 › I. 지속성 · 재침투 징후 · 35/50편 (전체 435/450)
학습 단계: 백도어·재침투 경로 탐지
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
커널 모듈 루트킷은 커널 안에서 동작하기 때문에 사용자 공간 도구로는 보이지 않게 숨을 수 있습니다(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편이 모듈의 은닉을 다뤘다면, 이번 편은 재부팅 후 다시 로드되는 지속성 경로를 찾는 데 집중합니다.
| 확인 | 명령 | 포인트 |
|---|---|---|
| 자동 로드 | cat /etc/modules-load.d/*.conf | 미승인 모듈명 |
| modprobe | grep -r '^install' /etc/modprobe.d/ | 명령 실행 지시어 |
| taint | cat /proc/sys/kernel/tainted | 0 아님(O·E 비트) |
| 로드 감사 | ausearch -k module_load -i | exe·모듈명 |
| 모듈 정보 | modinfo <mod> | 서명·경로 |
# 커널 모듈 지속성 점검 (분석 방법)
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
modules-load.d: 패키지 기본(br_netfilter 등, 티켓 기록)
modprobe install 지시어: 없음
tainted: 0
자동 로드 목록이 승인된 모듈뿐이고, install 지시어가 없으며, taint 값이 0인 상태가 정상입니다.
/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
커널 모듈 지속성 분석 흐름입니다(가상의 예시).
[로드 순간] init_module/finit_module 감사 · dmesg 서명 오류
↓
[자동 로드 경로] modules-load.d · modprobe.d install · 유닛·rc.local
↓
[모듈 확인] 파일 경로·해시·modinfo (호스트 도구 불신 시 오프라인)
↓
[판단] 은닉 가능성 → 디스크·메모리 이미지 확보 → 재설치 검토
| taint 비트 | 의미 |
|---|---|
| O (4096) | out-of-tree 모듈 |
| E (8192) | 서명 없는 모듈 |
| 값 유지 | 재부팅 전까지 남음 |
taint 값은 모듈을 내려도 재부팅 전까지 남으므로, 은닉된 모듈이 lsmod에서 사라졌더라도 "언젠가 비서명 모듈이 로드됐다"는 사실을 알려 줍니다.
<!-- 실습 예시 룰: 적용 전 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 리스트로 제외합니다.
| 확인 | 근거 |
|---|---|
| 로드 순간 | finit_module 감사 |
| 자동 로드 | modules-load.d·modprobe.d |
| 흔적 | taint O·E 비트 |
| 판단 | 은닉 시 재설치 |
| 면접 포인트 | "숨은 모듈은 못 찾아도 로드 순간과 자동 로드 설정은 남는다" |
다음 편 436. 지속성·재침투 — 시스템 바이너리 교체(트로이목마화) 탐지 에서는 sshd·passwd·ps 같은 시스템 바이너리를 백도어가 포함된 변조본으로 바꾸는 지속성을 패키지 검증·해시·감사 로그로 탐지하는 방법을 다룹니다.
이전 편: 434. 지속성·재침투 — 신뢰 관계 악용 재침투 탐지
📚 시리즈 전체 보기: 시스템 보안 · 취약점