![디렉토리 파일 설명자 dfd의 경우 openat(dfd, "..", ...) 와 같은 상향 탐색을 방지할 수 있습니까?](https://linux55.com/image/180188/%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%20%ED%8C%8C%EC%9D%BC%20%EC%84%A4%EB%AA%85%EC%9E%90%20dfd%EC%9D%98%20%EA%B2%BD%EC%9A%B0%20openat(dfd%2C%20%22..%22%2C%20...)%20%EC%99%80%20%EA%B0%99%EC%9D%80%20%EC%83%81%ED%96%A5%20%ED%83%90%EC%83%89%EC%9D%84%20%EB%B0%A9%EC%A7%80%ED%95%A0%20%EC%88%98%20%EC%9E%88%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
$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
소유자만 탐색할 수 있습니다.