파일 · 권한 · 사용자 관리 19 / 50 · Part 2. Linux 파일 종류와 속성
실습 환경: Rocky Linux 9.8 · Ubuntu 24.04.5 (Docker 격리 컨테이너, 테스트 계정analyst)
기초편 연계: 「리눅스 시스템 기초」 22. find로 파일 검색
Part 2의 거의 마지막 글이다. 공격자는 파일을 시스템에 남기면서 눈에 띄지 않게 하려 한다. Linux에서 가장 흔한 방법은 두 가지다.
.으로 시작하는 숨김 파일이번 글에서는 이런 이름들을 직접 만들어 보고, ls가 무엇을 놓치는지, 그리고 find와 ls -b로 어떻게 드러내는지 확인한다. 핵심 메시지는 하나다. Linux에 "숨김 속성"은 없다. ls가 안 보여 줄 뿐이다.
Linux에는 Windows 같은 "hidden 속성 비트"가 없다. 단지 ls가 .으로 시작하는 이름을 기본 출력에서 제외 하도록 만들어졌을 뿐이다. .bashrc, .ssh, .config처럼 정상 설정 파일도 대부분 숨김 파일인 이유다.
| 옵션 | 동작 |
|---|---|
ls | . 시작 이름 제외 |
ls -a | ., .. 포함 전부 |
ls -A | ., ..만 제외하고 전부 (숨김 파일 점검에 적합) |
ls -b | 공백·제어문자를 \ 이스케이프로 표시 |
| 이름 | 위장 방식 |
|---|---|
. (점+공백) | 목록에서 현재 디렉터리 .처럼 보임 |
.. (점점+공백) | 상위 디렉터리 ..처럼 보임 |
... (점 세 개) | 흔한 정상 항목으로 착각 |
file (앞 공백) | 정렬 위치가 달라 눈에 안 띔 |
| 제어문자·유니코드 | 터미널에서 안 보이거나 다르게 렌더링 |

디렉터리 엔트리에는 .hidden이든 normal.txt든 똑같이 저장된다. 커널의 getdents64는 이 목록을 전부 반환한다. 숨기는 것은 오직 ls다. 그래서 ls가 아니라 find나 다른 도구로 직접 엔트리를 읽으면 숨김 파일도 그대로 보인다.
이 사실의 보안적 함의는 분명하다. 숨김은 접근 제어가 아니라 은닉 이다. 파일을 정말 보호하려면 권한(디렉터리 x 제거)을 써야 하고, 파일을 정말 찾으려면 ls가 아니라 find를 써야 한다.
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 ~

텍스트 원본(실제 출력):
[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
| 출력 | 해석 |
|---|---|
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는 줄 끝을 $로 표시해 눈에 안 보이는 공백 을 드러낸다.
| 은닉 기법 | 탐지 |
|---|---|
. 시작 숨김 파일/디렉터리 | 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가 의심 대상은 아니다.
[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가 만든 정상 숨김 소켓·디렉터리 |
| 실수 | 결과 | 예방 |
|---|---|---|
ls만으로 디렉터리 점검 | 숨김·위장 항목 누락 | ls -A, find 병행 |
| 숨김 파일을 무조건 악성으로 간주 | 정상 설정 파일 오탐 | 위치·소유자·시각으로 판단 |
파일명을 for f in $(ls)로 순회 | 공백·개행 이름에서 깨짐 | find -print0 \| while read -d '' |
| 터미널 표시만 믿음 | 제어문자·유니코드 위장 못 봄 | cat -A, ls -b, cat -v |
rm .* 로 숨김 파일 일괄 삭제 | ..이 매칭되어 상위까지 위험 | find로 대상 한정 후 삭제 |
마지막 항목은 특히 위험하다. rm -rf .*는 셸에 따라 ..을 포함해 상위 디렉터리를 삭제 하려 시도할 수 있다.
[ ] . 으로 시작하는 숨김 파일을 만들고 ls 기본에서 안 보이는 것을 확인했다
[ ] ls -a 와 ls -A 의 차이를 확인했다
[ ] cat -A 로 이름 끝 공백을 드러냈다
[ ] ls -b 로 공백 위장 이름을 이스케이프로 확인했다
[ ] find 로 숨김·공백 이름을 전수 검색했다
[ ] 숨김 = 은닉이지 접근 제어가 아니라는 점을 이해했다
ls가 . 시작 이름을 기본 출력에서 제외할 뿐이다.find로 한다.. , .. , ..., 앞뒤 공백, 제어문자)은 ls -b와 cat -A로 드러낸다.ls -A는 .·..만 빼고 전부 보여 줘 숨김 점검에 적합하다.find -print0로 공백·개행 이름을 안전하게 처리한다.Part 2의 마지막 글 「20. Linux 파일 무결성 확인」 에서는 sha256sum으로 변조를 탐지하고, rpm -V(Rocky)와 dpkg --verify·debsums(Ubuntu)로 시스템 파일이 원본과 같은지 검증하는 방법을 실제 변조 재현과 함께 다룬다.