findutils 매뉴얼에서 :
예를 들어이 두 명령과 같은 구성
# risky find -exec sh -c "something {}" \; find -execdir sh -c "something {}" \;
매우 위험합니다. 그 이유는 '{}'이 세미콜론이나 쉘에 특수한 다른 문자를 포함 할 수있는 파일 이름으로 확장 되었기 때문입니다. 예를 들어 누군가 파일
/tmp/foo; rm -rf $HOME
을 작성하는 경우 위의 두 명령으로 누군가의 홈 디렉토리를 삭제할 수 있습니다.따라서 신뢰할 수없는 데이터 (예 : 파일 이름)를 인수로 해석 할 명령 (예 : 'sh')으로 명령을 해석하는 명령을 실행하지 마십시오.
셸의 경우이 문제에 대한 영리한 해결 방법이 있습니다.
# safer find -exec sh -c 'something "$@"' sh {} \; find -execdir sh -c 'something "$@"' sh {} \;
이 방법으로 모든 문제를 피할 수는 없지만 공격자가 선택한 데이터를 셸 명령의 텍스트로 대체하는 것보다 훨씬 안전합니다.
- 에
find -exec sh -c "something {}" \;
대한 교체{}
가 인용되지 않아 단일 문자열로 취급되지 않는 문제의 원인 입니까? 솔루션
find -exec sh -c 'something "$@"' sh {} \;
에서first
{}
가 대체되었지만{}
인용되지 않았으므로"$@"
원래 명령과 동일한 문제가 있습니까? 예를 들어,"$@"
확장하는 것"/tmp/foo;"
,"rm"
,"-rf"
,와"$HOME"
?왜
{}
탈출하거나 인용하지 않습니까?
- 동일한 종류의 문제와 해결책이 적용
sh -c
되는 다른 사례 (여전히 또는없는 경우,find
필요에 따라 또는 필요하지 않은 경우도 있음)를 제시 할 수 있습니까? 가능한 한 작은 산만? `bash -c`에 의해 실행되는 명령에 인수를 제공하는 방법을 참조하십시오
감사.