状況
古いリリースを削除する本番作業のダブルチェック中。前の手順で、削除対象のパスを /tmp/old_release_path に書き出してある。作業者は次のスクリプトを実行しようとしている。
このスクリプトで最も危ない点は?
OLD_DIR=$(cat /tmp/old_release_path)sudo rm -rf "$OLD_DIR"/*正答
- sudo を付けると、削除後のディレクトリの所有者が root に変わる
- /tmp は再起動で消えるため、パスの保存場所として不適切である
rm -rfではなくrm -rにすれば、確認が出るので安全になる- ファイルが空だと OLD_DIR が空になり、
rm -rf /*が実行される
解説
ファイルが空だったり存在しなかったりすると OLD_DIR は空文字になり、"$OLD_DIR"/* は /* に展開されて、root 権限でサーバ全体を削除しようとする。実行前に中身を表示して確かめるか、${OLD_DIR:?} のように空なら止まる書き方にする。/tmp の保存場所は気になる点だが、消えた場合こそ空変数の危険が現れる。rm -r でも書き込み可能なファイルは確認なしで消える。sudo で所有者は変わらない。
この問題を含む 実務シチュエーション のテストを制限時間つきで解く
実務シチュエーションクイズへ