setuid 루트 바이너리에서 sudo 비밀번호를 묻는 프롬프트


1

with_sudo.bin다음 소스 코드와 함께 setuid 루트 바이너리가 있습니다.

/* with_sudo.c */
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>

int main() {
    printf("\n\n ruid : %d \n euid : %d \n\n", (int)getuid(), (int)geteuid());
    system("/usr/bin/sudo cat /root/key.txt");
    return 0;
}

 

akshay@bluebox ~ $ ls -l with_sudo.bin
-rwsr-sr-x 1 root root 8684 Feb  1 22:09 with_sudo.bin

setuid 루트 바이너리이지만 sudo 비밀번호가 요청됩니다.

akshay@bluebox ~ $ ./with_sudo.bin
ruid : 1000  euid : 0 
[sudo] password for akshay:

sudoin 없이 다른 바이너리를 system()실행하면 수퍼 유저 권한으로 실행됩니다.

/* without_sudo.c */
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>

int main() {
    printf("\n\n ruid : %d \n euid : %d \n\n", (int)getuid(), (int)geteuid());
    system("cat /root/key.txt");
    return 0;
}

 

akshay@bluebox ~ $ ls -l without_sudo.bin
-rwsr-sr-x 1 root root 8677 Feb  1 22:09 without_sudo.bin

akshay @ bluebox ~ $ ./without_sudo.bin

루이 드 : 1000 euid : 0

::: this_is_a_secret_key :::

이 때 Real UID만들어진 0와 함께 Effective UID사용하여 setreuid(geteuid(), 0);, 이진은 비록 sudo는 암호를 묻지 않고 수퍼 유저 권한으로 실행 sudo하였다.

/* with_sudo_ruid_elevated.c */
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>

int main() {
    setreuid(0, geteuid());
    printf("\n\n ruid : %d \n euid : %d \n\n", (int)getuid(), (int)geteuid());
    system("/usr/bin/sudo cat /root/key.txt");
    return 0;
}

나는 한 읽고 그가 EUID특정 작업을 수행하는 프로세스의 권한을 평가하는 데 사용됩니다. 그런 이유 sudo에 근거 sudo는 암호를 입력하라는 메시지가 RUID(가)에도 EUID있다 0?

답변:


3

조금 복잡합니다. 운영 체제 커널 은 프로세스의 유효 UID 및 GID를 사용하여 권한 / 권한을 결정합니다. 그들은 사용된다

  • 사용자 / 그룹 / 기타 규칙에 따라 일반 파일 시스템 작업 (예 : 열기, 링크 / 링크 해제)을 허용 / 금지
  • 새로 생성 된 파일의 소유권 설정
  • 프로세스가 신호를 보낼 수있는 다른 프로세스 결정
  • 프로세스가 파일 시스템을 마운트 및 마운트 해제 할 수 있는지 여부 결정, 날짜 변경, 시스템 종료 등

그리고 아마도 다른 것들. 그러나 프로그램 이 일종의 액세스 / 권한 결정을해야하는 경우 일반적으로 실제 UID 및 GID를 사용해야합니다. with_sudo.c프로그램이 실행될 때 sudo유효 UID는 루트 (0)이고 실제 UID는 사용자 (1000) printf입니다.  그러나 이것은 sudo권한이없는 쉘에서 실행할 경우와 정확히 동일 합니다.   실행될 때마다 sudo 유효 UID는 0이므로 sudo동작 방법을 결정하는 데 사용할 수 없습니다. 실제 UID를 사용하여 실제로 누구를 파악해야하므로에서 할 수있는 작업을 결정할 수 있습니다 sudo. 실제 UID가 0 인 경우에만sudo“실제로”루트이거나 최소한 실제 신원을 확실하게 결정할 수 없다고 결론을 내립니다. 따라서 어떤 제한이 적용되는지 알지 못하며 cat추가 인증을 요구하지 않고 실행 합니다.


어떤 거기에 비 setuid_root의 로 호출 할 때 인증을하라는 메시지를 바이너리 EUID 0및 비 루트는 RUID?
Akshay Krishnan R
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.