chmod u+s 명령 관련 문제

chmod u+s 명령 관련 문제

다른 사용자인 동안 루트로 C++ 컴파일된 프로그램을 실행하려고 합니다.

프로그램이 성공적으로 실행되었지만 루트가 아닌 일반 사용자로 실행되었습니다.

그러나 인터넷에서 알 수 있듯이 chmod u+s명령을 사용하면 소유자(제 경우에는 루트)로 실행됩니다.

system(argv[1])프로그램은 명령줄 인수 내부의 모든 것을 실행하는 간단한 줄입니다 .

예를 들어 - whoami루트가 아닌 내 사용자를 반환하는 출력입니다.

또한 내용을 나열하려고 하면 /root"권한이 거부되었습니다"라는 메시지가 나타납니다.

파일의 권한 -

-rwsr-xr-x  1 root     root     16608 Aug 25 15:20 test

이 순간 나는 파일에 대한 권한을 부여하려고 했습니다 4755(행운이 없었습니다).

파일을 옮기는 것도 /root운이 좋지 않았습니다.

답변1

system() 호출은 execl()시스템 호출을 사용하여 새 쉘 프로세스를 생성합니다. 그러나 시스템 호출은 유효 사용자 ID를 무시하고 EPERM 오류(권한 거부)를 반환합니다.

이는 Linux 쉘이 seteuid 비트를 상속하지 않기 때문입니다. 왜? 유효한 사용자 ID를 루트로 사용하여 스크립트를 실행하는 것에 대한 실질적인 우려가 있기 때문입니다. 해당 주제에 대한 자세한 내용은 다음을 참조하세요.여기.

매개변수를 전달하여 유효한 UID에 대해 작동하는 쉘을 실행할 수 있습니다 -p. 매뉴얼 페이지 에서 sh:

-p 개인 uid와 일치하지 않는 경우 유효 uid를 재설정하려고 시도하지 마십시오. 이는 system(3) 또는 popen(3)을 통해 setuid 루트 프로그램의 잘못된 사용을 방지하기 위해 기본적으로 설정되어 있지 않습니다.

물론 이러한 제한은 시스템 호출에는 적용되지 않습니다. 데모로서 이 C 프로그램은 을 사용하여 /root를 나열하려고 시도한 다음 및 시스템 호출을 system()사용하여 동일한 작업을 수행합니다 .opendir()readdir()

사용자 ID가 설정된 루트가 바이너리를 소유한 경우 루트가 아닌 사용자가 프로그램을 실행하면 첫 번째 /root 목록이 실패하고 두 번째 목록( display_dir()works.dll 사용)이 실패하게 됩니다.

#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<dirent.h>
#include<errno.h>

int display_dir(const char *dirname)
{
    DIR *dp = opendir(dirname);
    struct dirent *sd=NULL;
    if (!dp) return(errno);
    while ((sd = readdir(dp)) != NULL)
    {
        printf("%s\n", sd->d_name);
    }
    closedir(dp);
    return 0;
}

int main()
{
    system("ls /root");
    printf("Display returned %d\n", display_dir("/root"));
}

관련 정보