각 프로세스에는 적어도 두 개의 UID 세트 (일반적으로 세 개 이상)가 있습니다. 그 중 하나는 "실제"UID로, 어떤 사용자 소유하다 과정. 다른 하나는 "효과적인"UID로, 허가 그 과정에는있다. Linux 설명은에서 찾을 수 있습니다. 신임장 (7) .
'setuid'프로그램이 시작되면 "유효"UID 만 변경되어 새로운 권한을 갖지만 여전히 알고 있습니다. 누구 그것을 시작했다. (sudo가 setuid 임에도 불구하고 당신이 누군지 알고있는 방법입니다.)
예:
$ sudo cp /bin/id /bin/test-id
$ sudo chmod u+s,g+s /bin/test-id
$ ls -la /bin/test-id
-rwsr-sr-x 1 root root 42K Jan 4 11:59 /bin/test-id*
$ /bin/test-id
uid=1000(grawity) gid=1000(grawity) euid=0(root) egid=0(root) groups=1000(grawity),3(sys),4(adm),10(wheel),100(users)
새로 시작된 프로그램은 이미 루트 권한을가집니다. 예를 들어, setuid 비트를 cat
또는 less
, 모든 사용자는 루트 전용 파일을 읽을 수 있습니다.
프로그램은 두 가지 방향으로이 상태를 바꿀 수 있습니다. 두 가지 방향 모두 UID를 EUID로 변경할 수 있습니다 (완전히 "뿌리가 됨"). 또는 그들은 실제 UID (권한을 삭제하고 "일반"사용자로 돌아가는)로 변경할 수 있습니다. 나는 생각한다. sudo 전자는 수행하지만, 종종 후자를 수행하는 많은 프로그램을 보게됩니다.
참고로 세게 때리다 쉘은 또한 후자를 수행한다. setuid 비트를 /bin/bash
, 그것은 시작시 setuid 권한을 포기할 것이며, ~ 않는 한 그것은 -p
(- 권한 있음) 옵션. bash에서 이걸 볼 수 있습니다. flags.c 과 shell.c .
이것은 중요한 이유는 !
...에서 ftp , 제공된 명령은 직접 실행되지 않습니다. 실제로 쉘을 통해 실행되며 쉘에 적용되는 것은! - 명령에도 적용됩니다. 즉, 쉬 ~에 의해 시작된 프로세스 ftp 실제로 예상대로 setuid 상태 (euid = 0)를 상속 받지만 제공된 명령을 실행하기 전에 반환합니다.
(이것은 입력하는 것을 의미합니다. !/bin/bash
실제로 * 두 개의 쉘 프로세스를 실행합니다 : 첫 번째 프로세스는 올바른 euid를 가지고 있지만 두 번째 프로세스를 시작하기 전에 권한을 삭제합니다.)
이것을 테스트하여 (그리고 무시할 수 있습니다.) ftp 다른 것을 초기 쉘로 사용하려면 다음을 수행하십시오.
$ ls -l /bin/id /bin/test-ftp
-rwxr-xr-x 1 root root 42K Aug 19 12:54 /bin/id*
-rwsr-sr-x 1 root root 137K Jan 4 12:08 /bin/test-ftp*
$ SHELL=/bin/id /bin/test-ftp
ftp> !
uid=1000(grawity) gid=1000(grawity) euid=0(root) egid=0(root) groups=0(root),3(sys),4(adm),10(wheel),100(users)
ftp>
(주의 : 모든 프로그램이 $ SHELL을 보는 것은 아니며, 일부는 항상 / bin / sh를 사용하거나 전혀 쉘을 사용하지 않습니다.)
$PATH
다른 사람을 찾는다.ftp
에있는 것 전에/usr/bin
). (2) SUID 루트가있는 일반 프로그램에서 실제 사용자로 대체 .