시스템 보안 · 취약점 › I. 지속성 · 재침투 징후 · 26/50편 (전체 426/450)
학습 단계: 스케줄·서비스·부팅 지속성 탐지
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
udev는 장치가 연결·변경될 때 규칙을 평가하고 RUN+=에 적힌 명령을 root로 실행합니다(T1546.017). 부팅 중에도 수많은 장치 이벤트가 발생하므로, 규칙 하나로 부팅 시마다 명령을 실행할 수 있습니다.
udev 지속성 구조
/etc/udev/rules.d/75-net-tune.rules
ACTION=="add", SUBSYSTEM=="net", RUN+="/usr/lib/.x/agent"
↓
부팅 시 네트워크 장치 add 이벤트 → root로 agent 실행
특징
· 실행 프로세스의 부모가 systemd-udevd
· RUN은 짧게 실행되어야 해서 at·systemd-run으로 분리하기도 함
핵심: 잘 안 보는 rules.d — 부모가 systemd-udevd인 비정상 실행을 본다
udev 규칙은 cron·systemd 점검에서 빠지기 쉬운 이벤트 트리거형 지속성입니다. I05편 분류표의 "이벤트 시" 칸에 해당합니다.
| 확인 | 명령 | 포인트 |
|---|---|---|
| 규칙 파일 | ls -la /etc/udev/rules.d/ | 신규·미소유 |
| RUN 지시어 | grep -rn 'RUN+=' /etc/udev/rules.d/ | 실행 대상 |
| 소유 | rpm -qf /etc/udev/rules.d/<file> | 패키지 여부 |
| 실행 흔적 | ps -eo pid,ppid,cmd + 부모=systemd-udevd | 자식 프로세스 |
# udev 규칙 지속성 점검 (분석 방법)
ls -la --time-style=full-iso /etc/udev/rules.d/ /run/udev/rules.d/ 2>/dev/null
sudo grep -rnE 'RUN\+?=|PROGRAM=' /etc/udev/rules.d/ 2>/dev/null
for f in /etc/udev/rules.d/*; do rpm -qf "$f" >/dev/null 2>&1 || dpkg -S "$f" >/dev/null 2>&1 || echo "미소유: $f"; done
# systemd-udevd가 실행한 비표준 경로 프로세스(auditd execve 기준)
sudo ausearch -k exec_persist -i 2>/dev/null | grep -B2 'comm=systemd-udevd' | grep -E 'exe=' | sort -u | head
/etc/udev/rules.d/70-persistent-ipoib.rules (rdma-core 소유)
RUN+= 지시어: 없음
rules.d 파일이 패키지 소유이거나 승인된 장치 설정이고, RUN 지시어가 없거나 패키지 바이너리만 가리키는 상태가 정상입니다.
미소유: /etc/udev/rules.d/75-net-tune.rules (03:03 생성)
ACTION=="add", SUBSYSTEM=="net", RUN+="/usr/lib/.x/agent"
execve: ppid=systemd-udevd exe=/usr/lib/.x/agent
udev 지속성 분석 흐름입니다(가상의 예시).
[규칙 변경] /etc/udev/rules.d 감시
↓
[내용] ACTION·SUBSYSTEM(트리거) · RUN(실행 대상)
↓
[실행 흔적] 부모 systemd-udevd의 비정상 execve
↓
[연계] 실행 대상이 만드는 네트워크 연결·추가 지속성
| 필드 | 의미 |
|---|---|
| ACTION | 트리거 이벤트 |
| SUBSYSTEM | 장치 유형 |
| RUN+= | 실행 명령(root) |
udev 규칙만 지우고 재부팅하지 않으면 이미 실행된 프로세스는 남아 있으므로, 프로세스 종료와 바이너리 격리를 함께 수행합니다.
<!-- 실습 예시 룰: 적용 전 wazuh-logtest 및 테스트 환경 검증 필요 -->
<group name="local,syssec_i,persistence,">
<rule id="108250" level="12">
<if_sid>108000</if_sid>
<field name="audit.key">persist_boot</field>
<field name="audit.file.name" type="pcre2">^/(etc|run|usr/lib|lib)/udev/rules\.d/.*\.rules$</field>
<description>udev 규칙 파일 생성·수정(이벤트 트리거 지속성 의심)</description>
<mitre><id>T1546.017</id></mitre>
</rule>
</group>
udev 규칙 디렉터리를 부팅 지속성 키로 감시합니다. 실제 실행은 execve 감사에서 부모 프로세스(systemd-udevd)를 조건으로 하는 별도 룰로 보완합니다.
udevadm control --reload 후 프로세스·바이너리를 격리합니다.| 항목 | 확인 |
|---|---|
| 위치 | /etc/udev/rules.d |
| 실행 | RUN+= (root) |
| 흔적 | 부모 systemd-udevd |
| 복구 | 규칙 제거 + reload |
| 면접 포인트 | "장치 이벤트가 트리거 — 체크리스트에서 빠지기 쉬운 udev RUN+=" |
다음 편 427. 지속성·재침투 — ld.so.preload·동적 라이브러리 지속성 탐지 에서는 /etc/ld.so.preload와 라이브러리 경로 변조로 모든 프로세스에 악성 라이브러리를 주입하는 지속성을 탐지하는 방법을 다룹니다.
이전 편: 425. 지속성·재침투 — 셸 초기화 파일 지속성 탐지
📚 시리즈 전체 보기: 시스템 보안 · 취약점