競合状態からのシェル(またはbash)のコマンドリストの安全性はどれくらいですか?シェルコマンドリストの競合条件
if [ -h "$dir" ]; then
echo 'Directory exists and is a symlink'
exit 1
fi
cd "$dir"
上記のコードは明らかに競合状態になりやすいです:攻撃者がチェックした後、まだそれにディレクトリを変更する前にシンボリックリンクを作成することができます。
||
コマンドリストにも同じことが適用されますか?言い換えれば、以下のコマンドは競争条件に影響されないか、上記と同じルールが適用されますか?エラーメッセージが表示されて
[ -h "$dir" ] || cd "$dir"
:同じ競合状態に対して脆弱ではないでしょう||
を使用して、なぜ
[ -h "$dir" ]
&& { echo 'Directory exists and is a symlink'; exit 1; }
|| cd "$dir"
あなたは、攻撃者がシンボリックリンクを持つ既存のディレクトリを_replace_かもしれない、またはそのS /彼はシンボリックリンクを_create_、またはその両方かもしれないと懸念していますか? –
-hに関するテスト・マンページから:この演算子は、このプログラムの以前のバージョンとの互換性のために保持されます。その存在に頼らないでください。代わりに-Lを使用してください。 –
@WilliamPursell:興味深い... sh(1)の私のマンページはちょうど反対です:»-L fileファイルが存在し、シンボリックリンクであれば真です。この演算子は、このプログラムの以前のバージョンとの互換性のために保持されます。その存在に頼らないでください。代わりに-hを使用してください。«man bash(1)は2つの間に違いは何も言及していません。 – knittl