私は最近、パラメータやファイルから変数を取得するbashスクリプトを作成しています。一部のスクリプトはrootとして実行されます(sudoを使用)。
私のラップトップにあるので、この場合セキュリティ上の問題を引き起こす可能性がある他のユーザーはいませんが...
私は世界に公開できるスクリプトを作成したいと思います。
おそらくこの質問は、bashにroot / sudoと信頼できない入力/パラメータに関する何も書かないように強力な主張を提供することです。
sudoerですべてをロックすることが不足しています。任意の文字列をbashプログラムに読み込んで解析する方法はありますか?いいえBashがそれを拡張し、その過程でいくつかのタスクを実行することを許可しますか?
不良パラメータを守るための解決策はありません。
ファイルには方法があるかもしれませんが、単純ではありません。
文字列は読み取りを使用してスクリプトに安全に入力できますが、変数に含まれると、潜在的に危険な変数拡張を含まない文字列にアクセスする方法が見つかりません。
私はループの配列に一度に1文字ずつ入れるためにread -n 1を使用してファイルからデータを読み取ることができると思いました。これによりすべてが削除されますが、後ですべてを文字ごとに組み立てる必要があるのは少し面倒です。
次のような入力を考えています。
'$(rm -rf ./*)' または 'eval shutdown -h now'
あるいは、同様のものが入力として使用され、それを含む変数が参照されたときに実行されます。スクリプトがrootとして実行されると、これは実際の問題になる可能性があります!
「実際のプログラミング言語を得ること」に加えて、この問題を解決する方法についてのアイデアはありますか?
答え1
文書にどのような情報を提供するかを知らないと、この質問に答えることは困難です。複数のユーザーがいるシステムにスクリプトを保存しても、自動的にセキュリティ上の問題が発生するわけではありません。なぜ他のユーザーに入力を提供するのですか?
ただし、ファイルの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スクリプトには明確なインターフェースが必要で、入力を簡単に確認できる必要があります。