sudo는 어떻게 작동합니까(setuid 외에)?

sudo는 어떻게 작동합니까(setuid 외에)?

sudo바이너리가 활성화되어 있기 때문에 시작 시 루트로 승격됩니다 setuid. 그러나 /bin/login정확한 권한을 부여 sudo하고 루트가 아닌 사용자로부터 실행하려고 하면 다음 오류가 발생합니다.

No utmp entry.  You must exec "login" from the lowest level "sh"

첫 번째 질문은 이 오류가 무엇을 의미합니까?입니다. 두 번째 질문은 sudo login동일한 사용자로 실행할 때 왜 작동합니까? 입니다. a를 사용하여 루트로 승격하는 것 외에 setuuid다른 기능은 무엇입니까 sudo? 실행 하고 종료 dash하는 간단한 스크립트를 작성했지만 권한이 없는 사용자의 사용자 이름이 반환되었습니다.~/rootwhoami

$ ls -l ./root /usr/bin/sudo
-rwsr-xr-x 1 root root     29 Jul 15 02:40 ./root
-rwsr-xr-x 1 root root 157760 Jan 10  2016 /usr/bin/sudo

$ ./root
unprivileged user

그래서 세 가지 질문이 있습니다.

  1. 어떤 오류가 발생합니까 login?
  2. login와 함께 일하나요 sudo?
  3. 단순 실행 스크립트가 whoami작동하지 않는 이유는 무엇입니까?

답변1

어떤 오류가 발생합니까 login?

소스코드를 검색해 보면 login다음과 같은 구절을 볼 수 있습니다.

amroot = (getuid () == 0);
[...]
utent = get_current_utmp ();
/*
 * Be picky if run by normal users (possible if installed setuid
 * root), but not if run by root. This way it still allows logins
 * even if your getty is broken, or if something corrupts utmp,
 * but users must "exec login" which will use the existing utmp
 * entry (will not overwrite remote hostname).  --marekm
 */
if (!amroot && (NULL == utent)) {
     (void) puts (_("No utmp entry.  You must exec \"login\" from the lowest level \"sh\""));
     exit (1);
}

흥미로운 부분은 마지막에 있는 if 절입니다. getuid()이 오류 메시지 는 가 0이 아니고 utmp 항목이 없을 때 발생합니다. getuid()반품실제 사용자 ID호출 과정. 호출 시 setuid 플래그를 설정 하면 login실제 uid와 유효 uid가 달라집니다. login소스 코드 조각의 주석에서 알 수 있듯이 이 경우에는 "까다롭게" 작업을 수행해야 합니다. 실패하고 언급된 오류가 발생합니다.


login와 함께 일하나요 sudo?

sudosetuid 비트 자체가 설정되어 있으므로 euid와 ruid는 다릅니다. 그러나 sudo는 바이너리를 실행 login하고 실제적이고 효과적인 uid를 대상 사용자에게 설정합니다. 그러면 다시는 실패하지 않을 것입니다.


단순 실행 스크립트가 whoami작동하지 않는 이유는 무엇입니까?

#!스크립트에 shebang 줄()이 있는 것 같습니다. 일어나는 일은 다음과 같습니다. 커널은 실행 파일(귀하의 경우 텍스트 파일)을 열고 텍스트 문서가 아닌 스크립트 이름을 첫 번째 인수로 사용하여 shebang 줄(예: 또는 ) #!에 제공된 인터프리터를 호출합니다 . 대부분의 UNIX 및 Linux 운영 체제는 보안 문제이기 때문에 스크립트를 설정할 때 setuid 비트를 무시합니다./bin/bash/bin/sh

setuid를 설정하는 스크립트를 상상해 보세요. 그런 다음 공격자는 해당 스크립트에 대한 심볼릭 링크를 만들고 해당 스크립트를 호출한 다음 통역사가 심볼릭 링크 뒤에 있는 스크립트를 열기 전에 자신의 스크립트에 대한 심볼릭 링크를 변경할 수 있습니다(이것이 사악한 스크립트입니다).

관련 정보