Linuxの rm -rf / で痛い目に合う方法

最近、rm -rf / が話題になってると思ったら、こんな記事があったみたいです。

サーバ業者が” rm -rf / “で全サーバを誤消去、復旧法をQ&Aサイトに尋ねる。実は書籍執筆のための「引っ掛け問題」

今どきのLinuxでは、rm -rf / を出しても削除されないよ、ということです。
試してみましょう。まあ、Dockerでubuntu でよいでしょう。

$ docker run -it --rm ubuntu /bin/bash
root@231af227f862:/# rm -rf /
rm: it is dangerous to operate recursively on '/'
rm: use --no-preserve-root to override this failsafe
root@231af227f862:/#
root@231af227f862:/# dpkg -S /bin/rm
coreutils: /bin/rm
root@231af227f862:/# dpkg -s coreutils
Package: coreutils
Essential: yes
Status: install ok installed
Priority: required
Section: utils
Installed-Size: 6024
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Architecture: amd64
Multi-Arch: foreign
Version: 8.21-1ubuntu5.4
Replaces: mktemp, timeout
Pre-Depends: libacl1 (>= 2.2.51-8), libattr1 (>= 1:2.4.46-8), libc6 (>= 2.17), libselinux1 (>= 1.32)
Conflicts: timeout
Description: GNU core utilities
 This package contains the basic file, shell and text manipulation
 utilities which are expected to exist on every operating system.
 .
 Specifically, this package includes:
 arch base64 basename cat chcon chgrp chmod chown chroot cksum comm cp
 csplit cut date dd df dir dircolors dirname du echo env expand expr
 factor false flock fmt fold groups head hostid id install join link ln
 logname ls md5sum mkdir mkfifo mknod mktemp mv nice nl nohup nproc od
 paste pathchk pinky pr printenv printf ptx pwd readlink rm rmdir runcon
 sha*sum seq shred sleep sort split stat stty sum sync tac tail tee test
 timeout touch tr true truncate tsort tty uname unexpand uniq unlink
 users vdir wc who whoami yes
Homepage: http://gnu.org/software/coreutils
Original-Maintainer: Michael Stone <mstone@debian.org>

なるほどね。今どきの rmはcoreutils に含まれていて、このrmはこういうメッセージを出して、/ を容易に rm できないようにしているんですね。

だが待ってほしい。レンタルサーバって、Linuxだけじゃないし、Linuxでも普通の構成じゃないかもしれないじゃないか。
ということで、普通じゃない構成だけど、ありそうな例を挙げてみよう。

root@231af227f862:/# apt install busybox-static
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
  busybox-static
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 999 kB of archives.
After this operation, 2032 kB of additional disk space will be used.
0% [Connecting to archive.ubuntu.com]
省略
root@231af227f862:/# ln /bin/busybox /usr/local/bin/rm
root@231af227f862:/# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
root@231af227f862:/# type -a rm
rm is /usr/local/bin/rm
rm is /bin/rm
root@231af227f862:/# /usr/local/bin/rm --help
BusyBox v1.21.1 (Ubuntu 1:1.21.0-1ubuntu1) multi-call binary.

Usage: rm [-irf] FILE...

Remove (unlink) FILEs

        -i      Always prompt before removing
        -f      Never prompt
        -R,-r   Recurse

BusyBox は、Coreutilsなど標準UNIXコマンドで重要な多数のプログラムを単一の実行ファイルに「詰め込んで」提供する、特殊な方式のプログラムである」 とWikipediaに書いてます。レンタルサーバでOSサイズを小さくしたい場合にbusyboxを使う場面はありそうです。
上記例では、busyboxから/usr/local/bin/rm にlinkをはりました。上記の環境ではrmとを実行するとき、/usr/local/bin/rmが優先実行されています。
さて、この状態で rm -rf /をやるとどうなるか?試してみましょう。

root@231af227f862:/# rm -rf /
省略
rm: can't remove '/sys/hypervisor': Read-only file system   
rm: can't remove '/sys': Device or resource busy
rm: can't remove '/': Device or resource busy
root@231af227f862:/# ls
bash: ls: command not found
root@231af227f862:/# echo *
dev etc proc sys
root@231af227f862:/# ps
bash: ps: command not found
root@231af227f862:/#

ということで、read-only mount されている場所を除いて、削除されました。
/bin も削除されているので、ls も ps も聞きませんね。bashも現在起動中のプロセスだけなので、 bashの組み込みコマンド(echoなど ) しか使えない状態です。

ということで、Linuxだとrm -rfは安全かもしれないけど絶対安全じゃないぞ、というお話でした。

なお、本番環境では絶対やるなよ?とだけ言っておきます。こういうとき、Docker便利ね。

Follow me!

Leave a Reply

Your email address will not be published. Required fields are marked *