Linux open() 시스템 호출 및 폴더 권한

Linux open() 시스템 호출 및 폴더 권한

과정이 있어요루트가 소유한 프로세스에 의해 생성됩니다. 뒤쪽에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()nobodyid

# 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)

물론, 다른 대상 사용자가 그룹에 추가되지는 않습니다.

관련 정보