우분투에서 SetUID 비트가 작동하지 않습니까?

우분투에서 SetUID 비트가 작동하지 않습니까?

SetUID 비트가 설정된 실행 파일이 소유자로 실행되어야 한다고 가정하지만 실제로는 재생할 수 없습니다. 나는 다음을 시도했다.

$ 고양이 준비.sh
cp /bin/bash .
chown 루트.루트 bash
chmod 4770 bash # 확인됨
$ sudo sh prepare.sh
$ ./배쉬
$ 아이디 -u
1000
$ 종료
$
$ 고양이 테스트.c
#include<stdio.h>
#include<unistd.h>
정수 메인(){
    printf("%d,%d\n", getuid(), geteuid());
    0을 반환합니다.
}
$ gcc -o 테스트 test.c
$ chmod 4770 테스트 # 확인됨
$ sudo chown root.root 테스트
$ ./테스트
1000,1000
$ # 왜???

하지만

$ 수
# ./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

첫 번째 경우에는 setuid로 실행되는 것을 좋아하지 않는 Bash입니다.

실제 사용자(그룹) ID와 다른 유효 사용자(그룹) ID로 Bash를 시작하면... 유효 사용자 ID는 실제 사용자 ID로 설정됩니다.

보다:시작 파일에 대한 Bash 매뉴얼, 또한Setuid 비트가 bash에 영향을 미치지 않는 것 같습니다..

두 번째 경우에는 이미 무루처럼 순서가 중요 chmod하고 chown중요합니다.대답했다. 소유자를 변경하면 setuid 비트가 재설정됩니다.

답변3

또한 테스트 실행 파일이 포함된 파일 시스템이 다음과 같이 마운트되었을 수도 있습니다.nosuid옵션; 최신 배포판에서는 기본적으로 에 대해 이 작업을 수행한다고 들었고 이를 적용하는 데 에도 /tmp좋은 주장이 있습니다 . 커널이 setuid 및 setgid 비트를 무시하게 만듭니다./homenosuid모두파일 시스템 내의 실행 파일. (당신이 만들 때 일어나는 관련없는 일예배 규칙서setgid는 영향을 받지 않습니다.)

관련 정보