Busybox

BusyBox 命令真的是內置的嗎?

  • May 27, 2021

我正在閱讀著名的Unix Recovery Legend,我想知道:

如果我打開了 BusyBox shell,並且 BusyBox 二進製文件本身已被刪除,我還能使用 BusyBox 二進製文件中包含的所有命令嗎?

顯然,我無法從另一個正在執行的 shell 中使用這些命令的 BB 版本,例如bash,因為 BusyBox 文件本身將無法bash打開和執行。但是在 BusyBox 的執行實例中,在我看來,BB 可以通過兩種方法執行命令:

  1. 它可以派生並執行一個新的 BusyBox 實例,使用適當的名稱呼叫它——並從磁碟讀取 BusyBox 文件以執行此操作。
  2. 它可以分叉並執行一些內部邏輯來執行指定的命令(例如,通過將其作為函式呼叫執行)。

如果 (1) 是 BusyBox 的工作方式,我希望在刪除 BB 二進製文件後,某些 BusyBox 提供的命令將在 BB 的執行實例中變得不可用。

如果 (2) 是這樣工作的,那麼 BusyBox 甚至可以用於恢復 BB 本身已被刪除的系統——前提是仍然有一個正在執行的 BusyBox 實例可訪問。

這在任何地方都有記錄嗎?如果沒有,有沒有辦法安全地測試它?

預設情況下,BusyBox 對它內置的小程序(用 列出的命令)不做任何特別的事情busybox --help

但是,如果在編譯時啟用了FEATURE_SH_STANDALONEandFEATURE_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.
  • 其他小程序確實被執行(使用forkand execve),但PATHBusyBox 不進行查找,而是執行/proc/self/exe,如果可用(通常在 Linux 上就是這種情況),否則在編譯時定義路徑。

這在docs/nofork_noexec.txt. 小程序聲明在include/applets.src.h原始碼中。

大多數預設配置會關閉這些功能,以便 BusyBox 像任何其他 shell 一樣執行外部命令。Debian 在其busyboxbusybox-static軟體包中都啟用了這些功能。

因此,如果您有一個用FEATURE_SH_STANDALONEand編譯的 BusyBox 執行檔FEATURE_PREFER_APPLETS,那麼即使執行檔被刪除,您也可以從 BusyBox shell 執行所有 BusyBox 命令(如果/proc/self/exe不可用,上面未列出的小程序除外)。

¹ BusyBox 中實際上有兩種“sh”實現——ash 和hush——但它們在這方面的行為方式相同。

引用自:https://unix.stackexchange.com/questions/274273