리눅스 시스템 기초 · 입문편 — 본문의 "N편"은 입문 과정 번호다. 번호별 글과 전체 250편 구성은 통합 로드맵에서 확인할 수 있다.

리눅스 시스템 기초 12 / 50 · Part 2. 파일·명령어·권한
실습 환경: Rocky Linux 9 (10.0.0.200) · Apache httpd
이전 글: 11. Linux 파일과 디렉터리 관리

🔗 심화 시리즈 — 「파일 · 권한 · 사용자 관리」
이 주제를 더 깊게 다룬 실무형 보안 시리즈: 04. 절대경로와 상대경로

1. 들어가며

경로(path)는 파일의 위치를 나타내는 주소다. 절대경로와 상대경로는 Linux를 처음 배울 때 가장 먼저 익히는 개념이지만, 보안에서는 생각보다 자주 문제를 일으킨다.

  • 웹 애플리케이션이 사용자 입력으로 받은 경로를 검증하지 않으면 ../로 웹 루트를 벗어나 시스템 파일이 노출 된다(Path Traversal).
  • root로 실행되는 스크립트나 cron이 상대경로로 명령·파일을 참조 하면, 실행 위치나 PATH 조작으로 다른 파일이 실행될 수 있다.
  • 심볼릭 링크가 섞이면 "보이는 경로"와 "실제 파일"이 달라진다.

이번 글은 경로 해석 규칙을 정확히 정리하고, 웹 로그에서 경로 탐색 공격을 찾는 방법까지 연결한다.


2. 핵심 개념

2-1. 절대경로와 상대경로

구분시작기준예
절대경로/루트 디렉터리/var/log/secure
상대경로/ 이외현재 작업 디렉터리log/secure, ../etc

2-2. 특수 경로 기호

기호의미예 (현재 위치 /var/www/html)
.현재 디렉터리./index.php → /var/www/html/index.php
..상위 디렉터리../ → /var/www
~현재 사용자의 홈~/lab → /home/roror/lab
~user특정 사용자의 홈~apache → /usr/share/httpd
- (cd에서)직전 디렉터리cd -

/의 상위(/..)는 다시 /다. 그래서 ../를 필요 이상으로 많이 붙여도 루트에서 멈춘다. 공격자가 ../../../../../../etc/passwd처럼 넉넉하게 붙이는 이유다.

2-3. 실제 경로 확인 도구

명령결과
pwd / pwd -L논리 경로 (심볼릭 링크 이름 유지)
pwd -P물리 경로 (링크를 따라간 실제 위치)
realpath <경로>., .., 링크를 모두 해석한 절대경로
readlink -f <경로>realpath와 유사

3. 동작 원리

경로 해석 — 그리고 경로 탐색(Path Traversal) 공격

커널은 경로를 / 기준으로 한 단계씩 해석한다. 상대경로라면 프로세스의 현재 작업 디렉터리(cwd) 에서 시작한다. 프로세스의 cwd는 /proc/<PID>/cwd로 확인할 수 있다.

웹 서버에서 view.php?file=img/logo.png를 처리할 때 애플리케이션이 "/var/www/html/" + file처럼 문자열을 붙여 파일을 연다면, file 값에 ../가 들어오는 순간 커널은 이를 그대로 해석해 웹 루트 밖으로 나간다. 문제는 커널이 아니라 입력값을 검증하지 않은 애플리케이션 에 있다.

방어는 "경로를 정규화한 뒤 허용된 디렉터리 안에 있는지 확인"하는 것이다.

# 정규화 예시 — 결과가 /var/www/html 로 시작하지 않으면 거부
realpath -m /var/www/html/../../../etc/passwd    # /etc/passwd

4. 실습

# 1) 경로 이동과 확인
cd /var/www/html
pwd
cd ../../log && pwd          # /var/log
cd - && pwd                  # 직전 위치로
cd ~ && pwd

# 2) 정규화
realpath -m /var/www/html/../../../etc/passwd
realpath -m ./img/../index.php

# 3) 심볼릭 링크와 논리/물리 경로
mkdir -p ~/lab12/real && ln -sfn ~/lab12/real ~/lab12/link
cd ~/lab12/link
pwd -L; pwd -P

# 4) 프로세스의 현재 작업 디렉터리
sudo ls -l /proc/$(pgrep -o httpd)/cwd
sudo ls -l /proc/$$/cwd

# 5) 테스트 요청으로 로그 생성 (본인 실습 서버에서만)
curl -s -o /dev/null -w '%{http_code}\n' 'http://10.0.0.200/index.html?file=../../../etc/passwd'

# 6) 웹 로그에서 경로 탐색 패턴 검색
sudo grep -Ei '\.\./|%2e%2e|\.\.%2f|%252e%252e' /var/log/httpd/access_log | tail

5. 결과 분석

아래 출력은 형식 설명용 예시다.

① access_log의 경로 탐색 시도

10.0.0.128 - - [23/Sep/2026:10:52:11 +0900] "GET /view.php?file=../../../etc/passwd HTTP/1.1" 200 1893 "-" "curl/8.x"
10.0.0.128 - - [23/Sep/2026:10:52:14 +0900] "GET /view.php?file=..%2f..%2f..%2fetc%2fshadow HTTP/1.1" 200 0 "-" "curl/8.x"
필드값해석
출발지 IP10.0.0.128공격 출발지 (IOC)
요청file=../../../etc/passwd경로 탐색 시도
인코딩%2f = /, %2e = .필터 우회 목적의 URL 인코딩
상태 코드200요청이 처리됨 (성공 여부는 크기로 판단)
응답 크기1893 / 0정상 페이지와 다른 크기 → 파일 내용 노출 가능성
User-Agentcurl브라우저가 아닌 도구

상태 코드 200만으로 공격 성공을 단정할 수는 없다. 애플리케이션이 오류 페이지를 200으로 돌려주는 경우도 많다. 같은 페이지의 정상 요청 응답 크기와 비교 하는 것이 실무적인 판단 방법이다.

② pwd -L / pwd -P

/home/roror/lab12/link
/home/roror/lab12/real

6. 보안 관점

취약 상황원인대응
웹 경로 탐색사용자 입력 경로를 검증 없이 연결정규화 후 허용 디렉터리 확인, 파일명 화이트리스트
스크립트의 상대경로cd 실패 후 상대경로로 rm -rf 등 실행절대경로 사용, `cd dir
cron의 상대 명령tar처럼 전체 경로 없이 실행 → PATH 조작 (9편)명령어도 절대경로 (/usr/bin/tar)
/tmp 심볼릭 링크 공격root 프로그램이 예측 가능한 /tmp 파일에 쓰기 → 공격자가 미리 링크를 걸어 다른 파일 덮어쓰기mktemp, fs.protected_symlinks=1

마지막 항목과 관련해 Linux 커널에는 fs.protected_symlinks, fs.protected_hardlinks 보호 기능이 있다. Sticky Bit 디렉터리(/tmp)에서 다른 사용자가 만든 링크를 따라가는 것을 제한한다. 대부분의 배포판에서 기본값 1이다.

sysctl fs.protected_symlinks fs.protected_hardlinks

7. SOC / 보안관제 활용

7-1. 탐지 규칙 아이디어

탐지 대상조건 예
경로 탐색 시도URL에 ../ 또는 인코딩 변형 3회 이상
민감 파일명URL에 etc/passwd, etc/shadow, .ssh/, proc/self
성공 가능성위 조건 + 상태 200 + 응답 크기가 해당 URL 평균과 크게 다름

7-2. 출발지별 집계

sudo grep -Ei '\.\./|%2e%2e' /var/log/httpd/access_log \
  | awk '{print $1}' | sort | uniq -c | sort -rn | head

(파이프라인·awk·uniq는 Part 3에서 자세히 다룬다.)

7-3. 분석 흐름

[Alert]   웹 방화벽/SIEM: Path Traversal 패턴 (10.0.0.128)
   ↓
[IOC]     출발지 IP, 요청 URL, User-Agent, 시각
   ↓
[분석]    같은 IP의 전체 요청 흐름 (정찰 → 시도 → 성공 여부)
          응답 크기 비교, 노출 대상 파일 확인
   ↓
[Root Cause] view.php 의 file 파라미터 검증 부재
   ↓
[Response]  IP 차단, 취약 코드 수정 요청, 노출된 정보(계정 목록 등) 영향 평가

8. 핵심 정리

  • 절대경로는 /부터, 상대경로는 현재 작업 디렉터리 부터 해석된다.
  • .은 현재, ..은 상위, ~은 홈이다. /의 상위는 /다.
  • realpath로 ..과 링크를 해석한 실제 경로를 확인할 수 있다.
  • 경로 탐색 공격은 ../로 웹 루트를 벗어난다. URL 인코딩 변형 까지 검색해야 한다.
  • 상태 코드 200만으로 성공을 판단하지 말고 응답 크기 를 비교한다.
  • 스크립트와 cron에서는 명령과 파일 모두 절대경로 를 쓴다.

9. 다음 글

다음 글 「13. Linux 파일 종류」 에서는 ls -l 맨 앞 글자가 나타내는 7가지 파일 종류(일반, 디렉터리, 링크, 장치, 소켓, 파이프)를 정리하고, 확장자가 아니라 파일 내용(매직 넘버)으로 파일을 판별 하는 방법을 다룬다.


참고 자료

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

0개의 댓글