스크립트를 실행할 때 쉘 스크립트(bash 스크립트)의 $0 매개변수를 명시적으로 변경할 수 있습니까?
다음 스크립트를 고려해보세요.
readonly SCRIPT_HELP="$(cat <<EOF
Usage: $(basename "$0") [-h]
EOF
)"
echo "${SCRIPT_HELP}"
$(basename...
일부 사용자 제공 코드(잠재적으로 유해함)로 평가를 수행하기 위해 이 bash 스크립트에 인수 0으로 다른 것을 전달할 수 있습니까 ?
일반적으로 특정 쉘 스크립트에서 매개변수 0이 적절하게 삭제되지 않는다는 사실을 이용하는 것이 가능합니까?
답변1
$0
스크립트 호출자가 원하는 것은 무엇이든 될 수 있습니다. 이는 호출자가 어디든 복사하거나 링크할 수 있는 스크립트의 경로입니다.
그러나 스크립트가 호출자보다 더 많은 권한으로 실행되지 않는 한 이는 그 자체로는 취약점이 아닙니다. 스크립트 실행 파일에 권한이 없으면 호출자는 다른 프로그램을 실행할 수 있습니다. 호출자 자신에게 권한이 있고 다른 호출자를 전달하도록 설득될 수 있는 경우 $0
.
스크립트가 권한으로 실행되는 경우 상황은 $0
권한 상승에 사용되는 방법에 따라 달라집니다. setuid 실행 파일을 가리키는 심볼릭 링크를 통해 호출되는 경우 스크립트는 $0
임의적일 수 있습니다 (그러나 대부분의 시스템은 setuid 실행 파일을 거부합니다).
이 특별한 경우 대부분의 경우 보안 관련 사항이 부족함에도 불구하고 스크립트에서 임의의 $0
.큰따옴표를 사용 "$0"
하면 값이 있는 그대로 사용됩니다(따옴표가 없으면 $0
와일드카드 패턴 목록으로 처리됨). 그러나 basename
명령이 값을 매개변수로 처리하는 경우 값이 로 시작하는지 여부에 따라 다르게 처리됩니다 -
. 값이 a -
(뿐만 아니라 -
)로 시작하는 경우 이는 옵션입니다. 적어도 GNU의 경우 basename
옵션이 아닌 인수는 필수이므로 다음으로 시작하는 단일 인수로 호출하면 -
오류가 발생합니다. 하지만이것은 다른 명령의 경우 더 큰 문제입니다.. 로 시작하는 값을 포함하여 임의의 값을 처리하려면 인수 -
앞에 다음 옵션이 더 이상 없음을 나타냅니다 .--
basename -- "$0"
답변2
$0
그것이 무엇인지 결정하는 것은 사소한 일입니다. 링크를 만드세요:
$ cat foo.sh
#! /bin/bash
readonly SCRIPT_HELP="$(cat <<EOF
Usage: $(basename "$0") [-h]
EOF
)"
echo "${SCRIPT_HELP}"
$ ./foo.sh
Usage: foo.sh [-h]
EOF
$ ln -s foo.sh bar.sh
$ ./bar.sh
Usage: bar.sh [-h]
EOF
이 특별한 경우에는 아니요. 큰 이점을 얻기 위해 악용될 수는 없다고 생각합니다. 사용될 때 참조 "$0"
되며 SCRIPT_HELP
(중첩된 명령 대체 및 여기 문서에서 참조되지만 여전히 참조됨) eval
편집되지 않습니다.
$ ln -s ./foo.sh '"; echo rm -rf ~; echo"'
$ ./\"\;\ echo\ rm\ -rf\ \~\;\ echo\"
Usage: "; echo rm -rf ~; echo" [-h]
EOF