`find -exec`를 사용할 때의 보안 문제와 경쟁 조건은 무엇입니까?


14

로부터 findman 페이지 :

-exec command ;
    There are unavoidable security problems
    surrounding use of the -exec action; you should use the
    -execdir option instead.

-execdir command {} +
    Like -exec, but the specified command is run from the
    subdirectory containing the matched file, which is not
    normally the directory in which you started find.  This a much
    more secure method for invoking commands, as it avoids race
    conditions during resolution of the paths to the matched
    files.

이것은 무엇을 의미 하는가? 시작 디렉토리에서 실행시 경쟁 조건이 발생하는 이유는 무엇입니까? 그리고 이러한 보안 위험은 어떻게됩니까?


관련 : find의 출력을 반복하는 것이 왜 나쁜 습관입니까? 그 답은 일부 답변에서 다룹니다.
Stéphane Chazelas

답변:


13

여기 에서 세부 사항을 찾았습니다 .

-exec작업으로 인해 다른 프로그램이 실행됩니다. 당시 고려중인 파일의 이름을 프로그램에 전달합니다. 그런 다음 호출 된 프로그램은 일반적으로 해당 파일에 대한 조치를 수행합니다. 다시 한번, 여기에서 이용 될 수있는 경쟁 조건이 있습니다. 우리는 구체적인 예를 들어

 find /tmp -path /tmp/umsp/passwd -exec /bin/rm

이 간단한 예에서는 삭제할 파일을 하나만 식별하고 삭제를 호출 /bin/rm합니다. find가 -exec조치 를 처리해야한다고 결정한 시점과 /bin/rm명령이 실제로 unlink () 시스템 호출을 실행하여 파일 시스템에서 파일을 삭제하는 시점 사이에 시간 간격이 있기 때문에 문제점이 있습니다 . 이 기간 내에 공격자는 /tmp/umsp 디렉터리의 이름을 바꾸고에 대한 심볼릭 링크로 바꿀 수 있습니다 /etc. /bin/rm찾은 파일과 동일한 파일에서 작업하고 있는지 확인할 방법이 없습니다 . 일단 심볼릭 링크가 설정되면 공격자는 /etc/passwd파일을 삭제하도록 찾게 되는데 이는 실제로 호출 된 명령이 의도 한 효과가 아닙니다.

누구나이 취약점을 악용 할 가능성이 확실하지 않습니다. 그러나 나는 대답이 있다고 생각합니다!


위의 경우, execdir에 처음 CHDIR 것이다 /tmp/umsp명령을 실행, 그래서 이론적으로, 공격자의 재 링크 디렉토리가 .. 아무런 효과가 없을 것입니다 전에 경우 "결정"를 재 연결이 발견 한 후에 일어난 평가할 -exec하지만 전에 rm명령 작업을 할 수 있습니다. 그러나 이것이 왜 차이가 나는지 궁금합니다. 공격자는 사용자가 find명령 을 작성하기로 결정한 후에 다시 링크를 수행 할 수 있습니다.
Otheus

1
@RuiFRibeiro 링크는 명령에 전달되는 인수가 아니며 중간 디렉토리입니다. /tmp/umsp는 디렉토리를 find볼 때 rm실행 되지만 공격을 받으면 디렉토리 가에 대한 심볼릭 링크로 변경되었습니다 /etc. /tmp/umsp/passwd일반 파일이지만 모두 동일하지는 않습니다.
Gilles 'SO- 악의를 멈춰라'

2

-exec위험한 이유 는 사용자가 실행할 프로그램의 전체 이름과 경로를 지정하지 않으면 잠재적으로 잘못된 프로그램을 실행하기 때문입니다.

예:

find /some/path -exec coolprogram

에서 /some/path, 누군가가 또 다른했다 coolprogram, 그것은 나쁜 배우에 대한 모든 데이터를 업로드합니다.

그러나 잠깐, 당신은 그것을 실행하지 않아도 ./coolprogram됩니까? 예, 그러나 일부 사람들은 PATH=.:/bin:whatever현재 디렉토리에서 프로그램을 실행합니다.

이것은 간단하지만 아마도 어떤 경우에는 위험 할 수 있다고 생각합니다. 0 바이트 cpio가 잘못된 디렉토리에 있는 문제를 해결 해야했습니다. cpio디렉토리에서 0 바이트 파일을 실행하는 동안 작동하지 않아 프로그램이 중단되었습니다 .


3
이러한 위험은에 국한되지 않습니다 find -exec. 당신이 .당신의 경로에 넣었 다면 단순히 coolprogram현재 디렉토리에서 실행하는 것은 당신 find이 그것을 사용하든 사용 하지 않든 이미 위험합니다 !
Danny Tuppeny

1
동의하지만, -execdir이 내가 언급 한 상태를 감시하는 것 같습니다.The ‘-execdir’ action refuses to do anything if the current directory is included in the $PATH environment variable. This is necessary because ‘-execdir’ runs programs in the same directory in which it finds files – in general, such a directory might be writable by untrusted users. For similar reasons, ‘-execdir’ does not allow ‘{}’ to appear in the name of the command to be run.
Doug

나는 이야기의 도덕이있는 것 같아요. 당신의 길에 나쁜 생각도 있기 때문에 그것이 거기에 있지 않은지 확인하십시오.
Doug

.길과 {}명령에서 금지 하는 것에 대해 흥미 롭다 . 아마도 미래의 리눅스는 .경로를 완전히 금지 할 것이며 툴은 자체 안전 점검을 구현할 필요가 없습니다! :)
Danny Tuppeny

1
필자가 작성한 코드의 90 %가 잘못 된 것의 5 % 만 잡아내는 것이라고 생각합니다. :)
Doug
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.