setuid SUID real uid, effective uid, saved uid

agnusdei·2024년 7월 14일
0

setuid는 Unix 및 Unix 계열 운영 체제에서 프로그램이 실행될 때의 사용자 ID를 변경하는 데 사용되는 기능입니다. 이를 이해하기 위해서는 real UID, effective UID, saved UID가 무엇인지, 그리고 이들 간의 관계를 아는 것이 중요합니다.

UID 개념 설명

  1. Real UID (실제 사용자 ID)
    • 프로그램을 실행한 사용자의 ID입니다.
    • 사용자가 로그인할 때 부여받은 UID로, 프로세스가 실제로 어떤 사용자가 실행했는지를 나타냅니다.
  2. Effective UID (유효 사용자 ID)
    • 프로세스가 실제로 권한을 체크할 때 사용하는 UID입니다.
    • 파일 접근 권한 및 시스템 콜에서 사용됩니다.
    • 일반적으로 setuid 비트가 설정된 프로그램에서는 파일 소유자의 UID로 설정됩니다.
  3. Saved UID (저장된 사용자 ID)
    • setuid 프로그램이 실행될 때, 원래의 effective UID를 저장해두는 UID입니다.
    • 프로그램이 실행 중에 effective UID를 다시 원래 상태로 복구할 수 있도록 합니다.

상호 연관성 및 동작 방식

setuid 비트가 설정된 프로그램은 실행될 때 effective UID를 변경하여 다른 사용자의 권한으로 동작할 수 있게 합니다. 이때 real UID, effective UID, saved UID 간의 상호작용은 다음과 같습니다.

프로그램 실행 시

  1. 프로그램 실행 전:

    • real UID = 사용자 A
    • effective UID = 사용자 A
    • saved UID = 사용자 A
  2. setuid 비트가 설정된 프로그램 실행 후 (프로그램 소유자가 사용자 B):

    • real UID = 사용자 A
    • effective UID = 사용자 B (프로그램 소유자의 UID)
    • saved UID = 사용자 B (프로그램 소유자의 UID)

실행 중 UID 전환

프로그램은 실행 중 setuid를 사용하여 effective UID를 변경할 수 있습니다. 이때 saved UID를 사용하여 원래의 권한으로 돌아갈 수 있습니다.

// 유효 UID를 실제 UID로 변경 (원래 사용자 권한으로 돌아가기)
setuid(getuid());  // getuid()는 실제 UID를 반환

// 유효 UID를 저장된 UID로 변경 (setuid 프로그램 권한으로 돌아가기)
seteuid(saved_uid); // saved_uid는 실행 시 저장된 UID

이러한 호출을 통해 프로그램은 필요에 따라 다른 권한을 사용하면서도, 원래 권한으로 쉽게 복구할 수 있습니다.

예제

  1. 프로그램 시작 시:

    • 사용자 A가 setuid 비트가 설정된 프로그램을 실행합니다. 이 프로그램의 소유자는 사용자 B입니다.
    • 초기 상태:
      • real UID = 사용자 A
      • effective UID = 사용자 A
      • saved UID = 사용자 A
  2. 프로그램 실행 후:

    • 프로그램이 실행되면서 effective UID는 프로그램 소유자인 사용자 B로 변경됩니다.
    • 변경된 상태:
      • real UID = 사용자 A
      • effective UID = 사용자 B
      • saved UID = 사용자 B
  3. 실행 중 권한 변경:

    • 프로그램이 실행 중 특정 작업을 위해 effective UID를 사용자 A로 복구할 수 있습니다.
      • setuid(getuid()) 호출 후:
        • real UID = 사용자 A
        • effective UID = 사용자 A
        • saved UID = 사용자 B
    • 필요 시 다시 프로그램 소유자의 권한으로 돌아갈 수 있습니다.
      • seteuid(saved_uid) 호출 후:
        • real UID = 사용자 A
        • effective UID = 사용자 B
        • saved UID = 사용자 B

이와 같이, real UID, effective UID, saved UID는 서로 연관되어 setuid 프로그램이 다양한 권한으로 작업할 수 있도록 유연성을 제공합니다.

profile
DevSecOps ⚙️ + CTF🚩

0개의 댓글