경쟁 조건을 사용하여 Samba 보안 설정 "와이드 링크"를 우회할 수 있습니까?

경쟁 조건을 사용하여 Samba 보안 설정 "와이드 링크"를 우회할 수 있습니까?

Apache에는 옵션 FollowSymLinksSymLinksIfOwnerMatch.

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.

관련 정보