Linux 시스템 보안 기초 · 32/50편
이 글은
리눅스 시스템 기초·파일 · 권한 · 사용자 관리·서비스 · 프로세스 관리시리즈를 선행 학습으로 두고, 동일한 개념을 보안관제(SOC) 관점에서 한 단계 확장합니다.
환경변수는 프로그램의 동작을 바꾸는 '외부 설정'입니다. 편리하지만, PATH나 LD_PRELOAD 같은 변수는 '어떤 파일이 실행되는가', '어떤 라이브러리가 로드되는가'를 조작해 권한 상승·코드 주입에 악용됩니다.
대표 공격 벡터:
.so를 로드해 함수 동작을 가로챔PATH Hijacking
PATH=/tmp:/usr/bin ← /tmp가 앞에 있음
│ 사용자가 'ls' 입력
▼
/tmp/ls (악성) 실행 ← /usr/bin/ls 보다 먼저 발견됨
LD_PRELOAD
LD_PRELOAD=/tmp/evil.so program
│
└ evil.so의 함수가 원본보다 먼저 로드되어 동작 가로챔
쉘은 명령 실행 시 PATH를 앞에서부터 순차 탐색합니다. 그래서 PATH 앞에 쓰기 가능한 디렉터리(.이나 /tmp)가 있으면, 동명의 악성 바이너리가 정상보다 먼저 실행됩니다. 특히 root의 스크립트가 절대경로 없이 명령을 호출하면(예: cp 대신 /bin/cp 미사용), PATH 조작으로 권한 상승이 가능합니다.
LD_PRELOAD는 동적 링커가 지정 .so를 다른 라이브러리보다 먼저 로드하게 합니다. 다만 보안상 SUID 바이너리에는 LD_PRELOAD/LD_LIBRARY_PATH가 무시됩니다(안전장치). 그래서 이 벡터는 주로 같은 권한 내 후킹이나, 안전장치가 없는 커스텀 실행 흐름에서 악용됩니다.
# 현재 PATH에 위험 요소(. 또는 쓰기가능 앞경로)가 있는지
echo "$PATH" | tr ':' '\n' | nl
# 프로세스별 환경변수에서 LD_* 점검 (root 권한 필요)
sudo grep -aoE 'LD_PRELOAD=[^\x00]*' /proc/*/environ 2>/dev/null
# 전역 설정에 LD_PRELOAD가 박혀 있는지(지속성)
sudo grep -rE 'LD_PRELOAD' /etc/environment /etc/ld.so.preload /etc/profile* 2>/dev/null
실습 환경에서 PATH 점검 실제 결과입니다. (실제 캡처)
$ echo "$PATH" | tr ':' '\n' | nl
1 /usr/local/sbin
2 /usr/local/bin
3 /usr/sbin
4 /usr/bin
5 /sbin
6 /bin
PATH에 .이나 /tmp, 쓰기 가능한 사용자 경로가 앞쪽에 없으므로 정상입니다. /etc/ld.so.preload에 항목이 있으면(정상적으로는 비어 있음) 전역 LD_PRELOAD 지속성을 의심합니다.
ld.so.preload 비어 있음..//tmp/쓰기가능 경로/etc/ld.so.preload에 낯선 .so (전역 후킹 지속성)/etc/ld.so.preload는 강력한 지속성/은닉(루트킷) 벡터라 반드시 점검해야 합니다.
/etc/ld.so.preload 및 전역 프로파일의 LD_* 확인LD_PRELOAD 루트킷은 MITRE T1574.006(Dynamic Linker Hijacking)에 해당합니다. Wazuh FIM으로 /etc/ld.so.preload와 전역 프로파일을 감시하고, 변경 시 즉시 알람합니다. ld.so.preload의 .so 경로·해시는 IOC로 등록하며, 해당 라이브러리를 확보해 분석합니다.
[ ] PATH 앞경로의 쓰기가능/`.` 여부 확인
[ ] /etc/ld.so.preload 점검
[ ] 전역 프로파일의 LD_* 확인
[ ] 프로세스 environ LD_PRELOAD 스캔
다음 편에서는 33. Shell 초기화 파일 보안 를 다룹니다. 로그인할 때마다 실행되는 shell 초기화 파일을 통한 지속성을 봅니다.
본 실습은 격리된 테스트 VM(Rocky Linux / Ubuntu, VMware) 및 테스트 계정 환경을 기준으로 하며, 운영 서버를 대상으로 하지 않습니다. 실행 결과는 실제 캡처와 예시 출력을 명확히 구분해 표기합니다.