SetUID 비트가 설정된 실행 파일은 소유자로 실행되어야 한다고 생각하지만 실제로 재현할 수는 없습니다. 나는 다음을 시도했다.
$ catprep.sh cp /bin/bash . chown 루트.루트 bash chmod 4770 bash # 확인됨 $ sudo sh prepare.sh $ ./배쉬 $id-u 1000 $ 종료 $
$ cattest.c #include<stdio.h> #include<unistd.h> 정수 메인(){ printf("%d,%d\n", getuid(), geteuid()); 0을 반환합니다. } $ gcc -o testtest.c $ chmod 4770 테스트# 확인됨 $ sudo chown root.root 테스트 $ ./테스트 1000,1000 $ # 왜요? ? ?
하지만
$su # ./bash #id-u 0 #. /시험 0,0 # 출구 # 출구 $
참고: 마운트 지점이 설정 nosuid
되어 있지 않습니다 noexec
.
Ubuntu 16.04 LTS에서 작동하지 않는 이유를 설명할 수 있는 사람이 있습니까?
답변1
컴파일된 실행 파일의 경우man 2 chown
:
When the owner or group of an executable file are changed by an
unprivileged user the S_ISUID and S_ISGID mode bits are cleared. POSIX
does not specify whether this also should happen when root does the
chown(); the Linux behavior depends on the kernel version.
역방향 chown
및 chmod
주문이 저에게 효과적입니다.
$ sudo chmod 4770 foo
$ sudo chown root:root foo
$ stat foo
File: 'foo'
Size: 8712 Blocks: 24 IO Block: 4096 regular file
Device: 801h/2049d Inode: 967977 Links: 1
Access: (0770/-rwxrwx---) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-04-18 15:15:15.074425000 +0900
Modify: 2017-04-18 15:15:15.074425000 +0900
Change: 2017-04-18 15:15:33.683725000 +0900
Birth: -
$ sudo chmod 4777 foo
$ ./foo
1000,0
답변2
첫 번째 경우 Bash는 setuid로 실행되는 것을 좋아하지 않습니다.
Bash 시작 시 유효 사용자(그룹) ID가 실제 사용자(그룹) ID와 동일하지 않은 경우 ... 유효 사용자 ID는 실제 사용자 ID로 설정됩니다.
바라보다:Bash 시작 파일 매뉴얼, 반품setuid 비트는 bash에 영향을 미치지 않는 것 같습니다..
chmod
chown
두 번째 경우에 중요한 것은 muru가 말했듯 이 합계의 순서입니다.답변됨. 소유자를 변경하면 setuid 비트가 재설정됩니다.
답변3
테스트 실행 파일이 포함된 파일 시스템이 다음을 사용하고 있을 수도 있습니다.nosuid
옵션;최신 배포판에서는 기본적으로 이 작업을 수행한다고 들었습니다. 이를 적용하는 데에도 좋은 주장이 /tmp
있습니다 . 커널이 setuid 및 setgid 비트를 무시하도록 합니다./home
nosuid
모두파일 시스템 내의 실행 파일입니다. (관련되지 않은 작업을 수행할 때 발생합니다.목차setgid는 영향을 받지 않습니다. )