這是一個經典的思想實驗:以 root 身分執行 rm -rf --no-preserve-root / 後,系統還剩什麼?能否從廢墟中重建基本工具鏈?本文記錄實測過程與核心發現。
CONFIG_PROTECT_ROOT,rm -rf / 會被攔截;需加 --no-preserve-root 繞過保護。# rm -rf --no-preserve-root /
現象:
/bin/ls、/bin/cat、/bin/chmod、/usr/bin/file 等外部命令瞬間消失,執行報 No such file or directory。echo、cd、pwd、read、printf、for/while、函數定義 等。/proc、/sys、/dev、/run——它們在記憶體中,不佔磁碟空間。# 定義函數
ls() { for i in ${1:-.}/*; do printf '%s\n' "$i"; done }
ls /dev
# /dev/pts /dev/null /dev/zero ...
executable() { [[ ! -d $1 && ! -L $1 && -x $1 ]] && printf '%s\n' "$1"; }
for i in /**/*; do executable "$i"; done
# 輸出為空——實體二進制已全被刪除
雖然磁碟檔案消失,但**正在運行的進程**在 /proc/$PID/exe 仍保留對原始二進制的引用(核心保持映像不被釋放)。
# 找到 bash 自身的 exe
ls -l /proc/$$/exe
# lrwxrwxrwx 1 root root 0 ... /proc/1234/exe -> /usr/bin/bash (deleted)
此時 /proc/$$/exe 雖顯示 (deleted),但**仍可執行**!
busybox 靜態版(單一二進制含 ls、cp、mv、wget、tar 等 300+ 工具)。echo + printf + xxd(若倖存)或 bash 內建 /dev/tcp 協議傳輸二進制內容:
# 完整機器:監聽傳送 busybox
cat busybox | xxd -p | tr -d '\n' | sed 's/../\\x&/g' | nc -l -p 5050
# 受災機器:接收並寫入(利用 bash /dev/tcp)
exec 3<>/dev/tcp/完整機器IP/5050
while IFS= read -r -u3 line; do printf "$line"; done > busybox
exec 3<&-
接收到的 busybox 檔案無執行位。利用 /proc/$$/exe(bash 自身)作為載體:
# 寫入一個微型 C 程式 setx.c,編譯成共享物件,用 enable -f 載入(bash 內建)
# 或者更簡單:覆蓋 /proc/$$/exe 指向的記憶體頁(需 root 與 /dev/mem,風險極高)
# 實務上最可行:重啟進入 initramfs/救援模式掛載磁碟修復
chattr +i 保護關鍵目錄、限制 root 直接登入。