setuid(set-user-ID)

YYY·2025년 5월 12일

1. setuid란?

setuid(set-user-ID) 이해

1. setuid란?

  • 정의
    setuid 비트가 설정된 실행 파일을 실행할 때, 해당 프로세스의 Effective UID(EUID) 가 파일 소유자의 UID(보통 root)로 일시 변경됨

  • 예시 : ping (icmp 대부분 root권한으로 실행, 그러나 수정은 안됨 setuid가 적합)

    -rwsr-xr-x 에서 Alice(기타 사용자)는 r-x만 있기 때문에
    읽기(r): 가능
    실행(x): 가능 (실행 시 EUID가 root로 바뀜)
    쓰기(w): 불가 → 저장(덮어쓰기) 시도 시 실패

  • 동작 흐름

    1. 일반 사용자 alice-rwsr-xr-x myprog 실행
    2. 프로세스 생성 시
      • RUID = 1001 (alice)
      • EUID = 0 (root) ← 권한 상승
      • SUID = 1001 (원래 EUID 보관)
    3. myprog 내부에서 root 전용 작업 수행 가능
    4. 실행 종료 → EUID = 1001 (alice)로 복귀
  • 정리
    Real UID: 프로세스를 실행한 실제 사용자

    	Effective UID: 접근 권한을 확인할 때 쓰이는 ID, setuid로 변경 가능
    
    	Saved UID: 원래 EUID를 저장해 두고 나중에 복구할 때 사용

2. setuid 사용하는법

1) 준비: 파일 소유자 변경

setuid 비트는 파일 소유자 권한으로 실행되므로, 먼저 root 소유로 변경해야 합니다.

sudo chown root:root myprog
 

2) setuid 비트 설정

chmod 명령어로 소유자 실행 권한에 +s 옵션을 줍니다.

chmod u+s myprog
# 또는
chmod 4755 myprog

3) 확인

ls -ls 비트가 제대로 적용되었는지 확인합니다.

ls -l myprog
# 출력 예시: -rwsr-xr-x 1 root root ... myprog
  

4) setuid 해제

chmod u-s 파일명 으로 setuid 비트를 제거할 수 있습니다.

chmod u-s myprog

5) 주의사항

  • 쓰기 권한은 여전히 소유자만 가집니다.
  • setuid 프로그램은 보안 취약점이 없도록 코드 검토가 필수입니다.

3. 퍼미션 문자열

- r w s | r - x | r - x
  │      │       │
  │      │       └─ 기타(others)
  │      └─ 그룹(group)
  └─ 소유자(owner)
  • 첫 번째 3글자(rws)가 UID(file owner) 권한

  • 두 번째 3글자(r-x)가 GID(group) 권한

  • 세 번째 3글자(r-x)가 기타 사용자 권한입니다.

4. 소유자·그룹 확인 방법

1) ls -l

$ ls -l filename
-rw-r--r-- 1 alice staff  1234 May 12 12:00 filename
               ↑     ↑
             소유자   그룹

2) stat

$ stat filename
File: ‘filename’
Size: 1234       Blocks: 8          IO Block: 4096 regular file
Device: ...      Inode: ...         Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1001/  alice)   Gid: ( 1002/  staff)
Access: 2025-05-12 12:00:00.000000000 +0900
Modify: 2025-05-12 12:00:00.000000000 +0900
Change: 2025-05-12 12:00:00.000000000 +0900

5. 왜 chmod 777이 아닌가?

  • 0777 (-rwxrwxrwx)
    • 실행 시 EUID = “alice” 그대로 → 권한 상승 불가능
    • 쓰기 권한이 열려 있어 누구나 바이너리 수정 가능 → 보안 취약점
  • 4755 (-rwsr-xr-x)
    • 실행 시 EUID = root로 상승 → root 전용 작업 가능
    • 쓰기 권한은 오직 root(소유자)만 → 무결성 유지

5. 요약

  1. setuid = “이 파일을 실행할 때만” 프로세스 권한을 파일 소유자로 일시 변경
  2. 쓰기 권한(write) 은 별개 → setuid가 있어도 파일 수정 권한은 주어지지 않음
  3. 보안과 기능을 모두 달성하려면: 코드 예제 2 참조
profile
무지렁이 탈출기

0개의 댓글