BusyBox 命令真的是內置的嗎?
我正在閱讀著名的Unix Recovery Legend,我想知道:
如果我打開了 BusyBox shell,並且 BusyBox 二進製文件本身已被刪除,我還能使用 BusyBox 二進製文件中包含的所有命令嗎?
顯然,我無法從另一個正在執行的 shell 中使用這些命令的 BB 版本,例如
bash
,因為 BusyBox 文件本身將無法bash
打開和執行。但是在 BusyBox 的執行實例中,在我看來,BB 可以通過兩種方法執行命令:
- 它可以派生並執行一個新的 BusyBox 實例,使用適當的名稱呼叫它——並從磁碟讀取 BusyBox 文件以執行此操作。
- 它可以分叉並執行一些內部邏輯來執行指定的命令(例如,通過將其作為函式呼叫執行)。
如果 (1) 是 BusyBox 的工作方式,我希望在刪除 BB 二進製文件後,某些 BusyBox 提供的命令將在 BB 的執行實例中變得不可用。
如果 (2) 是這樣工作的,那麼 BusyBox 甚至可以用於恢復 BB 本身已被刪除的系統——前提是仍然有一個正在執行的 BusyBox 實例可訪問。
這在任何地方都有記錄嗎?如果沒有,有沒有辦法安全地測試它?
預設情況下,BusyBox 對它內置的小程序(用 列出的命令)不做任何特別的事情
busybox --help
。但是,如果在編譯時啟用了
FEATURE_SH_STANDALONE
andFEATURE_PREFER_APPLETS
選項,那麼當 BusyBox sh¹ 執行一個已知小程序名稱的命令時,它不會進行正常PATH
查找,而是通過快捷方式執行其內置小程序:
- 在原始碼中聲明為“noexec”的小程序在分叉程序中作為函式呼叫執行。從 BusyBox 1.22 開始,以下小程序是 noexec:
chgrp
,chmod
,chown
,cksum
,cp
,cut
,dd
,dos2unix
,env
,fold
,hd
,head
,hexdump
,ln
,ls
,md5sum
,mkfifo
,mknod
,sha1sum
,sha256sum
,sha3sum
,sha512sum
,sort
,tac
,unix2dos
.- 在原始碼中聲明為“nofork”的小程序在同一程序中作為函式呼叫執行。從 BusyBox 1.22 開始,以下小程序是 nofork:
[[
,[
,basename
,cat
,dirname
,echo
,false
,fsync
,length
,logname
,mkdir
,printenv
,printf
,pwd
,rm
,rmdir
,seq
,sync
,test
,true
,usleep
,whoami
,yes
.- 其他小程序確實被執行(使用
fork
andexecve
),但PATH
BusyBox 不進行查找,而是執行/proc/self/exe
,如果可用(通常在 Linux 上就是這種情況),否則在編譯時定義路徑。這在
docs/nofork_noexec.txt
. 小程序聲明在include/applets.src.h
原始碼中。大多數預設配置會關閉這些功能,以便 BusyBox 像任何其他 shell 一樣執行外部命令。Debian 在其
busybox
和busybox-static
軟體包中都啟用了這些功能。因此,如果您有一個用
FEATURE_SH_STANDALONE
and編譯的 BusyBox 執行檔FEATURE_PREFER_APPLETS
,那麼即使執行檔被刪除,您也可以從 BusyBox shell 執行所有 BusyBox 命令(如果/proc/self/exe
不可用,上面未列出的小程序除外)。¹ BusyBox 中實際上有兩種“sh”實現——ash 和hush——但它們在這方面的行為方式相同。