리눅스] setuid

2017.06.09 07:00




이전 블로그 글에서 파일의 권한(퍼미션)과 chmod 명령어로 퍼미션을 변경하는 방법에 대해 정리했다. 








이번에는 일반적인 읽기(r), 쓰기(w), 실행(x)의 권한과는 조금 다른 setuid 명령어에 대해 정리한다. 





유닉스 계열에서 파일의 실행은 소유자가 설정한 퍼미션에 따라 그룹(g)이나 기타 사용자(o)가 파일을 읽거나 실행할 수 있기도 하고, 권한이 없는 경우 파일을 읽기, 쓰기, 실행을 할 수 없다. 



특별한 경우 파일의 setuid 비트가 설정된 경우 파일의 소유자의 권한으로 파일을 실행시킬 수 있다. 


사용자 A가 만든 파일의 퍼미션을 755(rwx r-x r-x)을 준 경우 다른 사용자가 실행을 할 수 있다. 이와 별개로 이 파일의 setuid 비트를 활성화하면 다른 사용자들이 사용자 A의 자격으로 실행시킬 수 있게된다. 



setuid 비트를 활성화시키리면 "chmod 4755" 처럼 1000자리에 4를 설정하면된다. 

(기호문자열을 사용할 경우 "u+s" )


이렇게 setuid를 설정하면 소유자의 실행 권한(x) 부분이 x대신 s로 변경된다. 







위 그림에 나오는 setuid_test 실행 파일의 내용은 udi와 euid를 출력하는 간단한 프로그램이다. 




루트 소유인 이 프로그램에 setuid를 설정하고 실행하면 사용자에 따라 uid는 달라져도 euid는 모두 root와 같은 0으로 나타난다. 



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
[root@centos6 /home/test]#cat setuid_test.c
#include <stdio.h>
 
 
main() {
    printf("현재 uid : %d \n", getuid());
    printf("현재 euid : %d \n", geteuid());
}
 
'uid와 euid를 출력하는 프로그램 '
 
 
[root@centos6 /home/test]#gcc -o setuid_test setuid_test.c
' 컴파일 '
 
[root@centos6 /home/test]#ls -l setuid_test
-rwxr-xr-x. 1 root root 6754 2017-06-06 23:41 setuid_test
 
[root@centos6 /home/test]#chmod 4755 setuid_test
' setuid 설정 '
 
 
[root@centos6 /home/test]#ls -l setuid_test
-rwsr-xr-x. 1 root root 6754 2017-06-06 23:41 setuid_test
' 소유자의 x가 s로 변경 ' 
 
 
[root@centos6 /home/test]#./setuid_test 
현재 uid : 0 
현재 euid : 0 
' root의 uid와 euid '
 
 
[root@centos6 /home/test]#su test01
[test01@centos6 /home/test]$./setuid_test 
현재 uid : 500 
현재 euid : 0 
' test01 계정으로 변경해서 실행 '
 
 
[test01@centos6 /home/test]$su test02
[test02@centos6 /home/test]$./setuid_test 
현재 uid : 503 
현재 euid : 0 
' test02 계정으로 변경해서 실행 '
cs




setuid 비트를 제거하려면 "chmod 0744 " 처럼 1000자리를 0으로 셋팅하거나 "chmod u-s"로 권한을 제거해주면 된다.





덧. 


교재나 구글링으로 찾아보면 setuid를 이용해서 루트 쉘을 획득하는 실습 내용을 보면 

위에 나온 setuid_test.c 소스 코드 맨 아래 system("/bin/sh"); 또는 system("/bin/bash"); 코드를 추가해서 root 의 쉘 권한을 획득할 수 있는걸로 나오는데 실제 해보면 안된다. 

아마 쉘 버전이 아주 낮은 경우는 가능할지 모르지만 요즘 배포되는 쉘들은 이 보안 문제를 패치한듯 싶다. 





또루아빠 Linux, Unix , , , , , , ,