rm -rf /*コマンドの危険性

第1回から第3回にかけて、「rm -rf /*」は危険なコマンドだと紹介した。「rm -rf /」であればコマンド側から実行するのは危ないという警告が表示され実行されない。しかし、「rm -rf /*」だとコマンド側からの警告は表示されず、指示通りにシステムを破壊するコマンドが実行されてしまう。実に危険なコマンドである。

サーバの管理者であれば「rm -rf /*」がどれほど危険であるか知っているし、rm *系のコマンドを実行する時は相当に神経質になるはずだ。ましてや、どれほど疲れたら「rm -rf /*」のような危険なコマンドを実行することになるのか、現実には起こりえないような気がする。

では、「rm -rf /*」が実行される可能性が100%ないのかといえば、そんなことはない。以下、意外にも簡単に起こってしまうということを紹介してみたい。

「rm -rf /*」実行へのシナリオ

例えば、サーバで運用しているソフトウェアが生成するデータのチェックや一時ファイルの削除といった処理を行うシェルスクリプトを作成して利用していたとする。次のような感じのシェルスクリプトだ。crontabに登録して1日に1回、負荷の低い時間帯に実行するといったような使い方だ。

アプリケーションのデータチェックと一時ファイル削除を実施するスクリプト

#!/bin/sh
#
# アプリケーションが生成するデータのチェックと一時ファイルの
# クリーンナップ

# アプリケーションディレクトリ
appdir=/usr/home/apps_name
i=$appdir/temp          # アプリ一時ファイルディレクトリ
j=/tmp/__apps_name_?????/temp   # アプリ一時ファイルディレクトリ

# なんらかの処理がずらずらと
# なんらかの処理がずらずらと
# なんらかの処理がずらずらと
# なんらかの処理がずらずらと
# なんらかの処理がずらずらと
# なんらかの処理がずらずらと
# なんらかの処理がずらずらと
# なんらかの処理がずらずらと
# ...略...
# なんらかの処理がずらずらと
# なんらかの処理がずらずらと
# なんらかの処理がずらずらと
# なんらかの処理がずらずらと
# なんらかの処理がずらずらと
# なんらかの処理がずらずらと
# なんらかの処理がずらずらと
# なんらかの処理がずらずらと

# 一時ファイルの削除
rm -rf $i/* $j/*

わかる人が見ればこのシェルスクリプトは実に危ない。特に最後の行が匂う。いずれかの段階で悲惨な未来をもたらすおそれが大いにある。

例えば、アプリケーション側の動作の変更で、/usr/home/apps_name/temp/というディレクトリに一時ファイルを作成しなくなったとしよう。もう稼働してから何年も経っているサービスだ。久しぶりにスクリプトを読んで、次のような変更をするかもしれない。

使わなくなった一時ファイルディレクトリを処理しないように変更したつもりのスクリプト(重大な問題あり)

#!/bin/sh
#
# アプリケーションが生成するデータのチェックと一時ファイルの
# クリーンナップ

# アプリケーションディレクトリ
appdir=/usr/home/apps_name
j=/tmp/__apps_name_?????/temp   # アプリ一時ファイルディレクトリ

# なんらかの処理がずらずらと
# なんらかの処理がずらずらと
# なんらかの処理がずらずらと
# なんらかの処理がずらずらと
# なんらかの処理がずらずらと
# なんらかの処理がずらずらと
# なんらかの処理がずらずらと
# なんらかの処理がずらずらと
# ...略...
# なんらかの処理がずらずらと
# なんらかの処理がずらずらと
# なんらかの処理がずらずらと
# なんらかの処理がずらずらと
# なんらかの処理がずらずらと
# なんらかの処理がずらずらと
# なんらかの処理がずらずらと
# なんらかの処理がずらずらと

# 一時ファイルの削除
rm -rf $i/* $j/*

i=$appdir/tempの行を削除するという変更だ。このシェルスクリプトは最後の行を書き換えるのを見落としている。このまま実行すると、最後の行は次のように解釈されて実行されることになる。

実際にはこのコマンドが実行されることになる

rm -rf /* $j/*

これで詰みだ。書き換えを行ってから初めて動作するcronからの起動で、システム全体のファイルが削除されることになる。

  • rm -rf /*が実行されているUbuntu 18.04 LTSサーバ

    rm -rf /*が実行されているUbuntu 18.04 LTSサーバ

  • rm -rf /*が終わった後。もうファイルとディレクトリがほとんど残っていない

    rm -rf /*が終わった後。もうファイルとディレクトリがほとんど残っていない

気がついた時にはサーバの中身はすっからかんになっており、再起動するともはやシステムは起動してこない。シェルスクリプトを書いた本人ならまだしも、運用が始まると、シェルスクリプトを読んで書き換えるのは別の人ということも珍しくない。こうした状況は日常的に起こる可能性がある。

「rm -r *」には十分に注意すること

シェルスクリプトの中に「rm -r $a/*」といった使い方をみつけたら気をつけたほうがよい。rm *系の記述にも注意が必要だ。シェルスクリプトは作り方にもよるが、編集を間違えると悲惨な結果を生むことも珍しくない。削除系の処理が実行されている場合は、内容をよく読んで理解してから編集することが望まれる。