Apache에는 옵션 FollowSymLinks
과 SymLinksIfOwnerMatch
.
Samba에는 다음과 같은 옵션이 있습니다 wide links
.
참고: UNIX 확장이 활성화된 경우 이 매개변수를 켜면 UNIX 클라이언트가 공유 정의에 의해 내보낸 제한된 경로 외부의 파일이나 디렉터리를 가리킬 수 있는 공유에 기호 링크를 생성할 수 있습니다. 이로 인해 공유 외부 영역에 액세스할 수 있습니다. 이 문제로 인해
unix extensions
이 옵션이 켜져 있으면 이 매개변수가 자동으로 비활성화됩니다(로그 파일에 메시지가 표시됨).
allow insecure wide links
두 매개변수 간의 결합을 변경하려면 이 매개변수를 참조하십시오.
경쟁 조건을 통해 Samba 옵션을 우회할 수 있습니까?
그렇지 않다면 Samba가 경쟁 조건을 어떻게 방지할 수 있습니까? 예를 들어, 경쟁 조건을 방지하기 위해 어떤 작업 순서를 사용할 수 있습니까?
답변1
확실히 그렇습니다예전에는취약한. 바라보다CVE-2017-2619.
이것수리하다이 버그에는 열려는 파일이 포함된 디렉터리를 입력하는 open_dir_safely()
데 사용되는 .chdir()
getcwd()
나는 이것이 당신 이 아직 Samba 공유에 있는지 확인하기 위해 를 사용할 수 있다는 것을 의미한다고 생각합니다 . 적어도 이것은 Linux에서는 잘 작동합니다 getcwd()
. Samba가 그 이후에 정확히 무엇을 하는지는 확인하지 못했습니다 chdir()
.
chdir()
프로세스에 여러 스레드가 있으면 전체 프로세스에 영향을 미치므로 좋지 않습니다 :-). Linux 특정 프로그램은 open()
이 플래그 를 대신 사용한 O_PATH
다음 .readlink()
/proc/self/fd/
위의 내용은 파일이 포함된 디렉터리에 대한 보증을 제공할 수 있습니다. 보장하기 위해문서이름을 에 전달할 때 이름은 링크로 확인되지 않습니다 open()
. 이 플래그를 사용할 수 있습니다 O_NOFOLLOW
. 그 경우예그러면 심볼릭 링크가 open()
반환됩니다 ELOOP
. 그런 다음 readlink()
파일을 직접 처리하고 심볼릭 링크를 확인할 수 있습니다. 여기에는 처음부터 프로세스를 반복하는 작업이 포함됩니다. :-).
프로세스를 "너무 많이" 반복해야 하는 경우 실패( ELOOP
다시)를 반환할 수 있습니다. ( 누군가가 멍청한 거지 역할을 하고 과 사이에 파일을 반복적으로 변경하기 때문에 너무 많이 다시 시도해야 하는 경우에도 open(... O_NOFOLLOW)
마찬가지입니다 readlink()
.)
Linux가 아닌 운영 체제에서는 매우 효율적인 운영 체제가 없을 수 있습니다 getcwd()
. 그렇다면 반복을 통해 이를 피할 O_PATH
수 있습니다.getcwd()
모든경로 세그먼트를 사용하려면 O_PATH
+를 사용 O_NOFOLLOW
하고 링크를 수동으로 해결하세요.
앞으로 이 문제는 특정 플래그로 해결될 수 있습니다.AT_PATH_BENEATH 또는 O_BENEATH.