잠시 프로세스 권한으로 넘어가 보겠습니다. SUID 권한 비트가 활성화된 상태에서 passwd 명령을 실행하면 root 로 프로그램이 실행된다고 말씀드렸던 것을 기억하시나요? 맞습니다. 하지만 그렇다고 해서 일시적으로 root 권한을 얻었으니 다른 사용자의 비밀번호를 수정할 수 있다는 의미일까요? 아닙니다, 다행히도 그렇지 않습니다!
이는 Linux 가 구현하는 여러 UID 때문입니다. 모든 프로세스에는 세 가지 UID 가 연결되어 있습니다:
프로세스를 시작하면 해당 프로세스를 실행한 사용자 또는 그룹과 동일한 권한으로 실행됩니다. 이를 유효 사용자 ID라고 합니다. 이 UID 는 프로세스에 접근 권한을 부여하는 데 사용됩니다. 따라서 Bob 이 touch 명령을 실행했다면, 프로세스는 Bob 으로 실행되고 그가 생성한 모든 파일은 그의 소유가 됩니다.
실제 사용자 ID라고 불리는 또 다른 UID 가 있습니다. 이는 프로세스를 시작한 사용자의 ID 입니다. 이들은 프로세스를 시작한 사용자가 누구인지 추적하는 데 사용됩니다.
마지막 UID 는 저장된 사용자 ID입니다. 이는 프로세스가 유효 UID 와 실제 UID 사이를 전환할 수 있도록 하며, 그 반대도 가능합니다. 이는 프로세스가 항상 상승된 권한으로 실행되기를 원하지 않기 때문에 유용합니다. 특정 시점에 특별한 권한을 사용하는 것이 좋은 관행입니다.
이제 passwd 명령을 다시 살펴보면서 이 모든 것을 종합해 봅시다.
passwd 명령을 실행할 때, 유효 UID 는 사용자 ID 입니다. 예를 들어, 지금은 500 이라고 가정해 봅시다. 아, 그런데 passwd 명령에는 SUID 권한이 활성화되어 있다는 것을 기억하시나요? 따라서 이 명령을 실행하면 유효 UID 는 이제 0 이 됩니다 (0 은 root 의 UID 입니다). 이제 이 프로그램은 root 권한으로 파일에 접근할 수 있습니다.
잠시 권한을 맛보고 Sally 의 비밀번호를 수정하고 싶다고 가정해 봅시다. Sally 의 UID 는 600 입니다. 음, 운이 없을 겁니다. 다행히도 프로세스에는 실제 UID 도 있습니다. 이 경우 500 입니다. 프로세스는 사용자 UID 가 500 이라는 것을 알고 있으므로 UID 600 의 비밀번호를 수정할 수 없습니다. (물론, 시스템의 슈퍼유저이고 모든 것을 제어하고 변경할 수 있다면 항상 이 규칙은 무시됩니다).
passwd를 실행했으므로, 실제 UID 를 사용하여 프로세스를 시작하고 파일 소유자의 UID(유효 UID) 를 저장하여 둘 사이를 전환할 수 있습니다. 필요하지 않다면 모든 파일을 root 접근 권한으로 수정할 필요가 없습니다.
대부분의 경우 실제 UID 와 유효 UID 는 동일하지만, passwd 명령과 같은 경우에는 변경됩니다.