저는 *NIX 기반 운영 체제를 처음 접했습니다. 나를 혼란스럽게 하는 것 중 하나는 프로세스나 프로그램이 setuid(0)
권한 있는 작업을 수행한 다음 수행하고 일반 uid로 되돌아갈 수 있다는 것입니다.
내 질문은 임의의 프로세스가 루트를 가지지 못하게 하는 *NIX의 메커니즘이 무엇입니까?
간단한 C 프로그램을 작성한다면 어떤 조건에서 setuid(0)
이 호출이 성공하고 어떤 조건에서 실패합니까?
답변1
기본 아이디어는 프로세스가 자신의 권한만 줄일 수 있다는 것입니다. 프로세스는 어떤 권한도 얻지 못할 수 있습니다. 한 가지 예외가 있습니다: 프로세스구현하다setuid 또는 setgid 플래그가 설정된 파일의 프로그램은 이 플래그가 나타내는 권한을 받습니다.
이 메커니즘은 프로그램이 상승된 권한으로 임의 코드를 실행하는 것을 허용하지 않습니다. 상승된 권한으로 실행할 수 있는 유일한 코드는 setuid/setgid 실행 파일입니다.
ID가 0인 루트 사용자는 다른 사용자보다 더 높은 권한을 갖습니다. 사용자 0의 프로세스는 모든 작업을 수행할 수 있습니다. (그룹 0은 특별하지 않습니다.)
대부분의 프로세스는 동일한 권한으로 계속 실행됩니다. 사용자를 로그인하거나 데몬을 시작하는 프로그램은 루트로 시작한 다음 모든 권한을 삭제하고 사용자로서 원하는 프로그램을 실행합니다(예: 사용자의 로그인 셸, 세션 관리자 또는 데몬). Setuid(또는 setgid) 프로그램은 대상 사용자 및 그룹으로 작동할 수 있지만 많은 프로그램은 수행 중인 작업에 따라 호출자의 권한과 자신의 추가 권한 사이를 전환하기 위해 지금 설명할 메커니즘을 사용합니다.
모든프로세스에는 세 개의 사용자 ID가 있습니다.: 이것진짜사용자 ID(RUID),효과적인사용자 ID(EUID) 및저장됨사용자 ID(SUID). 아이디어는 프로세스가 일시적으로 권한을 얻은 다음 더 이상 필요하지 않을 때 이를 포기하고 다시 필요할 때 다시 얻을 수 있다는 것입니다. 비슷한 메커니즘이 있습니다그룹, 실제 그룹 ID(RGID), 유효 그룹 ID(EGID), 저장된 그룹 ID(SGID) 및 보조 그룹이 있습니다. 작동 방식은 다음과 같습니다.
- 대부분의 프로그램은 전체적으로 동일한 실제 UID와 GID를 유지합니다. 주요 예외는 RUID 및 RGID를 루트에서 대상 사용자 및 그룹으로 전환하는 로그인 프로그램(및 데몬 실행 프로그램)입니다.
- 루트 권한이 필요한 파일 액세스 및 작업의 경우 유효한 UID 및 GID를 확인하세요. 권한 있는 프로그램은 권한 있는 작업을 수행하는지 여부에 따라 유효 ID를 전환하는 경우가 많습니다.
- 저장된 ID를 사용하면 유효한 ID 간에 전환할 수 있습니다. 프로그램은 저장된 ID와 실제 ID 간에 유효 ID를 전환할 수 있습니다.
일부 작업을 수행하기 위해 루트 권한이 필요한 프로그램은 EUID가 RUID로 설정된 상태로 실행되는 경우가 많지만 seteuid
권한이 필요한 작업을 실행하기 전에 EUID를 0으로 설정하도록 호출하고 seteuid
나중에 다시 호출하여 EUID를 다시 RUID로 변경합니다. seteuid(0)
당시에는 EUID가 0이 아니더라도 호출을 실행하려면 SUID가 0이어야 합니다.
동일한 메커니즘을 사용하여 그룹 권한을 얻을 수 있습니다. 전형적인 예는 로컬 사용자가 높은 점수를 저장하는 게임입니다. 게임 실행 파일은 setgid 입니다 games
. 게임이 시작되면 EGID가 으로 설정되지만 games
사용자가 일반적으로 허용하지 않는 작업을 수행할 위험이 없도록 다시 RGID로 변경됩니다. 게임에서 최고 점수를 저장하려고 하면 일시적으로 EGID가 로 변경됩니다 games
. 이 방법:
- 고득점 파일에는 일반 사용자에게 없는 권한이 필요하므로, 고득점 파일에 항목을 추가하는 유일한 방법은 게임을 플레이하는 것입니다.
- 게임에 보안 취약점이 있는 경우 발생할 수 있는 최악의 상황은
games
이 그룹에 사용자 권한을 부여하여 높은 점수를 부정할 수 있게 하는 것입니다. - 프로그램이 이 함수를 호출하지 못하게 하는 버그가 게임에 있는 경우
setegid
(예: 게임이 예상하지 않은 파일에 단순히 게임을 쓰게 하는 버그) 이 버그는 높은 점수에 대한 부정행위를 허용하지 않습니다. 게임을 호출하지 않으면 쓰기 권한이 없습니다. 최고 점수 파일을 입력하세요setegid
.
위에서 내가 쓴 내용은 기본적인 전통적인 Unix 시스템을 설명하는 것입니다. 일부 최신 시스템에는 기존 Unix 권한 모델을 보완하는 추가 기능이 있습니다. 이러한 기능은 기본 사용자/그룹 라이브/실제 시스템을 보완하며 때로는 상호 작용합니다. 이러한 추가 기능에 대해 자세히 설명하지는 않지만 Linux 보안 모델의 세 가지 기능을 언급하겠습니다.
- 많은 작업을 수행할 수 있는 권한은 다음을 통해 이루어집니다.능력사용자 ID 0 대신. 예를 들어 사용자 ID를 변경하려면
CAP_SETUID
사용자 ID가 0이 아닌 기능이 필요합니다. 사용자 ID 0으로 실행되는 프로그램은 익숙한 경로를 벗어나지 않는 한 모든 기능을 얻게 되며, 사용자 ID 0으로 실행되는 프로그램은CAP_SETUID
루트 권한을 얻을 수 있으므로 실제로 루트로 실행하는 것과 갖는 것은CAP_SETUID
동일합니다. - 리눅스에는 여러 가지보안 프레임워크이는 프로세스가 사용자 ID 0으로 실행 중이더라도 프로세스가 수행할 수 있는 작업을 제한할 수 있습니다. 일부 보안 프레임워크의 경우 기존 Unix 모델 및 기능과 달리
execve
실행 가능한 메타데이터의 플래그가 아닌 보안 프레임워크의 구성으로 인해 프로세스가 실패할 수 있습니다. - 리눅스는사용자 네임스페이스. 네임스페이스에서 루트로 실행되는 프로세스는 해당 네임스페이스 내에서만 권한을 갖습니다.
답변2
사용자 ID 외에도 프로세스는 유효 사용자 ID와 연결됩니다. setuid 루트 프로그램이 실행되면 su
유효 uid는 0으로 설정되지만 실제 uid는 변경되지 않습니다. 이름에서 알 수 있듯이 효과적인 uid는 권한 확인에 사용되는 uid이며, 실제 uid는 "우리가 실제로 누구인지" 알려줍니다. 유효 uid가 0인 프로세스는 setuid(0)
실제 uid를 0으로 변경하는 호출에 성공할 수 있습니다.
답변3
setuid(some_uid)가 작동하려면 다음 조건이 충족되어야 합니다.
- 실행 파일의 파일은 some_uid 1이 소유해야 합니다.
- 실행 파일에는 setuid 권한이 필요합니다.
다음 명령을 사용하여 Setuid 권한을 부여하거나 제거할 수 있습니다 chmod
.
chmod u+s execuables_file_name
chmod u-s execuables_file_name
s
setuid 권한이 부여되면 실행 권한이 대체되므로 파일 권한을 표시할 때 Setuid 권한이 표시됩니다 .
> ll execuables_file_name
-rwsrwxr-x 1 root root 0 Sep 30 17:23 execuables_file_name*
어떤 이유로 소유자 사용자에게 실행 권한이 없으면 대문자 S로 표시됩니다.
> ll execuables_file_name
-rwSrwxr-x 1 root root 0 Sep 30 17:23 execuables_file_name*
알아채다스크립트는 완전히 다른 짐승입니다.
철저히권한 안내.
1. 프로세스를 시작한 사용자 ID로 변환되면 setuid(some_uid)도 성공합니다.