happyso
study with happyso
happyso
전체 방문자
오늘
어제
  • 분류 전체보기 (302)
    • GIT (3)
    • 컴퓨터 기본 개념 (29)
    • 알고리즘 (125)
      • 알고리즘 문제 (115)
      • 알고리즘 개념 (10)
    • Go (2)
    • 클라우드 (54)
      • DevOps (4)
      • Kubernetes(쿠버네티스) (33)
      • AWS (6)
      • CKA (8)
    • 리눅스(Linux) (18)
      • 컨테이너(Container) (8)
    • Front (22)
      • JavaScript (2)
      • React (20)
    • Python (21)
      • Python 웹 크롤링 (11)
      • Django (7)
      • MachineLearning (3)
    • 데이터베이스 (6)
      • MariaDB (2)
      • MongoDB (4)
    • C언어 (5)
    • Trouble Shooting (2)
    • 네트워크 (8)
      • CCNA (5)
    • 보안 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • apply
  • edit
  • 18
  • kubernetes
  • replace
  • 15
  • Patch

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
happyso

study with happyso

리눅스(Linux)

[Linux] 리눅스 setuid, setgid

2023. 7. 28. 23:57

보통의 경우 사용자가 파일을 실행하면 해당 프로세스는 그 사용자의 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
    '리눅스(Linux)' 카테고리의 다른 글
    • [Linux] chmod
    • [Linux] 리눅스 능력 (getcaps)
    • 우분투 네트워크간 접속, 포트포워딩
    • [리눅스] 사용자 및 그룹관리 & 파일 소유권 & 프로세스 & 패키지 관리 & 쉘스크립트
    happyso
    happyso

    티스토리툴바