보통의 경우 사용자가 파일을 실행하면 해당 프로세스는 그 사용자의 ID로 실행된다. 그러나 파일에 setuid 비트를 설정해 두면 프로세스는 파일 소유자의 ID로 실행된다.
$ snchoi@snchoi:~$ ls -l `which sleep`
-rwxr-xr-x 1 root root 26984 Feb 7 2022 /usr/bin/sleep
$ snchoi@snchoi:~$ cp /usr/bin/sleep ./mysleep
$ snchoi@snchoi:~$ ls -l ./mysleep
-rwxr-xr-x 1 snchoi snchoi 26984 Jul 4 02:11 ./mysleep
출력에서 보듯이 복사본 mysleep의 소유자는 snchoi 라는 사용자이다.
# 복사본을 루트계정으로 실행
$ snchoi@snchoi:~$ sudo ./mysleep 100
# 다른 터미널 창에서 프로세스 목록 확인
$ snchoi@snchoi:~$ ps ajf
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
1959 2007 2007 2007 pts/1 2180 Ss 1000 0:00 bash
2007 2180 2180 2007 pts/1 2180 R+ 1000 0:00 \\_ ps ajf
1959 1989 1989 1989 pts/0 2177 Ss 1000 0:00 bash
1989 2177 2177 1989 pts/0 2177 S+ 0 0:00 \\_ sudo ./mysleep 100
2177 2178 2178 2178 pts/2 2179 Ss 0 0:00 \\_ sudo ./mysleep 100
2178 2179 2179 2178 pts/2 2179 S+ 0 0:00 \\_ ./mysleep 100
- UID가 0이라는 것은 sudo 프로세스와 mysleep 프로세스 모두 루트 UID 하에서 실행됨을 의미한다.
- 그러나 setuid 비트를 설정하면 상황이 달라진다.
$ snchoi@snchoi:~$ chmod +s ./mysleep
$ snchoi@snchoi:~$ ls -l ./mysleep
-rwsr-sr-x 1 snchoi snchoi 26984 Jul 4 02:11 ./mysleep
# 복사본을 루트계정으로 실행
$ snchoi@snchoi:~$ sudo ./mysleep 100
# 다른 터미널 창에서 프로세스 목록 확인
$ snchoi@snchoi:~$ ps ajf
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
1959 2007 2007 2007 pts/1 2222 Ss 1000 0:00 bash
2007 2222 2222 2007 pts/1 2222 R+ 1000 0:00 \\_ ps ajf
1959 1989 1989 1989 pts/0 2219 Ss 1000 0:00 bash
1989 2219 2219 1989 pts/0 2219 S+ 0 0:00 \\_ sudo ./mysleep 100
2219 2220 2220 2220 pts/2 2221 Ss 0 0:00 \\_ sudo ./mysleep 100
2220 2221 2221 2220 pts/2 2221 S+ 1000 0:00 \\_ ./mysleep 100
- UID를 확인해보면 sudo 프로세스는 여전히 루트 계정으로 실행되지만 mysleep은 루트가 아닌 파일 소유자의 ID로 실행됨을 확인할 수 있다.
- 일반적으로 setuid 비트는 보통의 사용자에게는 없는 어떤 권한을 프로그램에 부여하는 용도로 쓰인다.
- 전형적인 예로 ping 실행파일이다. ping 메시지를 보내려면 원본 네트워크 소켓을 여는 권한이 필요한데, 보통의 사용자에게는 그런 권한이 없다. 그렇다고 보통의 사용자에게 원본 네트워크 소켓을 여는 권한을 부여하는 것은 바람직하지 않다. 대신 ping 실행파일에 setuid 비트를 설정하고 소유자를 루트 사용자로 두는 방법이 많이 쓰인다. 이러면 보통의 사용자도 루트 사용자의 권한으로 ping을 실행할 수 있다. (실제로는 ping이 실제로 모든 권한을 가지고 실행 되지는 않게 하는 몇 가지 단계를 더 거친다.)
- setuid 비트가 설정되어 있고 파일 소유자가 루트여도 프로세스는 루트로 실행되지 않는다. 일단 루트로 실행되어 필요한 능력들만 설정한 후 사용자 ID를 원래의 사용자의 것으로 재설정한다.
setuid가 보안에 미치는 영향
- 스스로 setuid 비트를 설정한 후 루트로 넘어가서 셸을 띄우는 프로그램을 작성하는 것은 아주 간단하다.
- setuid는 권한 확대로 이어지는 위험한 경로가 될 수 있으므로, 일부 컨테이너 이미지 스캐너들은 컨테이너에 setuid 비트가 설정된 파일이 있으면 그 사실을 보고해준다.
'리눅스(Linux)' 카테고리의 다른 글
[Linux] chmod (0) | 2023.07.29 |
---|---|
[Linux] 리눅스 능력 (getcaps) (0) | 2023.07.29 |
우분투 네트워크간 접속, 포트포워딩 (0) | 2020.10.07 |
[리눅스] 사용자 및 그룹관리 & 파일 소유권 & 프로세스 & 패키지 관리 & 쉘스크립트 (0) | 2020.09.08 |
[리눅스] SSH 접속, 포트포워딩, mount, umount, 고정IP로 변경, genisoimage (0) | 2020.09.07 |