$service
디렉토리를 가진 사용자가 있습니다 /srv/$service/subdir
. /srv/$service
모드는 0700이며, 이는 를 통해서만 액세스할 수 있음을 의미합니다 $service
. 이 사용자는 …/subdir
다음 명령을 사용하여 디렉터리 파일 설명자 또는 그 아래의 모든 디렉터리를 열 수 있습니다 .
int fd = open("…/subdir", O_RDONLY | O_CLOEXEC | O_DIRECTORY, 0);
Unix 도메인 소켓을 사용하면 폴더에 액세스할 수 없는 다른 유효한 사용자 ID로 실행되는 다른 프로세스와 파일 설명자를 공유할 수 있습니다. 여태까지는 그런대로 잘됐다.
하지만:홈 디렉토리에서 열려면 다른 프로세스를 호출할 수 있습니다 openat(fd, "../somefile", …)
. 다른 프로세스에서는 이 작업을 수행하지 않는다고 믿어야 합니다.somefile
$service
어떻게이런 일이 발생하지 않도록 할 수 있나요? open()
디렉터리 탐색을 방지하는 첫 번째 호출에서 일부 플래그를 놓쳤습니까 ? fcntl(fd, …)
일부 호출을 사용하여 이 작업을 수행 할 수 있습니까 ? 아니면 다른 방법이 있나요?
답변1
하지만: 또 다른 프로세스[다른 사용자로 실행]열린 홈 디렉토리
openat(fd, "../somefile", …)
에 있는 파일을 호출하는 기능.$service
아니요, 그렇지 않습니다. 이를 수행하려면 fd
상위 디렉토리에 대한 실행 권한이 있어야 하지만 상위 디렉토리 모드에서는 0700
소유자만 탐색할 수 있습니다.