是否真正内置BusyBox命令?


28

我正在阅读著名的Unix Recovery Legend,这让我感到奇怪:

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

显然,我将无法从其他正在运行的外壳程序(如)中使用这些命令的BB版本bash,因为BusyBox文件本身将无法bash打开和运行。但是从我正在运行的BusyBox实例中,看来BB可以通过两种方法运行命令:

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

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

如果(2)是它的工作方式,则即使已删除BB本身的系统,也可以使用BusyBox进行恢复-前提是仍可以访问正在运行的BusyBox实例。

这在任何地方都有记录吗?如果没有,有没有办法对其进行安全测试?


2
is there a way to safely test it?下载通用x86 openwrt映像并将该映像附加到新的VirtualBox机器上
盆地

2
这就提出了一个问题:未设置后,Busybox命令如何继续工作PATH?是否采用默认值PATH
muru 16-4-5,1

2
@muru:从源代码(至少对于其ash克隆而言)看起来像对待未设置的PATH就像对待空字符串一样,因此它仅搜索当前目录。
Henning Makholm '16

@HenningMakholm好吧,吉尔斯的回答回答了我的评论。但是,很高兴知道这一点-我希望只有内置函数才能工作。
muru

Answers:


33

默认情况下,BusyBox对其内置的applet(使用列出的命令busybox --help)不做任何特殊处理。

但是,如果在编译时启用了FEATURE_SH_STANDALONEFEATURE_PREFER_APPLETS选项,则当BusyBoxsh¹执行一个已知的applet名称的命令时,它不会进行常规PATH查找,而是通过快捷方式运行其内置applet:

  • 在源代码中被声明为“ noexec”的小程序在派生进程中作为函数调用执行。作为BusyBox的1.22,下面的小程序NOEXEC: ,chgrpchmodchowncksumcpcutdddos2unixenvfoldhdheadhexdumplnlsmd5summkfifomknodsha1sumsha256sumsha3sumsha512sumsort,。tacunix2dos
  • 在源代码中被声明为“ nofork”的小程序在同一过程中作为函数调用执行。作为BusyBox的1.22,下面的小程序nofork: ,[[[basenamecatdirnameechofalsefsynclengthlognamemkdirprintenvprintfpwdrmrmdirseqsynctesttrueusleep,。whoamiyes
  • 其他小程序实际上是使用(forkexecve)执行的,但不进行PATH查找,而是执行BusyBox /proc/self/exe(如果可用)(在Linux上通常是这种情况)执行,否则执行在编译时定义的路径。

在中有更详细的记录docs/nofork_noexec.txt。小程序声明include/applets.src.h在源代码中。

大多数默认配置都会关闭这些功能,因此BusyBox可以像执行其他任何Shell一样执行外部命令。Debian在其busyboxbusybox-static软件包中都启用了这些功能。

因此,如果您使用FEATURE_SH_STANDALONE和编译了一个BusyBox可执行文件FEATURE_PREFER_APPLETS,那么即使删除了该可执行文件,也可以从BusyBox shell执行所有BusyBox命令(上面未列出的applet除外,如果/proc/self/exe没有的话)。

¹ 实际上,在BusyBox中有“ sh”的两个实现-ash和hush-但在这方面它们的行为方式相同。


1
@Wildcard FEATURE_PREFER_APPLETSFEATURE_SH_STANDALONE是编译时标志,用于启用或禁用功能。标记了小程序,nofork并且与noexec使用了哪个标志无关。此类标记是否有效取决于FEATURE_PREFER_APPLETS启用。因此,三种可能的行为:1. FEATURE_PREFER_APPLETS禁用,2. FEATURE_PREFER_APPLETS启用并且applet为nofork,3. FEATURE_PREFER_APPLETS启用并且applet为noexec。文档中的第三段很好地解释了这一点。最后一部分显示了可能的情况。
muru 16-4-5,2

1
@Wildcard FEATURE_SH_STANDALONE(需要FEATURE_PREFER_APPLETS)。nofork不需要。在适当的地方使用with FEATURE_SH_STANDALONE/proc/self/exe因此即使删除了BB也可以使用。您可以在任何Debian或者Arch Linux的SYSTM相当风险最小,运行测试了这一点busybox ashunset PATH,做盆的命令。工作正常。
muru 2016年

3
在Ubuntu 14.04.1 LTS系统上,将Busybox配置为首选applet。由于既没有cat,也不chmod需要EXEC-ING一个路径,你可以恢复正是如此可执行文件: cat /proc/self/exe > busybox; chmod 755 busybox
Barefoot IO

1
@forest有一个巨大的区别:tac需要一个并不总是可用的可搜索输入文件,或者将整个输入读入内存。cat可以从头到尾读取其输入,丢弃已处理的内容。它更容易实现,也更常用,因此优化该代码更有意义。
hvd

1
@Wildcard Nofork和noexec是在每个applet上设置的指示。FEATURE_xxx是整个BusyBox的编译时选项。nofork和noexec指示仅在FEATURE_PREFER_APPLETS激活时才有意义(至少出于在shell中执行命令的目的,它们还在其他一些上下文中使用)。
吉尔(Gilles)'所以

8

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

vbox屏幕截图

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


有趣; 您是从BusyBox本身还是其他外壳中运行的?
通配符

4
(此外,您介意粘贴文本而不是截图吗?)
通配符

@Wildcard /bin/ash -> busybox
盆地

1
就像在Gilles的答案中一样,如果FEATURE_SH_STANDALONE启用,则不会出现此行为。第二个mv将完全正常。
muru 16-4-5,2
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.