파일 · 권한 · 사용자 관리 46 / 50 · Part 5. 권한 상승과 Linux 보안
실습 환경: Rocky Linux 9.8 · Ubuntu 24.04.5 (Docker 격리 컨테이너, 테스트 계정analyst)
기초편 연계: 「리눅스 시스템 기초」 22. find로 파일 검색 · 30. Linux 명령어를 활용한 보안 점검
45편의 최소 권한 원칙을 어기는 가장 흔하고 위험한 사례가 world-writable — 누구나 쓸 수 있는(other에 w) 파일과 디렉터리다. 문제 해결을 위해 chmod 777을 남발하는 습관에서 주로 생긴다.
이번 글에서는 find로 world-writable 파일·디렉터리를 탐색하는 실전 명령을 다룬다. 핵심은 파일과 디렉터리의 위험도가 다르다 는 점이다. world-writable 파일은 거의 항상 위험하지만, world-writable 디렉터리는 Sticky Bit 유무 로 위험이 갈린다(30편). /tmp(1777)는 정상이지만 Sticky 없는 777 디렉터리는 위험하다.
other 칸에 w가 있으면 시스템의 모든 사용자 가 그 파일·디렉터리를 수정할 수 있다. 서비스 계정으로 침투한 공격자도 포함된다.
| 대상 | world-writable의 위험 |
|---|---|
| 일반 파일 | 누구나 내용 변조 |
| 스크립트·설정 파일 | 코드 주입 → root cron이 실행하면 권한 상승 |
| 디렉터리 (Sticky 없음) | 누구나 파일 생성·삭제·바꿔치기 |
| 디렉터리 (Sticky 있음) | 정상 공용 디렉터리(/tmp) |
| 명령 | 의미 |
|---|---|
-perm -0002 | other에 w 비트가 있는 것 |
-perm -1000 | Sticky Bit가 있는 것 |
! -perm -1000 | Sticky Bit가 없는 것 |
-perm -4000 | SUID |
-perm -MODE(하이픈)는 "해당 비트를 포함 하는" 것을 의미한다. 정확한 일치가 아니다.

find / -xdev -type f -perm -0002는 other의 w 비트가 켜진 모든 파일을 찾는다. -xdev는 다른 파일 시스템으로 넘어가지 않게 해(가상 FS 제외), 실제 디스크만 점검한다.
디렉터리 점검에서 Sticky Bit 필터가 핵심이다. /tmp, /var/tmp, /dev/shm은 정상적으로 1777(world-writable + Sticky)이다. 이들을 위험 목록에 넣으면 오탐이 된다. ! -perm -1000으로 Sticky가 없는 world-writable 디렉터리만 걸러내면, 진짜 위험한 것만 남는다.
가장 위험한 조합은 world-writable + SUID 다. 누구나 쓸 수 있으면서 소유자 권한으로 실행되는 파일은, 내용을 바꿔 즉시 권한 상승에 쓸 수 있다.
테스트 디렉터리에 다양한 권한의 파일을 배치했다.
config.php(666),upload(777),tmp(1777),tool(4777, world-writable SUID)이 있다.
cd /data/lab46
# 1) world-writable 파일
find . -xdev -type f -perm -0002 -ls 2>/dev/null
# 2) world-writable 디렉터리 중 Sticky 없는 것 (위험)
find . -xdev -type d -perm -0002 ! -perm -1000 -ls 2>/dev/null
# 3) Sticky 있는 정상 공용 디렉터리 (제외 대상)
find . -xdev -type d -perm -0002 -perm -1000 -ls 2>/dev/null
# 4) world-writable + SUID (매우 위험)
find . -xdev -type f -perm -0002 -perm -4000 -ls 2>/dev/null

텍스트 원본(실제 출력):
[analyst@rocky9-lab ~]$ cd /data/lab46
[analyst@rocky9-lab lab46]$ echo "=== world-writable 파일 (other 에 w) ==="
=== world-writable 파일 (other 에 w) ===
[analyst@rocky9-lab lab46]$ find . -xdev -type f -perm -0002 -ls 2>/dev/null
17 28 -rwsrwxrwx 1 root root 27936 Sep 24 15:07 ./web/tool
13 4 -rw-rw-rw- 1 root root 7 Sep 24 15:07 ./web/config.php
[analyst@rocky9-lab lab46]$ echo "=== world-writable 디렉터리 중 Sticky 없는 것 (위험) ==="
=== world-writable 디렉터리 중 Sticky 없는 것 (위험) ===
[analyst@rocky9-lab lab46]$ find . -xdev -type d -perm -0002 ! -perm -1000 -ls 2>/dev/null
15 4 drwxrwxrwx 2 root root 4096 Sep 24 15:07 ./upload
[analyst@rocky9-lab lab46]$ echo "=== Sticky 있는 정상 공용 디렉터리 (제외됨) ==="
=== Sticky 있는 정상 공용 디렉터리 (제외됨) ===
[analyst@rocky9-lab lab46]$ find . -xdev -type d -perm -0002 -perm -1000 -ls 2>/dev/null
16 4 drwxrwxrwt 2 root root 4096 Sep 24 15:07 ./tmp
[analyst@rocky9-lab lab46]$ echo "=== world-writable + SUID (매우 위험) ==="
=== world-writable + SUID (매우 위험) ===
[analyst@rocky9-lab lab46]$ find . -xdev -type f -perm -0002 -perm -4000 -ls 2>/dev/null
17 28 -rwsrwxrwx 1 root root 27936 Sep 24 15:07 ./web/tool
| 출력 | 해석 |
|---|---|
-rw-rw-rw- config.php | 666. 누구나 설정 파일 변조 가능 |
-rwsrwxrwx tool | 4777. world-writable + SUID = 치명적 |
drwxrwxrwx upload | 777, Sticky 없음. 누구나 파일 바꿔치기 |
drwxrwxrwt tmp (Sticky 필터에서 제외) | 1777. 정상 공용 디렉터리 |
WW+SUID 검색 → tool | 가장 위험한 조합만 정확히 추출 |
upload(777)와 tmp(1777)의 구분이 이번 실습의 핵심이다. 둘 다 world-writable이지만, Sticky가 없는 upload는 위험 목록에, Sticky가 있는 tmp는 정상으로 분류된다. Sticky 필터가 오탐을 걸러 준다.
tool(4777)은 최악이다. 누구나 이 파일을 바꿀 수 있고, 바뀐 파일은 root 권한(SUID)으로 실행된다. 공격자가 자기 코드를 넣으면 즉시 root다.
| 발견 | 위험 | 대응 |
|---|---|---|
| WW 파일 | 누구나 변조 | chmod o-w |
| WW 스크립트/설정 | 코드 주입 (root cron 실행 시 권한 상승) | 소유자만 쓰기 |
| WW 디렉터리 (Sticky 없음) | 파일 바꿔치기·심볼릭 링크 공격 | Sticky 추가 또는 권한 축소 |
| WW + SUID | 즉시 권한 상승 | 즉시 조사·제거 |
연결 시나리오:
잘못된 권한(WW 스크립트)
→ 공격자가 스크립트에 명령 삽입
→ root cron 이 그 스크립트 실행
→ 권한 상승
→ 로그 발생
→ SIEM 수집 → 이상행위 탐지
world-writable 발견은 취약점(가능성) 이다. 실제 변조가 있었는지는 파일 무결성(20편)과 변경 로그로 확인한다.
[정기 점검] find / -xdev -type f -perm -0002 ! -path '/proc/*' 2>/dev/null # WW 파일
find / -xdev -type d -perm -0002 ! -perm -1000 2>/dev/null # WW 디렉터리(Sticky X)
find / -xdev -type f -perm -0002 -perm -4000 2>/dev/null # WW+SUID
↓
[우선순위] WW+SUID > WW 스크립트/설정 > WW 디렉터리(Sticky X) > WW 파일
↓
[Evidence] 대상 파일 ctime(권한 변경 시각), 무결성 해시, root cron 참조 여부
↓
[Detection] chmod 로 world-writable 설정을 auditd 로 감시
↓
[Response] 권한 축소, 무결성 확인, 변경 경위 조사(49편)
| 관점 | 내용 |
|---|---|
| 우선순위 | root cron·서비스가 실행하는 WW 파일이 최우선 |
| 오탐 관리 | /tmp 등 Sticky 정상 디렉터리는 제외 |
| CIS | world-writable 점검은 CIS 벤치마크 기본 항목 |
| 실수 | 결과 | 예방 |
|---|---|---|
문제 해결로 chmod 777 | world-writable 양산 | 필요한 최소 권한 |
/tmp를 위험으로 오판 | 오탐 | Sticky 필터 |
| WW 파일만 보고 디렉터리 누락 | 바꿔치기 위험 | 파일·디렉터리 모두 |
| 발견을 침해로 단정 | 과장 | 무결성·로그로 실제 확인 |
-xdev 없이 전체 스캔 | /proc 등 오탐·과부하 | -xdev 사용 |
[ ] find -perm -0002 로 world-writable 파일을 찾았다
[ ] Sticky 없는 world-writable 디렉터리를 구분했다
[ ] /tmp(1777)가 정상으로 제외되는 것을 확인했다
[ ] world-writable + SUID 를 탐지했다
[ ] -perm -MODE 가 "비트 포함"임을 이해했다
[ ] 발견이 취약점이고 실제 변조는 별도 확인임을 안다
w)은 누구나 수정 가능해 최소 권한 위반이다.find -perm -0002로 찾고, ! -perm -1000으로 Sticky 없는 것만 좁힌다./tmp(1777)는 정상이므로 Sticky 필터로 오탐을 제거한다.다음 글 「47. SUID/SGID 파일 보안 점검」 에서는 SUID/SGID 파일 목록을 기준값으로 관리하고, 비표준 위치·패키지 미소속 SUID를 탐지하는 방법을 다룬다. /tmp에 숨겨진 SUID bash 백도어를 찾아낸다.
-perm — https://man7.org/linux/man-pages/man1/find.1.html