「rm -rf /*」を実行してしまった

作成日:2022/07/01
最終更新日:2022/07/01

「rm -rf /*」を実行してしまった

作成日:2022/07/01
最終更新日:2022/07/01

警告

本記事に書かれている内容はシステムに甚大な被害をもたらします。 私は責任を負いかねますので、自己責任の下で試すようにしてください。

概要

本Webサイトを運用しているサーバーを含め、複数台のサーバーに対して以下のコマンドを発行してしまいました。

コマンド1. 実行してはいけないコマンド
sudo rm -rf . /*

幸い、本Webサイトのデータはバックアップしてあったので復旧できましたが、ほかのサーバーはデータが消失してしまいました。 バックアップを取っておけばよかったのですが後の祭りです。 戒めを込め、各サーバーに何が起こったのか検証します。

事故原因

sudo コマンドをつけて実行していたのですが、直前にもsudo コマンドをつけてコマンドを発行していたため、パスワード入力がキャッシュされてしまっていました。 また、コマンド自体もコピー&ペーストで発行していたのですが、コピーしようとした際に半角スペースが入力されてしまったため意図せず今回の事態が引き起こされました。 複数サーバーを同時にメンテナンスしていたことも被害を拡大させてしまった要因です。

検証事項

通常、「rm -rf /」コマンドを発行した際は保護機構が働き、コマンドオプションとして「--no-preserve-root」をつけなければ実行されません。 今回、「rm -rf /*」コマンドが発行されてしまったがためにサーバーが破壊されてしまいました。「*」がつくと保護機構が働きません。

これを、新しく仮想環境上に用意したサーバーで検証します。

検証

「rm -rf /」コマンドの実行

まずは、「*」をつけない場合から検証してみます。

「rm -rf . /」コマンドの実行
図1. 「rm -rf . /」コマンドの実行

コマンドを発行するとエラーがでて実行されません。

「rm -rf . /」コマンドの実行結果
図2. 「rm -rf . /」コマンドの実行結果

やはり、「rm -rf /」相当のコマンドだと実行してしまっても保護機構が働きます。

「rm -rf /*」コマンドの実行

続いて、「*」をつけた場合を検証してみます。

「rm -rf . /*」コマンドの実行
図3. 「rm -rf . /*」コマンドの実行

コマンドの発行直後からエラーメッセージが次々と表示されますが、どんどん破壊されていきます。 先日の状況が脳裏にフラッシュバックしました。

「rm -rf . /*」コマンドの実行結果
図4. 「rm -rf . /*」コマンドの実行結果

エラーがひとしきり出た後、コマンドはほぼ発行できなくなります。

そして何も実行できなくなった
図5. そして何も実行できなくなった

仮想環境上にサーバーを構築していたので、ハードディスクイメージを別環境でmountして確認してみます。 「/bin」、「/sbin」、「/usr」ディレクトリが消失しているのでコマンドが発行できないのも納得です。 「/home」も消失していますし、「/var」以下も「/var/tmp」が残っているだけで空でした。 サルベージできるものもなさそうです。

ディスクの中身
図6. ディスクの中身

所感

「rm -rf /*」コマンドを発行することなんてないと思い込んでいましたが、意図せず発行してしまって甚大な被害を得ました。 対策はいくつか浮かびますが、根本的に発行しないとすることはできなさそうです。 バックアップの重要性を再認識したので、Web上に設置しているものについては少なくともバックアップを取得するようにしようと思います。