BusyBox 命令真的是内置的吗?

BusyBox 命令真的是内置的吗?

我正在读著名的Unix 恢复传奇,我突然想知道:

如果我打开了 BusyBox shell,并且 BusyBox 二进制文件本身被删除,我是否仍然能够使用 BusyBox 二进制文件中包含的所有命令?

显然我无法使用这些命令的 BB 版本其他运行诸如 之类的 shell bash,因为 BusyBox 文件本身将无法bash打开和运行。但在 BusyBox 的运行实例中,在我看来,BB 可以通过两种方法运行命令:

  1. 它可以分叉并执行 BusyBox 的新实例,使用适当的名称调用它,并从磁盘读取 BusyBox 文件来执行此操作。
  2. 它可以分叉并执行一些内部逻辑来运行指定的命令(例如,通过将其作为函数调用运行)。

如果 (1) 是 BusyBox 的工作方式,我预计在删除 BB 二进制文件后,某些 BusyBox 提供的命令将在 BB 的运行实例中变得不可用。

如果 (2) 是这样工作的,则 BusyBox 甚至可以用于恢复 BB 本身已被删除的系统 — 前提是仍然存在可访问的正在运行的 BusyBox 实例。

这有记录在任何地方吗?如果没有,有没有办法安全地测试它?

答案1

默认情况下,BusyBox 不会对它内置的小程序(用 列出的命令busybox --help)执行任何特殊操作。

但是,如果在编译时启用FEATURE_SH_STANDALONEFEATURE_PREFER_APPLETS选项,那么当 BusyBox sh1 执行已知小程序名称的命令时,它不会执行正常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和),但BusyBoxexecve不执行查找,而是执行(如果可用)(Linux 上通常是这种情况),否则执行编译时定义的路径。PATH/proc/self/exe

这在以下文件中有更详细的记录docs/nofork_noexec.txt。小程序声明位于include/applets.src.h在源代码中。

大多数默认配置都会关闭这些功能,以便 BusyBox 像任何其他 shell 一样执行外部命令。 Debian 在其两个版本中都启用了这些功能busyboxbusybox-static包。

FEATURE_SH_STANDALONE因此,如果您有使用和编译的 BusyBox 可执行文件FEATURE_PREFER_APPLETS,则即使删除了可执行文件,您也可以从 BusyBox shell 执行所有 BusyBox 命令(上面未列出的小程序除外,如果/proc/self/exe不可用)。

1 BusyBox 中实际上有两种“sh”的实现——ash 和 hush——但它们在这方面的行为是相同的。

答案2

is there a way to safely test it?使用通用 x86 openwrt 映像:

vbox截图

大多数命令不是内置的,但有些命令是内置的,例如echoprintf。可以使用 创建具有任意内容的二进制文件printf,但这chmod +x会是一个问题。

答案3

is there a way to safely test it?

您可以通过命令的错误信息来检查。如果在 busybox 中显式调用时它是相同的,那么“冒险”就会失败。

在我的系统上sash,如果我运行 shell,它仍然可用。

user@ulmus-thomasii:~$ echo mv b | busybox sh
mv: Fehlender Zieldatei‐Operand hinter 'b'
„mv --help“ liefert weitere Informationen.
user@ulmus-thomasii:~$ /bin/mv b
/bin/mv: Fehlender Zieldatei‐Operand hinter 'b'
„/bin/mv --help“ liefert weitere Informationen.
user@ulmus-thomasii:~$ echo mv b | sash
mv: Fehlender Zieldatei‐Operand hinter 'b'
„mv --help“ liefert weitere Informationen.
user@ulmus-thomasii:~$ echo -mv b | sash
usage: -mv srcName ... destName
user@ulmus-thomasii:~$ 

相关内容