과정이 있어요인루트가 소유한 프로세스에 의해 생성됩니다. 뒤쪽에인setguid()를 만들고 setuid()를 호출하고 사용자로 실행합니다.유.
프로세스인파일을 생성해 보세요에프폴더에에프(루트 파일 시스템에서)은 루트가 소유하며 다음 권한을 갖습니다.
drwxrwx--- 2 root root
함수 호출은 다음과 같습니다.
open(path , O_CREAT | O_RDWR , 0660);
명령을 실행하면ps -e -o cmd,uid,euid,ruid,suid,gid,egid,rgid,sgid 결과는 다음과 같습니다.
/my/process 500 500 500 500 500 500 500 500
이는 프로세스를 확인합니다.인루트로 실행이 안되는데 이상하게 사용자로 프로세스가 실행되고 있는데유문서에프폴더 아래에 생성됩니다에프루트 및 해당 그룹 구성원만 쓸 수 있습니다.
-rw-rw---- 1 U U
그럼 파일의 주인은유.
Bash에서 동일한 작업을 수행하려고 하면 예상대로 "Permission Denied" 메시지가 나타납니다.
$ touch /F/f
touch: cannot touch `/F/f': Permission denied
폴더를 설정하면에프권한:
drwx------ 2 root root
그런 다음 open() 호출은 예상대로 "Permission Denied"로 인해 실패합니다.
왜 그럴 수 있지?인루트 그룹에 쓰기 권한을 부여하면 해당 폴더에 파일이 생성되나요?
이것메모이 명령은 모든 uid와 gid가 관련 사용자 ID로 설정되어 있음을 보여줍니다. 어떻게 가능합니까?
그룹 멤버십입니다.뿌리그리고유:
$groups root
root : root
$groups U
U : U G
그래서유가지다G보조 그룹으로
$lid -g root
root(uid=0)
sync(uid=5)
shutdown(uid=6)
halt(uid=7)
operator(uid=11)
$lid -g U
U(uid=500)
$lid -g G
U(uid=500)
이는 다음을 나타냅니다.유예 회원G
답변1
댓글에 언급된 @jdwolf처럼 문제는 보충 세트일 수 있습니다. setgid()
삭제되지 않습니다.
간단한 테스트로서 다음은 GID 및 UID를 호출 하고 변경 한 후 실행하는 ./drop
프로그램입니다 .setregid()
setreuid()
nobody
id
# id
uid=0(root) gid=0(root) groups=0(root)
# ./drop
uid=65534(nobody) gid=65534(nogroup) groups=65534(nogroup),0(root)
제로 그룹도 있습니다. 추가 setgroups(0, NULL)
(앞 setuid()
)하면 그룹이 제거됩니다.
# ./drop2
uid=65534(nobody) gid=65534(nogroup) groups=65534(nogroup)
물론, 다른 대상 사용자가 그룹에 추가되지는 않습니다.