파일 · 권한 · 사용자 관리 19 / 50 · Part 2. Linux 파일 종류와 속성
실습 환경: Rocky Linux 9.8 · Ubuntu 24.04.5 (Docker 격리 컨테이너, 테스트 계정 analyst)
기초편 연계: 「리눅스 시스템 기초」 22. find로 파일 검색

1. 들어가며

Part 2의 거의 마지막 글이다. 공격자는 파일을 시스템에 남기면서 눈에 띄지 않게 하려 한다. Linux에서 가장 흔한 방법은 두 가지다.

  1. .으로 시작하는 숨김 파일
  2. 공백·점·제어문자로 정상 항목처럼 위장한 이름

이번 글에서는 이런 이름들을 직접 만들어 보고, ls가 무엇을 놓치는지, 그리고 find와 ls -b로 어떻게 드러내는지 확인한다. 핵심 메시지는 하나다. Linux에 "숨김 속성"은 없다. ls가 안 보여 줄 뿐이다.


2. 핵심 개념

2-1. 숨김 파일의 정체

Linux에는 Windows 같은 "hidden 속성 비트"가 없다. 단지 ls가 .으로 시작하는 이름을 기본 출력에서 제외 하도록 만들어졌을 뿐이다. .bashrc, .ssh, .config처럼 정상 설정 파일도 대부분 숨김 파일인 이유다.

2-2. ls 옵션

옵션동작
ls. 시작 이름 제외
ls -a., .. 포함 전부
ls -A., ..만 제외하고 전부 (숨김 파일 점검에 적합)
ls -b공백·제어문자를 \ 이스케이프로 표시

2-3. 위장 이름 유형

이름위장 방식
. (점+공백)목록에서 현재 디렉터리 .처럼 보임
.. (점점+공백)상위 디렉터리 ..처럼 보임
... (점 세 개)흔한 정상 항목으로 착각
file (앞 공백)정렬 위치가 달라 눈에 안 띔
제어문자·유니코드터미널에서 안 보이거나 다르게 렌더링

3. 동작 원리

숨김 파일과 위장 이름 탐지

디렉터리 엔트리에는 .hidden이든 normal.txt든 똑같이 저장된다. 커널의 getdents64는 이 목록을 전부 반환한다. 숨기는 것은 오직 ls다. 그래서 ls가 아니라 find나 다른 도구로 직접 엔트리를 읽으면 숨김 파일도 그대로 보인다.

이 사실의 보안적 함의는 분명하다. 숨김은 접근 제어가 아니라 은닉 이다. 파일을 정말 보호하려면 권한(디렉터리 x 제거)을 써야 하고, 파일을 정말 찾으려면 ls가 아니라 find를 써야 한다.


4. 명령어 실습

mkdir ~/lab19 && cd ~/lab19

# 1) 숨김·위장 이름 만들기
touch normal.txt .hidden '...' '. ' ' report.txt'
mkdir .cache '.. '

# 2) ls 기본 — 무엇이 보이나
ls

# 3) ls -a / -A
ls -a
ls -A | cat -A                    # 줄 끝 $ 로 이름 끝 공백 확인

# 4) 위장 이름을 이스케이프로 드러내기
ls -lab

# 5) find 로 전수 검색
find . -name '.*' ! -name '.'
find . -name '* *' -o -name '*. ' | cat -A

# 6) 홈 디렉터리의 정상 숨김 파일
ls -la ~

5. 실행 결과

실제 실행 결과 — Rocky Linux 9.8 · analyst@rocky9-lab — 숨김·위장 이름 탐지

텍스트 원본(실제 출력):

[analyst@rocky9-lab ~]$ mkdir ~/lab19 && cd ~/lab19
[analyst@rocky9-lab lab19]$ touch normal.txt .hidden '...' '. ' ' report.txt'
[analyst@rocky9-lab lab19]$ mkdir .cache '.. '
[analyst@rocky9-lab lab19]$ ls
 report.txt
normal.txt
[analyst@rocky9-lab lab19]$ ls -a
 report.txt
.
. 
..
.. 
...
.cache
.hidden
normal.txt
[analyst@rocky9-lab lab19]$ ls -A | cat -A
 report.txt$
. $
.. $
...$
.cache$
.hidden$
normal.txt$
[analyst@rocky9-lab lab19]$ ls -lab
total 16
-rw-r--r-- 1 analyst analyst    0 Sep 24 10:35 \ report.txt
drwxr-xr-x 4 analyst analyst 4096 Sep 24 10:35 .
-rw-r--r-- 1 analyst analyst    0 Sep 24 10:35 .\ 
drwx------ 3 analyst analyst 4096 Sep 24 10:35 ..
drwxr-xr-x 2 analyst analyst 4096 Sep 24 10:35 ..\ 
-rw-r--r-- 1 analyst analyst    0 Sep 24 10:35 ...
drwxr-xr-x 2 analyst analyst 4096 Sep 24 10:35 .cache
-rw-r--r-- 1 analyst analyst    0 Sep 24 10:35 .hidden
-rw-r--r-- 1 analyst analyst    0 Sep 24 10:35 normal.txt
[analyst@rocky9-lab lab19]$ find . -name '.*' ! -name '.' 
./.hidden
./.cache
./.. 
./. 
./...
[analyst@rocky9-lab lab19]$ find . -name '* *' -o -name '*. ' | cat -A
./ report.txt$
./.. $
./. $
[analyst@rocky9-lab lab19]$ ls -la ~ 
total 24
drwx------ 3 analyst analyst 4096 Sep 24 10:35 .
drwxr-xr-x 1 root    root    4096 Sep 24 10:35 ..
-rw-r--r-- 1 analyst analyst   18 Apr 30  2024 .bash_logout
-rw-r--r-- 1 analyst analyst  141 Apr 30  2024 .bash_profile
-rw-r--r-- 1 analyst analyst  492 Apr 30  2024 .bashrc
drwxr-xr-x 4 analyst analyst 4096 Sep 24 10:35 lab19

6. 결과 해석

출력해석
ls → report.txt, normal.txt숨김이 아닌 두 개만. report.txt는 앞 공백 때문에 맨 위에 정렬
ls -a → . , .. , ..., .cache, .hidden 등진짜 .·..과 위장 . ·.. 이 섞여 보인다
ls -A \| cat -A → . $, .. $줄 끝 $ 앞의 공백으로 이름 끝 공백 이 드러남. . $는 .이 아니라 . (점+공백)이다
ls -lab → .\ , ..\ , \ report.txt-b가 공백을 \ 로 표시. 진짜 .(현재 디렉터리)와 위장 .\ 가 명확히 구분됨
find . -name '.*' ! -name '.'숨김 이름 전부 나열 (.hidden, .cache, .. , . , ...)
find ... '* *' → ./ report.txt, ./.. , ./. 공백 포함 이름만 추림
ls -la ~ → .bash_logout, .bashrc 등정상 숨김 파일. 숨김 = 악성이 아니다

cat -A가 핵심 도구다. 터미널에서 .과 . (점+공백)은 똑같아 보이지만, cat -A는 줄 끝을 $로 표시해 눈에 안 보이는 공백 을 드러낸다.


7. 보안 관점

은닉 기법탐지
. 시작 숨김 파일/디렉터리ls -A, find -name '.*'
. , .. , ... 위장 디렉터리ls -b, find + cat -A
이름 끝·앞 공백ls -A \| cat -A
제어문자·유니코드 이름ls -b, LC_ALL=C ls, find ... -print0 \| cat -v
정상 시스템 경로 흉내 (/tmp/.X11-unix/, /dev/shm/.cache)소유자·생성 시각·내용 확인

과장 금지: 숨김 파일 자체는 지극히 정상이다. 홈 디렉터리에는 수십 개의 정상 숨김 파일이 있다. 판단 기준은 위치·소유자·생성 시각·내용 이다. /tmp나 웹 루트에 최근 생긴 숨김 실행 파일이 의심 대상이지, ~/.bashrc가 의심 대상은 아니다.


8. 보안관제 관점

[Hunt]   공용·웹 경로의 숨김·위장 항목 전수
         find /tmp /var/tmp /dev/shm -name '.*' ! -name '.' ! -name '..' -ls
         find /var/www -name '.*' -type f -ls
     ↓
[위장]    이름 끝 공백·제어문자 점검
         find /tmp -print0 | cat -v      (제어문자 가시화)
     ↓
[Evidence] 의심 항목: stat(소유자·birth) + file + sha256sum
     ↓
[Timeline] birth·ctime 을 사고 시각과 대조, 웹/인증 로그 교차
     ↓
[Response] 격리, 유입 경로 확인, 동일 패턴 전 시스템 검색
관점내용
Baseline공용 경로의 정상 숨김 항목 목록을 미리 확보해 두면 신규 항목만 빠르게 구분된다
자동화 주의스크립트에서 파일명을 다룰 때 공백·개행 포함 이름 때문에 오작동할 수 있다. find -print0 + xargs -0 사용
오탐tmux·X11·systemd가 만든 정상 숨김 소켓·디렉터리

9. 실무에서 자주 발생하는 실수

실수결과예방
ls만으로 디렉터리 점검숨김·위장 항목 누락ls -A, find 병행
숨김 파일을 무조건 악성으로 간주정상 설정 파일 오탐위치·소유자·시각으로 판단
파일명을 for f in $(ls)로 순회공백·개행 이름에서 깨짐find -print0 \| while read -d ''
터미널 표시만 믿음제어문자·유니코드 위장 못 봄cat -A, ls -b, cat -v
rm .* 로 숨김 파일 일괄 삭제..이 매칭되어 상위까지 위험find로 대상 한정 후 삭제

마지막 항목은 특히 위험하다. rm -rf .*는 셸에 따라 ..을 포함해 상위 디렉터리를 삭제 하려 시도할 수 있다.


10. 실습 체크리스트

[ ] . 으로 시작하는 숨김 파일을 만들고 ls 기본에서 안 보이는 것을 확인했다
[ ] ls -a 와 ls -A 의 차이를 확인했다
[ ] cat -A 로 이름 끝 공백을 드러냈다
[ ] ls -b 로 공백 위장 이름을 이스케이프로 확인했다
[ ] find 로 숨김·공백 이름을 전수 검색했다
[ ] 숨김 = 은닉이지 접근 제어가 아니라는 점을 이해했다

11. 핵심 정리

  • Linux에 숨김 속성 비트는 없다. ls가 . 시작 이름을 기본 출력에서 제외할 뿐이다.
  • 숨김은 은닉이지 접근 제어가 아니다. 보호는 권한으로, 탐지는 find로 한다.
  • 위장 이름(. , .. , ..., 앞뒤 공백, 제어문자)은 ls -b와 cat -A로 드러낸다.
  • ls -A는 .·..만 빼고 전부 보여 줘 숨김 점검에 적합하다.
  • 숨김 파일 자체는 정상이다. 위치·소유자·시각·내용으로 판단한다.
  • 스크립트에서는 find -print0로 공백·개행 이름을 안전하게 처리한다.

12. 다음 편 예고

Part 2의 마지막 글 「20. Linux 파일 무결성 확인」 에서는 sha256sum으로 변조를 탐지하고, rpm -V(Rocky)와 dpkg --verify·debsums(Ubuntu)로 시스템 파일이 원본과 같은지 검증하는 방법을 실제 변조 재현과 함께 다룬다.


참고 자료


시리즈 이동

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

0개의 댓글