시스템 보안 · 취약점 › F. 비정상 프로세스 · 지속성 징후 · 20/50편 (전체 270/450)
학습 단계: 지속성(persistence) 메커니즘
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
현대 Linux(systemd 기반)에서 systemd 서비스·타이머는 강력한 지속성 수단입니다. 서비스 유닛은 부팅·재시작 시 실행되고, 타이머는 cron처럼 주기 실행합니다. enabled된 악성 유닛은 영구 거점이 됩니다.
systemd 지속성 메커니즘
서비스 유닛: /etc/systemd/system/*.service
ExecStart=악성 명령, enable → 부팅 시 실행
타이머: *.timer → 주기 실행(cron 대체)
Restart=always → 죽으면 재시작(지속성)
사용자 유닛: ~/.config/systemd/user/ (F22)
공격: 악성 서비스 등록·enable → 부팅·재시작 복구
systemd 지속성은 enable 상태(부팅 자동 시작)와 Restart=always(죽어도 부활)가 핵심입니다. 신규 서비스·타이머 등록을 감시합니다.
| systemd 요소 | 지속 방식 | 위험 |
|---|---|---|
*.service enabled | 부팅 실행 | 높음 |
Restart=always | 죽으면 부활 | 높음 |
*.timer | 주기 실행 | 높음 |
| ExecStart 악성 | 악성 명령 | 높음 |
| 정상 패키지 유닛 | 정상 | 정상 |
# systemd 지속성 탐지 (분석 방법)
# systemd 유닛 변경 이벤트(watch)
sudo ausearch -k persist -i --start recent 2>/dev/null | grep -E 'systemd/system|\.service|\.timer' | tail
# 신규/의심 서비스(기준선 대비 + 의심 ExecStart)
diff /root/baseline/services.txt <(systemctl list-unit-files --state=enabled 2>/dev/null|sort) | grep '^>'
sudo grep -rE 'ExecStart=.*(/tmp/|/dev/shm/|curl|nc |bash -i)' /etc/systemd/system/ 2>/dev/null
$ (systemd 변경) (없음 또는 패키지 설치)
$ (신규 서비스) (없음)
$ (의심 ExecStart) (없음)
systemd 유닛이 패키지·정상 서비스뿐이고, 신규 악성 서비스·의심 ExecStart가 없는 상태가 정상입니다.
$ (신규 서비스) > updater.service
$ (의심 ExecStart)
/etc/systemd/system/updater.service:
ExecStart=/tmp/.x
Restart=always
systemd 지속성 분석입니다(가상의 예시).
[등록] /etc/systemd/system/updater.service 생성 (watch/FIM)
↓
[활성] systemctl enable updater → 부팅 자동 시작
↓
[실행] ExecStart=/tmp/.x (비표준 경로)
↓
[부활] Restart=always → 죽여도 systemd가 재시작
= 부팅 복구 + 죽여도 부활(강력한 지속성)
| 요소 | 해석 |
|---|---|
| 신규 .service | 지속성 등록 |
| enabled | 부팅 실행 |
| ExecStart /tmp | 비표준 실행 |
| Restart=always | 죽여도 부활 |
enable+Restart=always가 강력한 지속성을 만듭니다. 제거 시 disable·stop을 함께 해야 합니다.
<!-- 실습 예시 룰: 적용 전 wazuh-logtest 및 테스트 환경 검증 필요 -->
<group name="local,syssec_f,persistence,">
<rule id="105190" level="13">
<if_sid>105060</if_sid>
<field name="audit.file" type="pcre2">/etc/systemd/system/.*\.(service|timer)$|/lib/systemd/system/</field>
<description>systemd 서비스·타이머 지속성 등록·변경</description>
<mitre><id>T1543.002</id></mitre>
</rule>
</group>
유닛 내용(ExecStart 비표준·Restart=always)은 FIM으로 탐지합니다. 패키지 유닛은 기준선 예외로 둡니다.
| systemd 요소 | 지속 방식 |
|---|---|
| *.service enabled | 부팅 실행 |
| Restart=always | 죽으면 부활 |
| *.timer | 주기 실행 |
| ExecStart 악성 | 악성 명령 |
| 면접 포인트 | "systemd는 현대 지속성 — enable+Restart=always, 제거 시 disable·stop 함께" |
다음 편 271. 프로세스·지속성 — 셸 초기화 파일(.bashrc 등) 지속성 탐지 에서는 셸 초기화 파일 지속성을 다루는 셸 초기화 파일(.bashrc 등) 지속성 탐지를 다룹니다.
이전 편: 269. 프로세스·지속성 — cron 기반 지속성 탐지
📚 시리즈 전체 보기: 시스템 보안 · 취약점