setuid는 Unix 및 Unix 계열 운영 체제에서 프로그램이 실행될 때의 사용자 ID를 변경하는 데 사용되는 기능입니다. 이를 이해하기 위해서는 real UID, effective UID, saved UID가 무엇인지, 그리고 이들 간의 관계를 아는 것이 중요합니다.
setuid 비트가 설정된 프로그램에서는 파일 소유자의 UID로 설정됩니다.setuid 프로그램이 실행될 때, 원래의 effective UID를 저장해두는 UID입니다.effective UID를 다시 원래 상태로 복구할 수 있도록 합니다.setuid 비트가 설정된 프로그램은 실행될 때 effective UID를 변경하여 다른 사용자의 권한으로 동작할 수 있게 합니다. 이때 real UID, effective UID, saved UID 간의 상호작용은 다음과 같습니다.
프로그램 실행 전:
real UID = 사용자 Aeffective UID = 사용자 Asaved UID = 사용자 Asetuid 비트가 설정된 프로그램 실행 후 (프로그램 소유자가 사용자 B):
real UID = 사용자 Aeffective UID = 사용자 B (프로그램 소유자의 UID)saved UID = 사용자 B (프로그램 소유자의 UID)프로그램은 실행 중 setuid를 사용하여 effective UID를 변경할 수 있습니다. 이때 saved UID를 사용하여 원래의 권한으로 돌아갈 수 있습니다.
// 유효 UID를 실제 UID로 변경 (원래 사용자 권한으로 돌아가기)
setuid(getuid()); // getuid()는 실제 UID를 반환
// 유효 UID를 저장된 UID로 변경 (setuid 프로그램 권한으로 돌아가기)
seteuid(saved_uid); // saved_uid는 실행 시 저장된 UID
이러한 호출을 통해 프로그램은 필요에 따라 다른 권한을 사용하면서도, 원래 권한으로 쉽게 복구할 수 있습니다.
프로그램 시작 시:
setuid 비트가 설정된 프로그램을 실행합니다. 이 프로그램의 소유자는 사용자 B입니다.real UID = 사용자 Aeffective UID = 사용자 Asaved UID = 사용자 A프로그램 실행 후:
effective UID는 프로그램 소유자인 사용자 B로 변경됩니다.real UID = 사용자 Aeffective UID = 사용자 Bsaved UID = 사용자 B실행 중 권한 변경:
effective UID를 사용자 A로 복구할 수 있습니다.setuid(getuid()) 호출 후:real UID = 사용자 Aeffective UID = 사용자 Asaved UID = 사용자 Bseteuid(saved_uid) 호출 후:real UID = 사용자 Aeffective UID = 사용자 Bsaved UID = 사용자 B이와 같이, real UID, effective UID, saved UID는 서로 연관되어 setuid 프로그램이 다양한 권한으로 작업할 수 있도록 유연성을 제공합니다.