저는 최근에 매개변수나 파일에서 변수를 가져오는 bash 스크립트를 작성하고 있습니다. 일부 스크립트는 루트로 실행됩니다(sudo 사용).
제 노트북에 있는 것이므로 이 경우 보안 문제를 일으킬 수 있는 다른 사용자는 없지만...
저는 세상에 공개될 수 있는 스크립트를 작성하고 싶습니다.
아마도 이 질문은 bash에 루트/sudo 및 신뢰할 수 없는 입력/매개 변수와 관련된 어떤 것도 작성하지 말라는 강력한 주장을 제공하는 것일 수 있습니다.
sudoer로 모든 것을 잠그는 것이 부족합니다. 임의의 문자열을 bash 프로그램으로 읽어서 구문 분석하는 방법이 있습니까?아니요Bash가 이를 확장하고 그 과정에서 일부 작업을 수행하도록 허용하시겠습니까?
불량 매개변수를 방어할 수 있는 솔루션이 없습니다.
파일의 경우 방법이 있을 수 있지만 간단하지는 않습니다.
문자열은 읽기를 사용하여 스크립트에 안전하게 입력할 수 있지만 일단 변수에 포함되면 잠재적으로 위험한 변수 확장을 포함하지 않는 문자열에 액세스하는 방법을 찾을 수 없습니다.
나는 루프의 배열에 한 번에 한 문자씩 넣기 위해 read -n 1을 사용하여 파일에서 데이터를 읽을 수 있다고 생각했습니다. 이렇게 하면 모든 것이 제거되지만 나중에 모든 것을 문자별로 다시 조립해야 하는 것은 약간 번거롭습니다.
다음과 같은 입력을 고려하고 있습니다.
'$(rm -rf ./*)' 또는 'eval shutdown -h now'
또는 이와 유사한 것이 입력으로 사용되며 이를 포함하는 변수가 참조될 때 실행됩니다. 스크립트가 루트로 실행되면 이는 실제 문제가 될 수 있습니다!
"실제 프로그래밍 언어를 얻는 것" 외에 이 문제를 해결하는 방법에 대한 아이디어가 있습니까?
답변1
문서에 어떤 정보를 제공해야 하는지 알지 못하면 이 질문에 답하기가 어렵습니다. 여러 사용자가 있는 시스템에 스크립트를 저장한다고 해서 자동으로 보안 문제가 발생하는 것은 아닙니다. 왜 다른 사용자에게 입력을 제공해야 합니까?
그러나 를 통해 파일의 한 줄을 안전하게 읽을 수 있습니다 read -r line
. 그러한 데이터만 필요한 경우에는 foo=bar
를 확인하여 잘못된 문자(또는 구조)가 있는지 쉽게 확인할 수 있습니다 [[ =~ ]]
.
단일 파일로 제한되지 않는 경우 DJB 소프트웨어에서 사용할 수 있는 간단한 솔루션이 있습니다. 즉, 변수당 파일 하나입니다. 그런 다음 변수는 다음을 통해 정의할 수 있습니다.
for varname in ${vars[@]}; do
if [ -f "${path_to_var_files}"/$varname ]; then
eval $varname='"$(cat '"${path_to_var_files}"/$varname"')"'
fi
done
...후행 개행 문자가 중요하지 않은 경우.
sudo에서 실행되는 코드를 최소화하면 많은 문제(해당 사용자가 아닌 시스템 관련)를 해결할 수 있습니다. sudo 스크립트가 파일을 가져오지 못하게 하세요. 사용자 수준 스크립트가 파일을 가져오고 sudo 호출을 하도록 합니다. sudo 스크립트에는 명확한 인터페이스가 있어야 하며 입력을 쉽게 확인할 수 있어야 합니다.