실행 파일에 대해 setuid가 작동하지 않는 이유는 무엇입니까?

실행 파일에 대해 setuid가 작동하지 않는 이유는 무엇입니까?

스크립트에서 setuid를 활성화하는 데 보안 문제가 있다는 것을 알고 있으므로 기본적으로 비활성화되어 있지만 실행 파일에서는 작동할 것입니다. 이 문서에 설명된 지침에 따라 uid를 출력으로 표시하는 실행 파일을 만들었습니다.쉘 스크립트에 setuid 설정 허용

그러나 실행 전후에 동일한 uid(1000)를 반환합니다 sudo chmod +s ./setuid-test. 이는 setuid가 내 실행 파일에 영향을 미치지 않는다는 것을 의미한다고 생각합니다. 이유와 해결 방법은 무엇입니까?

소스 코드:

#include <stdio.h>
#include <unistd.h>
int main(int argc, char** argv) {
    printf("%d", geteuid());
    return 0;
}

빌드 및 실행

$ gcc -o setuid-test setuid-test.c
$ ./setuid-test
1000
$ sudo chown nobody ./setuid-test; sudo chmod +s ./setuid-test
$ ./setuid-test
1000

실행하면 ls -la다음과 같은 결과를 얻습니다.

me@me:~$ ls -la setuid-test
-rwsrwsr-x 1 nobody me 8572 Aug 19 16:39 setuid-test

답변1

Unix/Linux용으로 설계된 대부분의 파일 시스템은 nosuid속성을 사용하여 마운트할 수 있으며, 이는 이러한 파일 시스템에 있는 setuid 또는 setgid 바이너리가 프로세스의 유효 uid 또는 gid를 변경하는 것을 방지합니다. 일반적으로 "신뢰할 수 없는" 파일 시스템(즉, 관리자가 제어하지 않는 파일 시스템)을 마운트할 때 사용됩니다.

귀하의 경우 사용중인 파일 시스템 유형은 다음과 같이 ecryptfs입니다.askubuntu: 암호화된 홈 디렉토리에서 루트 setuid를 사용하여 바이너리를 실행하는 중에 오류가 발생했습니다.몇 년 전 버전부터 nosuid(및 nodev)는 자동으로 시행됩니다.

다음은 변경 이유에 대한 설명입니다.https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2012-3409:

Vincent Danen 2012-07-20 11:25:56 EDT
setuid-root라고도 알려진 개인 ecryptfs 마운트 헬퍼(/sbin/mount.ecryptfs_private)를 사용하면 권한 없는 로컬 사용자가 사용자 제어 ecryptfs를 마운트할 수 있다고 보고되었습니다. 시스템에서 로컬로 공유합니다. ecryptfs 도우미는 "nosuid" 및 "nodev" 플래그를 사용하여 파일 시스템을 마운트하지 않기 때문에 사용자는 setuid-root 바이너리 및/또는 장치 파일이 포함된 파일 시스템을 마운트하여 권한이 상승할 수 있습니다. 사용자가 시스템에 물리적으로 액세스할 수 있는 경우 USB 장치를 통해 이 작업을 수행할 수 있습니다.
...
필수 MS_NOSUID 및 MS_NODEV 설치 플래그가 버전 99에 추가되었습니다.

답변2

실행 파일의 SetUID 비트를 사용하면 파일에서 실행 파일을 실행할 수 있습니다.소유자(슈퍼유저가 아닙니다). 실행 파일을 루트로 실행하려면 다음을 실행하십시오.

sudo chown 0:0 ./setuid-test

관련 정보