개발자 Q&A

개발하다 막혔다면? 여기서 질문하세요! 초보부터 고수까지, 함께 고민하고 해결하는 공간입니다. 누구나 자유롭게 질문하고 답변을 남겨보세요!

2025.05.04 10:39

POSIX setgid 문제점에 대한 도움을 부탁드립니다.

목록
  • 깃허브액션도사 19시간 전 2025.05.04 10:39 새글
  • 1
    1
제가 현재 프로세스에 posix_setgid 함수를 사용하여 그룹 ID를 변경하려고 합니다. 그러나 이 함수를 사용한 후에, 다른 사용자가 해당 그룹의 멤버가 되는지 확인하는 방법을 모릅니다.

다음은 제가 시도한 코드입니다.

c

#include 

#include 



int main() {

    pid_t pid;



    pid = fork();

    if (pid == 0) {

        // 자식 프로세스

        if (setgid(1000) == -1) {

            perror("setgid");

            return 1;

        }

        return 0;

    } else if (pid > 0) {

        // 부모 프로세스

        if (getgid() == 1000) {

            printf("자식 프로세스는 gid 1000을 가지고 있습니다.");

        } else {

            printf("자식 프로제스에러");

        }

    } else {

        // fork 실패

        perror("fork");

        return 1;

    }

    return 0;

}



위의 코드에서, 자식 프로세스는 gid 1000을 얻은 후, 부모 프로세스는 자식 프로세스의 gid를 확인하려고합니다. 그러나, 이 방법으로는 자식 프로세스가 어떤 그룹의 멤버인지 알 수 없습니다. 어떻게 하면 가능한지 도와주세요.

    댓글목록

    profile_image
    나우호스팅  19시간 전



    POSIX setgid 함수를 사용하여 그룹 ID를 변경한 후, 다른 사용자가 해당 그룹의 멤버가 되는지 확인하는 방법은 다음과 같습니다.

    1. `getgroups()` 함수를 사용하여 현재 프로세스가 소속된 모든 그룹의 ID를 얻습니다.
    2. `getgrent()` 함수를 사용하여 그룹 정보를 얻습니다.
    3. `getpwuid()` 함수를 사용하여 사용자 정보를 얻습니다.

    다음은 예제 코드입니다.

    #hostingforum.kr
    c
    
    #include 
    
    #include 
    
    #include 
    
    #include 
    
    
    
    int main() {
    
        pid_t pid;
    
        gid_t gid;
    
        struct group *grp;
    
        struct passwd *pwd;
    
    
    
        pid = fork();
    
        if (pid == 0) {
    
            // 자식 프로세스
    
            if (setgid(1000) == -1) {
    
                perror("setgid");
    
                return 1;
    
            }
    
            return 0;
    
        } else if (pid > 0) {
    
            // 부모 프로세스
    
            if (getgid() == 1000) {
    
                printf("자식 프로세스는 gid 1000을 가지고 있습니다.n");
    
            } else {
    
                printf("자식 프로세스에러n");
    
            }
    
    
    
            // 자식 프로세스가 소속된 모든 그룹의 ID를 얻습니다.
    
            gid = getgid();
    
            grp = getgrent();
    
            while (grp != NULL) {
    
                if (grp->gr_gid == gid) {
    
                    printf("자식 프로세스는 gid %d의 그룹에 소속되어 있습니다.n", gid);
    
                    break;
    
                }
    
                grp = getgrent();
    
            }
    
    
    
            // 사용자 정보를 얻습니다.
    
            pwd = getpwuid(getuid());
    
            printf("자식 프로세스의 사용자 이름은 %s입니다.n", pwd->pw_name);
    
    
    
            // 그룹 정보를 얻습니다.
    
            grp = getgrent();
    
            while (grp != NULL) {
    
                if (grp->gr_gid == gid) {
    
                    printf("그룹 이름은 %s입니다.n", grp->gr_name);
    
                    break;
    
                }
    
                grp = getgrent();
    
            }
    
        } else {
    
            // fork 실패
    
            perror("fork");
    
            return 1;
    
        }
    
        return 0;
    
    }
    
    


    이 코드는 자식 프로세스가 소속된 모든 그룹의 ID를 얻고, 그룹 이름을 얻습니다. 또한 사용자 정보를 얻어 사용자 이름을 출력합니다.

    2025-05-04 10:40

  • 개발자 Q&A 포인트 정책
      글쓰기
      50P
      댓글
      10P
  • 전체 16,700건 / 11 페이지

검색

게시물 검색