0 views
1. 개요 및 정의
1.1 한 줄 요약
- 일반 사원이 다른 사원의 사원증을 빌려서 그 사람의 권한으로 출입하고 업무를 처리하는 것과 같음
1.2 공식 정의
- Setuid는 유닉스 및 리눅스 계열 운영체제에서 사용되는 파일 권한 비트 중 하나다.
- 일반적으로 실행 파일은 실행시킨 사용자의 권한으로 작동하지만, Setuid가 설정된 파일은 실행되는 동안 해당 파일의 소유자 권한으로 동작한다.
2. 동작 원리
- 단순 권한을 빌려오는 것을 넘어서 커널 내부에서 프로세스 자격 증명이 어떻게 변환되는지 알아보자
- 리눅스 시스템은 프로세스 권한을 관리하기 위해서 UID 를 세분화해서 관리한다.
2.1 UID의 3가지 종류
- 프로세스가 실행될 때 커널은 다음 3가지 UID를 추적한다.
- Read UID (RUID, 실제 사용자 ID)
- 프로세스를 실제로 실행시킨 사용자의 ID
- 프로그램에 Setuid가 걸려 있어도 RUID는 절대 변하지 않고 로그인한 사용자의 ID를 유지한다.
- Effective UID (EUID, 유효 사용자 ID)
- 실제 접근 권한을 결정하는 ID
- 운영체제가 "지금 이 프로세스가 어떤 권한을 가지고 있는가?"를 판단할 때 사용하는 ID다.
- 파일 읽기/쓰기, 네트워크 포트 점유 등 실제 자원 접근 제어(Access Control)의 척도가 된다.
- 일반적인 경우 RUID 와 EUID는 같지만, Setuid 비트가 활성화된 파일을 실행하는 순간, 커널은 이 값을 파일 소유자의 UID로 덮어쓴다.
- Saved Set-UID (SUID, 저장된 사용자 ID)
- 권한을 일시적으로 낮췄다가 다시 복구할 때 사용하기 위해 저장해두는 ID
- Read UID (RUID, 실제 사용자 ID)
2.2 실행 흐름
passwd명령어를 예로 들어 동작 과정을 설명한다.passwd는/etc/shadow파일을 수정해야 하므로 Root 권한이 필요하다.
- 실행 요청
- 일반 사용자가 /usr/bin/passwd 를 실행한다.
- 커널 검사
- 커널은 파일의 inode 정보를 읽고 Setuid 비트가 설정되어 있음을 확인
- 권한 변경
- RUID: 실행한 사용자 (User) 유지.
- EUID: 파일 소유자 (Root)로 변경.
- 프로세스 수행
- 프로세스는 EUID가 Root이므로
/etc/shadow파일에 쓰기가 가능하다.
- 프로세스는 EUID가 Root이므로
- 종료
- 프로세스가 종료되면 반환된 권한은 사라진다.
Setuid는 바이너리 실행 파일에만 적용되며, 보안상의 이유로 쉘 스크립트에는 일반적으로 무시된다
(운영체제 버전에 따라 상이함).
| 상태 | RUID (Real) | EUID (Effective) | SUID (Saved) | 비고 |
|---|---|---|---|---|
| 실행 전 (Shell) | 1001 | 1001 | 1001 | alice 권한 |
| 실행 직후 (passwd) | 1001 | 0 (Root) | 0 | Setuid 동작 |
| 권한 포기 시 | 1001 | 1001 | 0 | 필요 작업 후 강제 강등 |
3. 사용법 및 구문
3.1 Setuid 확인 방법
-
ls -l명령어를 통해 파일 권한을 확인했을 때, 소유자 실행 권한(x) 자리에s가 표시된다.$ ls -l /usr/bin/passwd -rwsr-xr-x 1 root root 68208 May 28 2020 /usr/bin/passwd # ^ 's'가 있으면 setuid가 설정된 것이다.- 소문자
s- 실행 권한(
x)이 있으면서 Setuid가 설정된 경우 (정상).
- 실행 권한(
- 대문자
S- 실행 권한(
x)은 없는데 Setuid만 설정된 경우 (비정상, 동작 안 함).
- 실행 권한(
- 소문자
3.2. Setuid 설정 방법 (chmod)
-
Setuid 비트는 숫자 모드에서
4000에 해당한다. -
Symbolic Mode (기호 모드)
chmod u+s filename -
Octal Mode (8진수 모드)
# 4xxx: Setuid 설정 # 755: rwxr-xr-x (기본 실행 권한) chmod 4755 filename
3.3. Setuid 제거 방법
chmod u-s filename
# 또는
chmod 0755 filename
Loading comments...