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:
sudo
in 없이 다른 바이너리를 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
?
답변
조금 복잡합니다. 운영 체제 커널 은 프로세스의 유효 UID 및 GID를 사용하여 권한 / 권한을 결정합니다. 그들은 사용된다
- 사용자 / 그룹 / 기타 규칙에 따라 일반 파일 시스템 작업 (예 : 열기, 링크 / 링크 해제)을 허용 / 금지
- 새로 생성 된 파일의 소유권 설정
- 프로세스가 신호를 보낼 수있는 다른 프로세스 결정
- 프로세스가 파일 시스템을 마운트 및 마운트 해제 할 수 있는지 여부 결정, 날짜 변경, 시스템 종료 등
그리고 아마도 다른 것들. 그러나 프로그램 이 일종의 액세스 / 권한 결정을해야하는 경우 일반적으로 실제 UID 및 GID를 사용해야합니다. with_sudo.c
프로그램이 실행될 때 sudo
유효 UID는 루트 (0)이고 실제 UID는 사용자 (1000) printf
입니다.
그러나 이것은 sudo
권한이없는 쉘에서 실행할 경우와 정확히 동일 합니다.
실행될 때마다 sudo
유효 UID는 0이므로 sudo
동작 방법을 결정하는 데 사용할 수 없습니다. 실제 UID를 사용하여 실제로 누구를 파악해야하므로에서 할 수있는 작업을 결정할 수 있습니다 sudo
. 실제 UID가 0 인 경우에만sudo
“실제로”루트이거나 최소한 실제 신원을 확실하게 결정할 수 없다고 결론을 내립니다. 따라서 어떤 제한이 적용되는지 알지 못하며 cat
추가 인증을 요구하지 않고 실행 합니다.