본문 바로가기

Programming/Linux_Platform

SetUID / SetGID Special File Permissions

출처 : http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=10302&docId=128463841&page=1#answer1


안녕하세요..

 

답변이 될지 모르겠으나 Set UID / Set GID에 대해 설명드리겠습니다.

 

Set UID는 chmod 4000 권한으로 실행되며, Set GID는 chmod 2000 권한으로 실행합니다.

둘다 설정하시려면 6000 권한으로 설정 하시면 됩니다.

( 여기서 000은 일반 퍼미션 이며, 파일 실행권한은 꼭 가지고 있어야 합니다. )

파일 퍼미션 설정이 기본적으로 rwx/rwx/rwx 로 이런 식으로 설정이 되나,

Set UID설정 시 rws/rwx/rwx로 변경.

Set GID설정 시 rwx/rws/rwx로 변경.

둘다 설정 시 rws/rws/rwx로 변경 됨

 



 


Set UID가 설정되어 있는 파일은 Set UID 권한으로 파일이 실행됩니다.

/usr/bin/passwd가 그 대표적인 파일입니다.

 

쉽게 설명드려, 일반 사용자가 자신의 password를 변경해야하는데

Set UID가 설정되어 있지 않는다면, 자신의 password를 변경하지 못하게 됩니다.

 

여기서 중요한 점은 Set UID가 설정되어 있는 파일의 USER가 root면,

이 파일을 실행하는 동안에 root USER로 변신(?)하게 되는데요.

이를 악용하여 해킹이 이루어지기도 합니다.  그래서 퍼미션 변경을 해주시면 보안에 도움이 됩니다.

 

해당 공개 강좌를 소개해 드릴게요. 강좌 꼭 한번 들어보세요.

 

http://www.linux.co.kr/home2/edu/linux_sample.php  : 출처 리눅스 포털


실제로는 syscall 임


/android/android/kernel/kernel/sys.c

SYSCALL_DEFINE1(setgid, gid_t, gid)

{

struct user_namespace *ns = current_user_ns();

const struct cred *old;

struct cred *new;

int retval;

kgid_t kgid;



kgid = make_kgid(ns, gid);

if (!gid_valid(kgid))

return -EINVAL;


new = prepare_creds();

if (!new)

return -ENOMEM;

old = current_cred();


retval = -EPERM;

if (ns_capable(old->user_ns, CAP_SETGID))

new->gid = new->egid = new->sgid = new->fsgid = kgid;

else if (gid_eq(kgid, old->gid) || gid_eq(kgid, old->sgid))

new->egid = new->fsgid = kgid;

else

goto error;


return commit_creds(new);


error:

abort_creds(new);

return retval;

}