시스템 보안 · 취약점 › I. 지속성 · 재침투 징후 · 27/50편 (전체 427/450)
학습 단계: 스케줄·서비스·부팅 지속성 탐지
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
/etc/ld.so.preload에 라이브러리 경로를 적으면 동적 링크되는 모든 프로그램이 실행될 때마다 그 라이브러리를 먼저 불러옵니다(T1574.006). 지속성과 은닉(파일·프로세스 숨기기)을 동시에 얻을 수 있는 강력한 기법입니다.
동적 링커 지속성
/etc/ld.so.preload → 모든 프로세스에 주입 (정상 시스템은 보통 없음)
/etc/ld.so.conf.d/*.conf → 라이브러리 검색 경로 추가 → 정상 라이브러리 이름 가로채기
LD_PRELOAD (환경변수) → 특정 서비스·셸에 주입 (I23·I25와 결합)
효과: ls·ps·netstat 결과 조작 → 은닉형 루트킷(H영역 25편)
핵심: 주입된 시스템에서는 "그 시스템의 도구"를 믿을 수 없다
H영역 25편이 은닉 관점이었다면, 이번 편은 지속성 관점에서 preload가 언제·누구에 의해 만들어졌고 무엇을 다시 살리는지를 봅니다.
| 확인 | 명령 | 포인트 |
|---|---|---|
| preload 파일 | cat /etc/ld.so.preload | 존재 여부 |
| 검색 경로 | cat /etc/ld.so.conf.d/* | 비표준 경로 |
| 주입 확인 | grep -l <lib> /proc/*/maps | 로드된 프로세스 |
| 정적 도구 | busybox ls /etc | 조작 우회 |
# 동적 링커 지속성 점검 (분석 방법)
ls -l --time-style=full-iso /etc/ld.so.preload 2>/dev/null && cat /etc/ld.so.preload
cat /etc/ld.so.conf.d/*.conf 2>/dev/null | grep -vE '^(#|$)'
# 실제로 로드된 비표준 경로 라이브러리 (일부 프로세스 샘플)
sudo grep -hoE '/[^ ]+\.so[^ ]*' /proc/[0-9]*/maps 2>/dev/null | grep -vE '^/(usr/)?lib(64)?/' | sort | uniq -c | head
# 루트킷 영향 가능성: 정적 바이너리로 교차 확인
command -v busybox && busybox ls -la /etc/ld.so.preload
ls: cannot access '/etc/ld.so.preload': No such file or directory
ld.so.conf.d: 패키지 기본 경로만
비표준 경로 라이브러리 로드: 없음
ld.so.preload가 없고, 라이브러리 검색 경로가 패키지 기본값이며, 비표준 경로 라이브러리를 로드한 프로세스가 없는 상태가 정상입니다.
-rw-r--r--. 1 root root 27 2026-10-08 03:04 /etc/ld.so.preload
/usr/lib64/.libsys.so
maps: 412 /usr/lib64/.libsys.so (412개 프로세스에 주입)
동적 링커 지속성 분석 흐름입니다(가상의 예시).
[preload 생성 감지] auditd persist_preload · FIM
↓
[라이브러리 확인] 경로·해시·패키지 소유·문자열(후킹 함수명)
↓
[주입 범위] /proc/*/maps 로드 프로세스 수
↓
[신뢰성] 정적 도구·외부 매체·오프라인 분석으로 교차 검증
| 신호 | 해석 |
|---|---|
| preload 존재 | 강한 이상 |
| 숨김 .so | 악성 라이브러리 |
| 도구 결과 불일치 | 은닉 동작 |
라이브러리가 readdir·fopen 같은 함수를 가로채면 해당 서버 안의 점검 결과를 믿을 수 없으므로, 디스크 이미지를 떠서 다른 시스템에서 분석하는 것이 안전합니다.
<!-- 실습 예시 룰: 적용 전 wazuh-logtest 및 테스트 환경 검증 필요 -->
<group name="local,syssec_i,persistence,">
<rule id="108260" level="15">
<if_sid>108000</if_sid>
<field name="audit.key">persist_preload</field>
<field name="audit.file.name" type="pcre2">^/etc/ld\.so\.(preload|conf|conf\.d/.*)$</field>
<description>동적 링커 preload·검색 경로 변경(라이브러리 주입 지속성 의심)</description>
<mitre><id>T1574.006</id></mitre>
</rule>
</group>
/etc/ld.so.preload는 존재하지 않는 경우가 대부분이므로 파일 생성 자체를 최고 레벨로 경보합니다. 파일이 아직 없더라도 -w /etc/ld.so.preload -p wa로 감시 규칙을 걸 수 있습니다.
| 위치 | 범위 |
|---|---|
| ld.so.preload | 모든 프로세스 |
| ld.so.conf.d | 라이브러리 가로채기 |
| LD_PRELOAD | 특정 서비스·셸 |
| 주의 | 호스트 도구 결과 불신 |
| 면접 포인트 | "preload 한 줄이면 모든 실행이 트리거 — 그 서버의 도구는 믿지 않는다" |
다음 편 428. 지속성·재침투 — 스케줄·서비스·부팅 지속성 종합 분석 에서는 I19~I27의 cron·at·systemd 서비스·timer·drop-in·rc.local·셸 초기화·udev·ld.so.preload 지속성을 트리거별 점검 체계로 종합합니다.
이전 편: 426. 지속성·재침투 — udev 규칙 지속성 탐지
📚 시리즈 전체 보기: 시스템 보안 · 취약점