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


9

스크립트에서 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

2
실행 파일을 실행중인 사용자가 아닌 다른 사용자가 실행 파일을 소유하고 있습니까? (setuid는 루트로의 변경을 의미하는 것이 아니라 실행 파일을 소유 한 사용자로의 변경을 의미합니다.)
cjm

PHPLearner 파일의 SUID를 변경하려면 그룹 / 사용자가 필요하다고 생각합니다.
ryekayo

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

7
/ tmp를 마운트하는 데 사용되는 매개 변수가 setuid 프로그램을 금지하기 때문에 프로그램이 내 홈 디렉토리에 있으면 / bunst에는 있지 않은 경우 Ubuntu 14.04 시스템에서 예상대로 작동합니다. 프로그램은 어디에 있습니까?
Mark Plotnick

2
df .마운트 지점을 찾으려면 디렉토리를 입력 한 다음를 누르십시오 mount | grep nameofmountpoint. 거기에 nosuid깃발이 있습니까?
Mark Plotnick

답변:


10

유닉스 / 리눅스 용으로 설계된 대부분의 파일 시스템은 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에 추가되었습니다.


시스템이 사용자가 setuid를 허용하는 파일 시스템을 마운트 할 수 있도록 허용 한 경우, 루트가 되기는 쉽지 않습니다. 1) 실행 파일 만들기 2) 다른 곳 chown root에서 chmod +s3) 마운트 4) 실행 파일 실행
ctrl-alt-delor

1

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

sudo chown 0:0 ./setuid-test

물론 문제는 아닙니다. root 이외의 사용자에게 setuid 프로그램을 가질 수 있습니다. 문제의 시나리오에서 의 UID를 setuid-test표시해야합니다 nobody.
Gilles 'SO- 악마 그만해'

@ 길 당신이 맞아요. 그 setuid를 테스트 디스플레이를 기대 nobody하지root
PHP 학습자

하고 내 파일 소유자 "실행에 대해 setuid 비트가 파일 소유자의 실행 파일을 실행 할 수 있습니다" nobody, 그러므로 내가 기대하는 65534대가로,하지만 난 볼 1000소유자가 누구!
PHP Learner

2
테스트 프로그램이 실행되는 파일 시스템의 마운트 옵션을 확인하십시오. 로 마운트되어 nosuid있으면 프로그램이 작동하지 않을 수 있습니다.
카운터 모드

1
@countermode @MarkPlotnick이 mount | grep /home/me반환합니다. /home/me/.Private on /home/me type ecryptfs (ecryptfs_check_dev_ruid,ecryptfs_cipher=xxx,ecryptfs_key_bytes=16,ecryptfs_unlink_sigs,ecryptfs_sig=0123456789abcdef,ecryptfs_fnek_sig=fedcba9876543210)
PHP Learner
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.