파일 · 권한 · 사용자 관리 46 / 50 · Part 5. 권한 상승과 Linux 보안
실습 환경: Rocky Linux 9.8 · Ubuntu 24.04.5 (Docker 격리 컨테이너, 테스트 계정 analyst)
기초편 연계: 「리눅스 시스템 기초」 22. find로 파일 검색 · 30. Linux 명령어를 활용한 보안 점검

1. 들어가며

45편의 최소 권한 원칙을 어기는 가장 흔하고 위험한 사례가 world-writable — 누구나 쓸 수 있는(other에 w) 파일과 디렉터리다. 문제 해결을 위해 chmod 777을 남발하는 습관에서 주로 생긴다.

이번 글에서는 find로 world-writable 파일·디렉터리를 탐색하는 실전 명령을 다룬다. 핵심은 파일과 디렉터리의 위험도가 다르다 는 점이다. world-writable 파일은 거의 항상 위험하지만, world-writable 디렉터리는 Sticky Bit 유무 로 위험이 갈린다(30편). /tmp(1777)는 정상이지만 Sticky 없는 777 디렉터리는 위험하다.


2. 핵심 개념

2-1. world-writable의 의미

other 칸에 w가 있으면 시스템의 모든 사용자 가 그 파일·디렉터리를 수정할 수 있다. 서비스 계정으로 침투한 공격자도 포함된다.

대상world-writable의 위험
일반 파일누구나 내용 변조
스크립트·설정 파일코드 주입 → root cron이 실행하면 권한 상승
디렉터리 (Sticky 없음)누구나 파일 생성·삭제·바꿔치기
디렉터리 (Sticky 있음)정상 공용 디렉터리(/tmp)

2-2. find 권한 탐색

명령의미
-perm -0002other에 w 비트가 있는 것
-perm -1000Sticky Bit가 있는 것
! -perm -1000Sticky Bit가 없는 것
-perm -4000SUID

-perm -MODE(하이픈)는 "해당 비트를 포함 하는" 것을 의미한다. 정확한 일치가 아니다.


3. 동작 원리

World-Writable 점검 — find 권한 탐색

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 다. 누구나 쓸 수 있으면서 소유자 권한으로 실행되는 파일은, 내용을 바꿔 즉시 권한 상승에 쓸 수 있다.


4. 명령어 실습

테스트 디렉터리에 다양한 권한의 파일을 배치했다. 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

5. 실행 결과

실제 실행 결과 — Rocky Linux 9.8 · analyst@rocky9-lab — world-writable 점검

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

[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

6. 결과 해석

출력해석
-rw-rw-rw- config.php666. 누구나 설정 파일 변조 가능
-rwsrwxrwx tool4777. world-writable + SUID = 치명적
drwxrwxrwx upload777, Sticky 없음. 누구나 파일 바꿔치기
drwxrwxrwt tmp (Sticky 필터에서 제외)1777. 정상 공용 디렉터리
WW+SUID 검색 → tool가장 위험한 조합만 정확히 추출

upload(777)와 tmp(1777)의 구분이 이번 실습의 핵심이다. 둘 다 world-writable이지만, Sticky가 없는 upload는 위험 목록에, Sticky가 있는 tmp는 정상으로 분류된다. Sticky 필터가 오탐을 걸러 준다.

tool(4777)은 최악이다. 누구나 이 파일을 바꿀 수 있고, 바뀐 파일은 root 권한(SUID)으로 실행된다. 공격자가 자기 코드를 넣으면 즉시 root다.


7. 보안 관점

발견위험대응
WW 파일누구나 변조chmod o-w
WW 스크립트/설정코드 주입 (root cron 실행 시 권한 상승)소유자만 쓰기
WW 디렉터리 (Sticky 없음)파일 바꿔치기·심볼릭 링크 공격Sticky 추가 또는 권한 축소
WW + SUID즉시 권한 상승즉시 조사·제거

연결 시나리오:

잘못된 권한(WW 스크립트)
  → 공격자가 스크립트에 명령 삽입
  → root cron 이 그 스크립트 실행
  → 권한 상승
  → 로그 발생
  → SIEM 수집 → 이상행위 탐지

world-writable 발견은 취약점(가능성) 이다. 실제 변조가 있었는지는 파일 무결성(20편)과 변경 로그로 확인한다.


8. 보안관제 관점

[정기 점검]  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 정상 디렉터리는 제외
CISworld-writable 점검은 CIS 벤치마크 기본 항목

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

실수결과예방
문제 해결로 chmod 777world-writable 양산필요한 최소 권한
/tmp를 위험으로 오판오탐Sticky 필터
WW 파일만 보고 디렉터리 누락바꿔치기 위험파일·디렉터리 모두
발견을 침해로 단정과장무결성·로그로 실제 확인
-xdev 없이 전체 스캔/proc 등 오탐·과부하-xdev 사용

10. 실습 체크리스트

[ ] find -perm -0002 로 world-writable 파일을 찾았다
[ ] Sticky 없는 world-writable 디렉터리를 구분했다
[ ] /tmp(1777)가 정상으로 제외되는 것을 확인했다
[ ] world-writable + SUID 를 탐지했다
[ ] -perm -MODE 가 "비트 포함"임을 이해했다
[ ] 발견이 취약점이고 실제 변조는 별도 확인임을 안다

11. 핵심 정리

  • world-writable(other w)은 누구나 수정 가능해 최소 권한 위반이다.
  • 파일은 거의 항상 위험, 디렉터리는 Sticky Bit 유무 로 위험이 갈린다.
  • find -perm -0002로 찾고, ! -perm -1000으로 Sticky 없는 것만 좁힌다.
  • world-writable + SUID 는 즉시 권한 상승 경로로 최우선 조사 대상이다.
  • /tmp(1777)는 정상이므로 Sticky 필터로 오탐을 제거한다.
  • 발견은 취약점이며, 실제 변조는 무결성·로그로 확인한다.

12. 다음 편 예고

다음 글 「47. SUID/SGID 파일 보안 점검」 에서는 SUID/SGID 파일 목록을 기준값으로 관리하고, 비표준 위치·패키지 미소속 SUID를 탐지하는 방법을 다룬다. /tmp에 숨겨진 SUID bash 백도어를 찾아낸다.


참고 자료


시리즈 이동

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

0개의 댓글