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便利ね。