Bash의 인수 또는 파일에서 문자열을 안전하게 읽고 구문 분석합니다.

Bash의 인수 또는 파일에서 문자열을 안전하게 읽고 구문 분석합니다.

저는 최근에 매개변수나 파일에서 변수를 가져오는 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 스크립트에는 명확한 인터페이스가 있어야 하며 입력을 쉽게 확인할 수 있어야 합니다.

관련 정보