AWS Lambdaで「rm -rf /*」を実行してみた

AWS Lambdaで「rm -rf /*」を実行してみました。最大メモリサイズ & 最大タイムアウト値でもrm -rf /*は完了しないという悲しい結果に終わってしまいました。
2021.12.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWS CloudShellで試したら次は

こんにちは、OS破壊おじさんの のんピ(@non____97)です。

皆さんはOSを破壊したことはありますか? 以下記事の通り、私はあります。

AWS CloudShellで試したのであれば、次はAWS Lambdaですよね? ということで、AWS Lambdaで「rm -rf /*」を実行してみます。

いきなりまとめ

  • Lambda関数でもrm -rf /*は実行できる
  • ただし、Lambda関数から実行できるコマンドにsudosuコマンドがないため、rootユーザーでrm -rf /*は実行できない
  • 以下の構成でも15分以内にrm -rf /*は完了しなかった
    • ランタイム : Node.js 14.x
    • アーキテクチャー : arm64
    • メモリ : 10124 MB
    • タイムアウト値 : 15分

何故試そうと思ったのか

そこにコマンド実行できる環境があるからです。

Lambda関数で『rm -rf /*』とか何言っているんだ?」と思う方もいらっしゃるかもしれません。まず、以下記事で紹介している通り、Lambda関数はFirecracker上のmicroVMで実行されます。加えてNode.jsやPythonなどはOSコマンドが実行できます。よって、Lambda関数でもrm -rf /*は実行できると考えました。

お別れの下準備

試しに以下のようなコードのLambda関数を作成しました。(ランタイムはNode.js 14.xで、アーキテクチャーはarm64です)

const { execSync } = require("child_process")

exports.handler = async (event) => {
    console.log(`pwd : ${execSync("pwd").toString()}`)
    console.log(`cat /etc/system-release : ${execSync("cat /etc/system-release").toString()}`)
    console.log(`cat /etc/os-release : ${execSync("cat /etc/os-release").toString()}`)
    console.log(`whoami : ${execSync("whoami").toString()}`)
    console.log(`dh -h : ${execSync("df -h").toString()}`)
    console.log(`ls -la / : ${execSync("ls -la /").toString()}`)
    console.log(`ls -la /usr/bin : ${execSync("ls -la /usr/bin").toString()}`)
};

OSコマンドを実行するためのChild process はNode.jsの標準モジュールなので、別途Child processをインストールしたLambda Layersを作ったり、Lambda関数のコードとnode_modulesをzipで固めてアップロードする必要はありません。

こちらのLambda関数を実行した際のログは以下の通りです。Lambda関数がAmazon Linux 2上で動作していることが分かります。

2021-12-20T10:39:41.759Z	495ea48e-2989-4491-b80d-6b7193dd1e3a	INFO	pwd : /var/task

2021-12-20T10:39:41.820Z	495ea48e-2989-4491-b80d-6b7193dd1e3a	INFO	cat /etc/system-release : Amazon Linux release 2 (Karoo)

2021-12-20T10:39:41.860Z	495ea48e-2989-4491-b80d-6b7193dd1e3a	INFO	cat /etc/os-release : NAME="Amazon Linux"
VERSION="2"
ID="amzn"
ID_LIKE="centos rhel fedora"
VERSION_ID="2"
PRETTY_NAME="Amazon Linux 2"
ANSI_COLOR="0;33"
CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2"
HOME_URL="https://amazonlinux.com/"
VARIANT_ID="202112090959-2.0.673.0"
VARIANT_ID="202112091006-al2.694.0"

2021-12-20T10:39:41.920Z	495ea48e-2989-4491-b80d-6b7193dd1e3a	INFO	whoami : sbx_user1051

2021-12-20T10:39:41.980Z	495ea48e-2989-4491-b80d-6b7193dd1e3a	INFO	dh -h : Filesystem                                                       Size  Used Avail Use% Mounted on
/mnt/root-rw/opt/amazon/asc/worker/tasks/rtfs/nodejs14.x-amzn-2  9.8G  3.8G  6.0G  40% /
/dev/vdb                                                         1.5G   14M  1.4G   1% /dev
/dev/vdd                                                         526M  872K  514M   1% /tmp
/dev/root                                                        9.8G  3.8G  6.0G  40% /etc/passwd
/dev/vdc                                                         128K  128K     0 100% /var/task

2021-12-20T10:39:42.079Z	495ea48e-2989-4491-b80d-6b7193dd1e3a	INFO	ls -la / : total 56
drwxr-xr-x  1        12569 users 4096 Dec 12 15:35 .
drwxr-xr-x  1        12569 users 4096 Dec 12 15:35 ..
lrwxrwxrwx  1 root         root     7 Dec  9 10:01 bin -> usr/bin
dr-xr-xr-x  2 root         root  4096 Apr  9  2019 boot
drwxr-xr-x  2 root         root  4096 Dec 20 12:22 dev
drwxr-xr-x 29 root         root  4096 Dec  9 10:01 etc
drwxr-xr-x  2 root         root  4096 Apr  9  2019 home
lrwxrwxrwx  1 root         root     7 Dec  9 10:01 lib -> usr/lib
lrwxrwxrwx  1 root         root     9 Dec  9 10:01 lib64 -> usr/lib64
drwxr-xr-x  2 root         root  4096 Apr  9  2019 media
drwxr-xr-x  2 root         root  4096 Apr  9  2019 mnt
drwxr-xr-x  2 root         root  4096 Apr  9  2019 opt
dr-xr-xr-x 70 root         root     0 Dec 20 13:10 proc
dr-xr-x---  2 root         root  4096 Apr  9  2019 root
drwxr-xr-x  2 root         root  4096 Dec 16 17:14 run
lrwxrwxrwx  1 root         root     8 Dec  9 10:01 sbin -> usr/sbin
drwxr-xr-x  2 root         root  4096 Apr  9  2019 srv
dr-xr-xr-x  2 root         root  4096 Apr  9  2019 sys
drwx------  2 sbx_user1051   990 4096 Dec 20 13:10 tmp
drwxr-xr-x 13 root         root  4096 Dec  9 10:01 usr
drwxr-xr-x  1        12569 users 4096 Dec 12 15:35 var

2021-12-20T10:39:42.122Z	495ea48e-2989-4491-b80d-6b7193dd1e3a	INFO	ls -la /usr/bin : total 13492
dr-xr-xr-x  2 root root    4096 Dec  9 10:01 .
drwxr-xr-x 13 root root    4096 Dec  9 10:01 ..
-rwxr-xr-x  1 root root   70024 Jan 23  2020 [
-rwxr-xr-x  1 root root      29 Jul 15  2020 alias
-rwxr-xr-x  1 root root   69832 Jan 23  2020 arch
lrwxrwxrwx  1 root root       4 Dec  9 10:01 awk -> gawk
-rwxr-xr-x  1 root root   70008 Jan 23  2020 base64
-rwxr-xr-x  1 root root   69864 Jan 23  2020 basename
-rwxr-xr-x  1 root root 1037712 Jul 15  2020 bash
lrwxrwxrwx  1 root root      10 Dec  9 10:01 bashbug -> bashbug-64
-rwxr-xr-x  1 root root    6960 Jul 15  2020 bashbug-64
-rwxr-xr-x  1 root root      26 Jul 15  2020 bg
-rwxr-xr-x  1 root root    1638 Sep 30 20:24 ca-legacy
lrwxrwxrwx  1 root root       3 Dec  9 10:01 captoinfo -> tic
-rwxr-xr-x  1 root root   70360 Jan 23  2020 cat
-rwxr-xr-x  1 root root    3283 Sep 28 16:13 catchsegv
-rwxr-xr-x  1 root root      26 Jul 15  2020 cd
-rwxr-xr-x  1 root root   71016 Jan 23  2020 chcon
-rwxr-xr-x  1 root root   70848 Jan 23  2020 chgrp
-rwxr-xr-x  1 root root   70744 Jan 23  2020 chmod
-rwxr-xr-x  1 root root   70904 Jan 23  2020 chown
-rwxr-xr-x  1 root root   69904 Jan 23  2020 cksum
-rwxr-xr-x  1 root root   68736 Sep 19  2019 clear
-rwxr-xr-x  1 root root   70064 Jan 23  2020 comm
-rwxr-xr-x  1 root root      31 Jul 15  2020 command
-rwxr-xr-x  1 root root  204224 Jan 23  2020 cp
-rwxr-xr-x  1 root root   70336 Jan 23  2020 csplit
-rwxr-xr-x  1 root root   70128 Jan 23  2020 cut
-rwxr-xr-x  1 root root   70264 Jan 23  2020 date
-rwxr-xr-x  1 root root  136368 Jan 23  2020 dd
-rwxr-xr-x  1 root root  137808 Jan 23  2020 df
-rwxr-xr-x  1 root root  538520 Jul 31  2018 dgawk
-rwxr-xr-x  1 root root  138136 Jan 23  2020 dir
-rwxr-xr-x  1 root root   69944 Jan 23  2020 dircolors
-rwxr-xr-x  1 root root   69840 Jan 23  2020 dirname
-rwxr-xr-x  1 root root  137600 Jan 23  2020 du
-rwxr-xr-x  1 root root   69808 Jan 23  2020 echo
-rwxr-xr-x  1 root root     290 Jul 31  2018 egrep
-rwxr-xr-x  1 root root   69808 Jan 23  2020 env
-rwxr-xr-x  1 root root   69992 Jan 23  2020 expand
-rwxr-xr-x  1 root root   70048 Jan 23  2020 expr
-rwxr-xr-x  1 root root  136376 Jan 23  2020 factor
-rwxr-xr-x  1 root root   69776 Jan 23  2020 false
-rwxr-xr-x  1 root root      26 Jul 15  2020 fc
-rwxr-xr-x  1 root root      26 Jul 15  2020 fg
-rwxr-xr-x  1 root root     290 Jul 31  2018 fgrep
-rwxr-xr-x  1 root root   70016 Jan 23  2020 fmt
-rwxr-xr-x  1 root root   69968 Jan 23  2020 fold
-rwxr-xr-x  1 root root  469408 Jul 31  2018 gawk
-rwxr-xr-x  1 root root   74632 Sep 28 16:18 gencat
-rwxr-xr-x  1 root root   72320 Sep 28 16:18 getconf
-rwxr-xr-x  1 root root   78376 Sep 28 16:18 getent
-rwxr-xr-x  1 root root      31 Jul 15  2020 getopts
-rwxr-xr-x  1 root root  204064 Jul 31  2018 grep
-rwxr-xr-x  1 root root   69936 Jan 23  2020 groups
-rwxr-xr-x  1 root root   70008 Jan 23  2020 head
-rwxr-xr-x  1 root root   69816 Jan 23  2020 hostid
-rwxr-xr-x  1 root root   80080 Sep 28 16:18 iconv
-rwxr-xr-x  1 root root   70048 Jan 23  2020 id
-rwxr-xr-x  1 root root    3188 Jul 31  2018 igawk
-rwxr-xr-x  1 root root  279576 Jul 27  2018 info
-rwxr-xr-x  1 root root   69576 Sep 19  2019 infocmp
-rwxr-xr-x  1 root root   71080 Jul 27  2018 infokey
lrwxrwxrwx  1 root root       3 Dec  9 10:01 infotocap -> tic
-rwxr-xr-x  1 root root  204224 Jan 23  2020 install
-rwxr-xr-x  1 root root      28 Jul 15  2020 jobs
-rwxr-xr-x  1 root root   70280 Jan 23  2020 join
-rwxr-xr-x  1 root root    5342 Sep 28 16:13 ldd
-rwxr-xr-x  1 root root   69824 Jan 23  2020 link
-rwxr-xr-x  1 root root   70744 Jan 23  2020 ln
-rwxr-xr-x  1 root root   85048 Sep 28 16:18 locale
-rwxr-xr-x  1 root root  361208 Sep 28 16:18 localedef
-rwxr-xr-x  1 root root   69832 Jan 23  2020 logname
-rwxr-xr-x  1 root root  138136 Jan 23  2020 ls
-rwxr-xr-x  1 root root   75808 Sep 28 16:18 makedb
-rwxr-xr-x  1 root root   70080 Jan 23  2020 md5sum
-rwxr-xr-x  1 root root  136984 Jan 23  2020 mkdir
-rwxr-xr-x  1 root root   71144 Jan 23  2020 mkfifo
-rwxr-xr-x  1 root root   71176 Jan 23  2020 mknod
-rwxr-xr-x  1 root root   70184 Jan 23  2020 mktemp
-rwxr-xr-x  1 root root  138392 Jan 23  2020 mv
-rwxr-xr-x  1 root root   69856 Jan 23  2020 nice
-rwxr-xr-x  1 root root   70112 Jan 23  2020 nl
-rwxr-xr-x  1 root root   69944 Jan 23  2020 nohup
-rwxr-xr-x  1 root root   69888 Jan 23  2020 nproc
-rwxr-xr-x  1 root root  135992 Jan 23  2020 numfmt
-rwxr-xr-x  1 root root   70416 Jan 23  2020 od
-rwxr-xr-x  1 root root   69760 Dec 18  2020 p11-kit
-rwxr-xr-x  1 root root   69872 Jan 23  2020 paste
-rwxr-xr-x  1 root root   69832 Jan 23  2020 pathchk
-rwxr-xr-x  1 root root  469416 Jul 31  2018 pgawk
-rwxr-xr-x  1 root root   70112 Jan 23  2020 pinky
-rwxr-xr-x  1 root root   74032 Sep 28 16:18 pldd
-rwxr-xr-x  1 root root   70648 Jan 23  2020 pr
-rwxr-xr-x  1 root root   69808 Jan 23  2020 printenv
-rwxr-xr-x  1 root root   70144 Jan 23  2020 printf
-rwxr-xr-x  1 root root   70640 Jan 23  2020 ptx
-rwxr-xr-x  1 root root   69960 Jan 23  2020 pwd
-rwxr-xr-x  1 root root      28 Jul 15  2020 read
-rwxr-xr-x  1 root root   70360 Jan 23  2020 readlink
-rwxr-xr-x  1 root root   70776 Jan 23  2020 realpath
lrwxrwxrwx  1 root root       4 Dec  9 10:01 reset -> tset
-rwxr-xr-x  1 root root   70944 Jan 23  2020 rm
-rwxr-xr-x  1 root root   69968 Jan 23  2020 rmdir
-rwxr-xr-x  1 root root  146496 Sep 28 16:18 rpcgen
-rwxr-xr-x  1 root root   69984 Jan 23  2020 runcon
-rwxr-xr-x  1 root root  137472 Aug  1  2018 sed
-rwxr-xr-x  1 root root   70136 Jan 23  2020 seq
lrwxrwxrwx  1 root root       4 Dec  9 10:01 sh -> bash
-rwxr-xr-x  1 root root   70096 Jan 23  2020 sha1sum
-rwxr-xr-x  1 root root   70168 Jan 23  2020 sha224sum
-rwxr-xr-x  1 root root   70168 Jan 23  2020 sha256sum
-rwxr-xr-x  1 root root   70168 Jan 23  2020 sha384sum
-rwxr-xr-x  1 root root   70168 Jan 23  2020 sha512sum
-rwxr-xr-x  1 root root   70632 Jan 23  2020 shred
-rwxr-xr-x  1 root root   70672 Jan 23  2020 shuf
-rwxr-xr-x  1 root root   69888 Jan 23  2020 sleep
-rwxr-xr-x  1 root root  138088 Jan 23  2020 sort
-rwxr-xr-x  1 root root    4281 Sep 28 16:13 sotruss
-rwxr-xr-x  1 root root   71040 Jan 23  2020 split
-rwxr-xr-x  1 root root   75176 Sep 28 16:18 sprof
-rwxr-xr-x  1 root root  136256 Jan 23  2020 stat
-rwxr-xr-x  1 root root   70424 Jan 23  2020 stdbuf
-rwxr-xr-x  1 root root   70136 Jan 23  2020 stty
-rwxr-xr-x  1 root root   70224 Jan 23  2020 sum
-rwxr-xr-x  1 root root   69824 Jan 23  2020 sync
-rwxr-xr-x  1 root root   68912 Sep 19  2019 tabs
-rwxr-xr-x  1 root root   69984 Jan 23  2020 tac
-rwxr-xr-x  1 root root   70744 Jan 23  2020 tail
-rwxr-xr-x  1 root root   69912 Jan 23  2020 tee
-rwxr-xr-x  1 root root   69944 Jan 23  2020 test
-rwxr-xr-x  1 root root  135560 Sep 19  2019 tic
-rwxr-xr-x  1 root root   70904 Jan 23  2020 timeout
-rwxr-xr-x  1 root root   68968 Sep 19  2019 toe
-rwxr-xr-x  1 root root   70552 Jan 23  2020 touch
-rwxr-xr-x  1 root root   69248 Sep 19  2019 tput
-rwxr-xr-x  1 root root   70152 Jan 23  2020 tr
-rwxr-xr-x  1 root root   69776 Jan 23  2020 true
-rwxr-xr-x  1 root root   70240 Jan 23  2020 truncate
-rwxr-xr-x  1 root root  203768 Dec 18  2020 trust
-rwxr-xr-x  1 root root   69272 Sep 19  2019 tset
-rwxr-xr-x  1 root root   70000 Jan 23  2020 tsort
-rwxr-xr-x  1 root root   69808 Jan 23  2020 tty
-rwxr-xr-x  1 root root   15370 Sep 28 16:12 tzselect
-rwxr-xr-x  1 root root      29 Jul 15  2020 umask
-rwxr-xr-x  1 root root      31 Jul 15  2020 unalias
-rwxr-xr-x  1 root root   69832 Jan 23  2020 uname
-rwxr-xr-x  1 root root   69976 Jan 23  2020 unexpand
-rwxr-xr-x  1 root root   70264 Jan 23  2020 uniq
-rwxr-xr-x  1 root root   69824 Jan 23  2020 unlink
-rwxr-xr-x  1 root root    1054 Sep 30 20:24 update-ca-trust
-rwxr-xr-x  1 root root   69928 Jan 23  2020 users
-rwxr-xr-x  1 root root  138136 Jan 23  2020 vdir
-rwxr-xr-x  1 root root      28 Jul 15  2020 wait
-rwxr-xr-x  1 root root   70192 Jan 23  2020 wc
-rwxr-xr-x  1 root root   70208 Jan 23  2020 who
-rwxr-xr-x  1 root root   69832 Jan 23  2020 whoami
-rwxr-xr-x  1 root root   69832 Jan 23  2020 yes

注意すべき点ですが、ls -la /usr/binの結果の通り、sudosuは存在しませんでした。そのため、root権限でrm -rf /*を実行することはできません。残念。

rm -rf /* を実行してみた

それでは、以下のようにrm -rf /*を実行するLambda関数を用意します。

const { execSync } = require("child_process")

exports.handler = async (event) => {
    console.log(`cd /; pwd : ${execSync("cd /; pwd").toString()}`)
    console.log(`dh -h : ${execSync("df -h").toString()}`)
    console.log(`ls -la / : ${execSync("ls -l /").toString()}`)
    
    console.log(`rm -rf /* : ${execSync("rm -rf /*").toString()}`)
    
    console.log(`ls -la / : ${execSync("ls -la /").toString()}`)
    console.log(`dh -h : ${execSync("df -h").toString()}`)
};

実行すると、以下のようにタイムアウトとなってしまいました。

{
  "errorMessage": "2021-12-20T10:53:03.387Z 1c0af7af-8927-494d-8344-8404ad3c4c86 Task timed out after 3.00 seconds"
}

rm -rf /* を実行してみた (タイムアウト)

タイムアウト値を延ばして rm -rf /* を実行してみた

流石にデフォルトのタイムアウト値の3秒では短すぎたので、タイムアウト値をAWS Lambdaの上限タイムアウト値である15分に変更します。

タイムアウト値の変更

タイムアウト値を15分に変更した後、再度実行してみると、次はバッファーが足りないというメッセージが出力されて終了しました。

{
  "errorType": "Error",
  "errorMessage": "spawnSync /bin/sh ENOBUFS",
  "trace": [
    "Error: spawnSync /bin/sh ENOBUFS",
    "    at Object.spawnSync (internal/child_process.js:1077:20)",
    "    at spawnSync (child_process.js:776:24)",
    "    at execSync (child_process.js:858:15)",
    "    at Runtime.exports.handler (/var/task/index.js:8:32)",
    "    at Runtime.handleOnce (/var/runtime/Runtime.js:66:25)"
  ]
}

rm -rf /* を実行してみた (バッファー不足 128 MB)

なお、実行時のCloudWatch Logsを確認すると以下のようにcannot removeと出力しながら頑張っていました。rootユーザーで実行していないのでしょうがないですね。

2021-12-20T10:57:15.320Z	5cbd1edc-1114-426f-8c33-c677a4d622d6	INFO	cd /; pwd : /

2021-12-20T10:57:15.400Z	5cbd1edc-1114-426f-8c33-c677a4d622d6	INFO	dh -h : Filesystem                                                       Size  Used Avail Use% Mounted on
/mnt/root-rw/opt/amazon/asc/worker/tasks/rtfs/nodejs14.x-amzn-2  9.8G  3.8G  6.0G  40% /
/dev/vdb                                                         1.5G   14M  1.4G   1% /dev
/dev/vdd                                                         526M  872K  514M   1% /tmp
/dev/root                                                        9.8G  3.8G  6.0G  40% /etc/passwd
/dev/vdc                                                         128K  128K     0 100% /var/task

2021-12-20T10:57:15.480Z	5cbd1edc-1114-426f-8c33-c677a4d622d6	INFO	ls -la / : total 56
lrwxrwxrwx  1 root         root     7 Dec  9 10:01 bin -> usr/bin
dr-xr-xr-x  2 root         root  4096 Apr  9  2019 boot
drwxr-xr-x  2 root         root  4096 Dec 20 09:29 dev
drwxr-xr-x 29 root         root  4096 Dec  9 10:01 etc
drwxr-xr-x  2 root         root  4096 Apr  9  2019 home
lrwxrwxrwx  1 root         root     7 Dec  9 10:01 lib -> usr/lib
lrwxrwxrwx  1 root         root     9 Dec  9 10:01 lib64 -> usr/lib64
drwxr-xr-x  2 root         root  4096 Apr  9  2019 media
drwxr-xr-x  2 root         root  4096 Apr  9  2019 mnt
drwxr-xr-x  2 root         root  4096 Apr  9  2019 opt
dr-xr-xr-x 70 root         root     0 Dec 20 10:57 proc
dr-xr-x---  2 root         root  4096 Apr  9  2019 root
drwxr-xr-x  2 root         root  4096 Dec 12 21:36 run
lrwxrwxrwx  1 root         root     8 Dec  9 10:01 sbin -> usr/sbin
drwxr-xr-x  2 root         root  4096 Apr  9  2019 srv
dr-xr-xr-x  2 root         root  4096 Apr  9  2019 sys
drwx------  2 sbx_user1051   990 4096 Dec 20 10:57 tmp
drwxr-xr-x 13 root         root  4096 Dec  9 10:01 usr
drwxr-xr-x  1        12569 users 4096 Dec 12 15:35 var

rm: cannot remove ‘/bin’: Read-only file system
rm: cannot remove ‘/boot’: Read-only file system
rm: cannot remove ‘/dev/full’: Permission denied
rm: cannot remove ‘/dev/random’: Permission denied
rm: cannot remove ‘/dev/stdin’: Permission denied
rm: cannot remove ‘/dev/zero’: Permission denied
rm: cannot remove ‘/dev/stderr’: Permission denied
rm: cannot remove ‘/dev/urandom’: Permission denied
rm: cannot remove ‘/dev/null’: Permission denied
rm: cannot remove ‘/dev/stdout’: Permission denied
.
.
.

メモリを増やして rm -rf /* を実行してみた

OSコマンドを実行するchild_process.execSyncのリファレンスを確認したところ、maxBufferというバッファーのオプションがありました。デフォルトでは1024 * 1024 = 1 MByteのようです。流石に1 MByteでは足りないと思ったので、1024 * 1024 * 512 = 512 MByteをバッファーに割り当てます。

const { execSync } = require("child_process")

exports.handler = async (event) => {
    console.log(`cd /; pwd : ${execSync("cd /; pwd").toString()}`)
    console.log(`dh -h : ${execSync("df -h").toString()}`)
    console.log(`ls -la / : ${execSync("ls -l /").toString()}`)
    
    console.log(`rm -rf /* : ${execSync("rm -rf /*",{ maxBuffer: 1024 * 1024 * 512 }).toString()}`)
    
    console.log(`ls -la / : ${execSync("ls -la /").toString()}`)
    console.log(`dh -h : ${execSync("df -h").toString()}`)
};

lambda関数についても512 MBのメモリを割り当てた上で実行します。

512 MBのメモリを割り当て

実行結果は以下の通りで、またしてもバッファーが足りないようです。欲張りさんですね。

{
  "errorType": "Error",
  "errorMessage": "spawnSync /bin/sh ENOMEM",
  "trace": [
    "Error: spawnSync /bin/sh ENOMEM",
    "    at Object.spawnSync (internal/child_process.js:1077:20)",
    "    at spawnSync (child_process.js:776:24)",
    "    at execSync (child_process.js:858:15)",
    "    at Runtime.exports.handler (/var/task/index.js:4:32)",
    "    at Runtime.handleOnce (/var/runtime/Runtime.js:66:25)"
  ]
}

rm -rf /* を実行してみた (バッファー不足 512 MB)

さらにメモリを増やして rm -rf /* を実行してみた

少しずつメモリを増やして検証してもキリがないので、メモリをAWS Lambdaの上限の10240 MBに変更します。バッファーもメモリに合わせて1024 * 1024 * 1024 * 10 = 10240 MBに変更します。

const { execSync } = require("child_process")

exports.handler = async (event) => {
    console.log(`cd /; pwd : ${execSync("cd /; pwd").toString()}`)
    console.log(`dh -h : ${execSync("df -h").toString()}`)
    console.log(`ls -la / : ${execSync("ls -l /").toString()}`)
    
    console.log(`rm -rf /* : ${execSync("rm -rf /*",{ maxBuffer: 1024 * 1024 * 1024 * 10 }).toString()}`)
    
    console.log(`ls -la / : ${execSync("ls -la /").toString()}`)
    console.log(`dh -h : ${execSync("df -h").toString()}`)
};

10240 MBのメモリを割り当て

実行結果は以下の通りで、15分でも完了しませんでした。

{
  "2021-12-20T11:54:21.376Z 5430517d-bb66-4be1-a365-d21cadff623b Task timed out after 900.10 seconds"
}

rm -rf /* を実行してみた (タイムアウト15分)

10124 MBもメモリを積んだのに、1456 MBしか使用されていないですね。メモリサイズを徐々に増やして検証すればよかったと少し後悔しました。

実行時のCloudWatch Logsを確認すると以下のように最後の最後まで頑張っていました。ありがとう。

2021-12-20T11:39:21.287Z	5430517d-bb66-4be1-a365-d21cadff623b	INFO	cd /; pwd : /

2021-12-20T11:39:21.292Z	5430517d-bb66-4be1-a365-d21cadff623b	INFO	dh -h : Filesystem                                                       Size  Used Avail Use% Mounted on
/mnt/root-rw/opt/amazon/asc/worker/tasks/rtfs/nodejs14.x-amzn-2  9.8G  3.8G  6.0G  40% /
/dev/vdb                                                         1.5G   14M  1.4G   1% /dev
/dev/vdd                                                         526M  872K  514M   1% /tmp
/dev/root                                                        9.8G  3.8G  6.0G  40% /etc/passwd
/dev/vdc                                                         128K  128K     0 100% /var/task

2021-12-20T11:39:21.299Z	5430517d-bb66-4be1-a365-d21cadff623b	INFO	ls -la / : total 56
lrwxrwxrwx   1 root         root     7 Dec  9 10:01 bin -> usr/bin
dr-xr-xr-x   2 root         root  4096 Apr  9  2019 boot
drwxr-xr-x   2 root         root  4096 Dec 20 07:36 dev
drwxr-xr-x  29 root         root  4096 Dec  9 10:01 etc
drwxr-xr-x   2 root         root  4096 Apr  9  2019 home
lrwxrwxrwx   1 root         root     7 Dec  9 10:01 lib -> usr/lib
lrwxrwxrwx   1 root         root     9 Dec  9 10:01 lib64 -> usr/lib64
drwxr-xr-x   2 root         root  4096 Apr  9  2019 media
drwxr-xr-x   2 root         root  4096 Apr  9  2019 mnt
drwxr-xr-x   2 root         root  4096 Apr  9  2019 opt
dr-xr-xr-x 103 root         root     0 Dec 20 11:39 proc
dr-xr-x---   2 root         root  4096 Apr  9  2019 root
drwxr-xr-x   2 root         root  4096 Dec 12 21:36 run
lrwxrwxrwx   1 root         root     8 Dec  9 10:01 sbin -> usr/sbin
drwxr-xr-x   2 root         root  4096 Apr  9  2019 srv
dr-xr-xr-x   2 root         root  4096 Apr  9  2019 sys
drwx------   2 sbx_user1051   990 4096 Dec 20 11:39 tmp
drwxr-xr-x  13 root         root  4096 Dec  9 10:01 usr
drwxr-xr-x   1        12569 users 4096 Dec 12 15:35 var

rm: cannot remove ‘/bin’: Read-only file system
rm: cannot remove ‘/boot’: Read-only file system
rm: cannot remove ‘/dev/full’: Permission denied
rm: cannot remove ‘/dev/random’: Permission denied
rm: cannot remove ‘/dev/stdin’: Permission denied
rm: cannot remove ‘/dev/zero’: Permission denied
rm: cannot remove ‘/dev/stderr’: Permission denied
rm: cannot remove ‘/dev/urandom’: Permission denied
rm: cannot remove ‘/dev/null’: Permission denied
rm: cannot remove ‘/dev/stdout’: Permission denied
.
.
.
rm: cannot remove ‘/usr/share/zoneinfo/Pacific/Tahiti’: Read-only file system
rm: cannot remove ‘/usr/share/zoneinfo/Pacific/Auckland’: Read-only file system
rm: cannot remove ‘/usr/share/zoneinfo/Pacific/Galapagos’: Read-only file system
rm: cannot remove ‘/usr/share/zoneinfo/Pacific/Noumea’: Read-only file system
rm: cannot remove ‘/usr/share/zoneinfo/Pacific/Saipan’: Read-only file system
rm: cannot remove ‘/usr/share/zoneinfo/Pacific/Ponape’: Read-only file system
rm: cannot remove ‘/usr/share/zoneinfo/Pacific/Honolulu’: Read-only file system

15分じゃ時間が足りない

AWS Lambdaでrm -rf /*を実行してみました。

最大メモリサイズ & 最大タイムアウト値でもrm -rf /*は完了しないという結果に終わってしまいました。EC2インスタンス(Amazon Linux 2)で実行した際も20分程度実行完了までにかかっていたので、しょうがないと言えばしょうがないです。

そもそも、Lambdak関数はrootユーザーでrm -rf /*を実行できないので、実行完了したとしても、ほとんどのディレクトリやファイルを削除できなかったというオチになった気がします。

裏を返せば、Lambdak関数でrm -rf /*を実行しても影響は限られるかもしれません。

この記事は誰の役にも立たないかもしれませんが、誰かの助けになれば幸いです。

以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!