shmat는 selinux가 활성화된 rhel 환경에서 오류(void *) -1을 반환합니다.

shmat는 selinux가 활성화된 rhel 환경에서 오류(void *) -1을 반환합니다.

문서에 따르면 :-

shmflg에 SHM_RDONLY가 지정된 경우 세그먼트는 읽기 위해 연결되며 프로세스에는 세그먼트에 대한 읽기 권한이 있어야 합니다. 그렇지 않은 경우 세그먼트는 읽기 및 쓰기용으로 연결되며 프로세스에는 세그먼트에 대한 읽기 및 쓰기 권한이 있어야 합니다. 쓰기 전용 공유 메모리 세그먼트라는 개념은 없습니다.

따라서 여기서는 위의 명령문에 따라 공유 메모리에 대한 읽기 및 쓰기 액세스를 제공하는 0을 전달합니다.

ipcs 출력:-

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status

0x5304f6ab 98307      root       666        64         1

메모리에 첨부된 C++ 코드

    //Get shared memory for given shm_id
    uint8_t* mem = (uint8_t *) shmat(_shm_id, NULL, 0);
    
    if ((void *) mem == (void *) -1){
       // in selinux enable system I am keep on coming here, mem is alway 0XFFFFFFF..
        return -1;
    }

이상한 점은 shmat 함수에 SHM_RDONLY 플래그를 전달하면 공유 메모리에 대한 권한을 읽고 쓸 수 있음에도 불구하고 올바른 공유 메모리 위치를 얻는다는 것입니다.

여기서 유일한 차이점은 메모리가 루트에 의해 생성되고 다른 사용자(예: user1)에 의해 읽힌다는 것입니다. 그러나 666 권한이 부여되었으므로 이것이 문제가 될 수 있다고 생각하지 않으며 selinux가 여기서 몇 가지 문제를 일으키는지 확실하지 않습니다.

관련 정보