Linux 시스템 보안 기초 · 32/50편

이 글은 리눅스 시스템 기초 · 파일 · 권한 · 사용자 관리 · 서비스 · 프로세스 관리 시리즈를 선행 학습으로 두고, 동일한 개념을 보안관제(SOC) 관점에서 한 단계 확장합니다.

선행 학습

1. 들어가며

환경변수는 프로그램의 동작을 바꾸는 '외부 설정'입니다. 편리하지만, PATH나 LD_PRELOAD 같은 변수는 '어떤 파일이 실행되는가', '어떤 라이브러리가 로드되는가'를 조작해 권한 상승·코드 주입에 악용됩니다.

2. 핵심 개념

대표 공격 벡터:

  • PATH Hijacking: PATH에 공격자 경로를 앞세워, 정상 명령 대신 악성 동명 바이너리가 실행되게 함
  • LD_PRELOAD: 정상 라이브러리보다 먼저 악성 .so를 로드해 함수 동작을 가로챔
  • LD_LIBRARY_PATH: 라이브러리 탐색 경로를 조작
  • IFS 등 기타: 스크립트 파싱 조작(고전 기법)
PATH Hijacking
PATH=/tmp:/usr/bin   ← /tmp가 앞에 있음
     │ 사용자가 'ls' 입력
     ▼
/tmp/ls (악성) 실행  ← /usr/bin/ls 보다 먼저 발견됨

LD_PRELOAD
LD_PRELOAD=/tmp/evil.so  program
     │
     └ evil.so의 함수가 원본보다 먼저 로드되어 동작 가로챔

3. 동작 원리

쉘은 명령 실행 시 PATH를 앞에서부터 순차 탐색합니다. 그래서 PATH 앞에 쓰기 가능한 디렉터리(.이나 /tmp)가 있으면, 동명의 악성 바이너리가 정상보다 먼저 실행됩니다. 특히 root의 스크립트가 절대경로 없이 명령을 호출하면(예: cp 대신 /bin/cp 미사용), PATH 조작으로 권한 상승이 가능합니다.

LD_PRELOAD는 동적 링커가 지정 .so를 다른 라이브러리보다 먼저 로드하게 합니다. 다만 보안상 SUID 바이너리에는 LD_PRELOAD/LD_LIBRARY_PATH가 무시됩니다(안전장치). 그래서 이 벡터는 주로 같은 권한 내 후킹이나, 안전장치가 없는 커스텀 실행 흐름에서 악용됩니다.

4. 명령어 실습

# 현재 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

5. 실행 결과

실습 환경에서 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 지속성을 의심합니다.

6. 보안 관점 — 정상 사용 vs 악용

  • 정상: PATH는 표준 시스템 경로만, ld.so.preload 비어 있음.
  • 악성 징후:
    • PATH 앞에 .//tmp/쓰기가능 경로
    • /etc/ld.so.preload에 낯선 .so (전역 후킹 지속성)
    • 프로세스 environ의 의심 LD_PRELOAD

/etc/ld.so.preload는 강력한 지속성/은닉(루트킷) 벡터라 반드시 점검해야 합니다.

7. 탐지 방법

  • PATH 구성 점검(앞경로 쓰기가능 여부)
  • /etc/ld.so.preload 및 전역 프로파일의 LD_* 확인
  • 프로세스 environ의 LD_PRELOAD 스캔

8. SOC 관점 — SIEM · Wazuh · IOC

LD_PRELOAD 루트킷은 MITRE T1574.006(Dynamic Linker Hijacking)에 해당합니다. Wazuh FIM으로 /etc/ld.so.preload와 전역 프로파일을 감시하고, 변경 시 즉시 알람합니다. ld.so.preload의 .so 경로·해시는 IOC로 등록하며, 해당 라이브러리를 확보해 분석합니다.

9. 실습 체크리스트

[ ] PATH 앞경로의 쓰기가능/`.` 여부 확인
[ ] /etc/ld.so.preload 점검
[ ] 전역 프로파일의 LD_* 확인
[ ] 프로세스 environ LD_PRELOAD 스캔

10. 핵심 정리

  • PATH Hijacking은 실행 경로를, LD_PRELOAD는 로드 라이브러리를 조작한다.
  • SUID 바이너리는 LD_PRELOAD를 무시하는 안전장치가 있다.
  • /etc/ld.so.preload는 강력한 루트킷 지속성 벡터다.
  • root 스크립트의 상대경로 명령 호출이 PATH 공격을 부른다.
  • ld.so.preload 변경은 최우선 FIM 대상이다.

11. 다음 편

다음 편에서는 33. Shell 초기화 파일 보안 를 다룹니다. 로그인할 때마다 실행되는 shell 초기화 파일을 통한 지속성을 봅니다.


본 실습은 격리된 테스트 VM(Rocky Linux / Ubuntu, VMware) 및 테스트 계정 환경을 기준으로 하며, 운영 서버를 대상으로 하지 않습니다. 실행 결과는 실제 캡처와 예시 출력을 명확히 구분해 표기합니다.

profile
코드에 숨겨진 위협을 읽고 AI로 보안의 미래를 설계합니다. 프론트엔드 개발 경험을 자산 삼아 더 견고하고 지능적인 보안 운영 시스템을 구축해 나가는 과정을 기록합니다

0개의 댓글