我正在读著名的Unix 恢复传奇,我突然想知道:
如果我打开了 BusyBox shell,并且 BusyBox 二进制文件本身被删除,我是否仍然能够使用 BusyBox 二进制文件中包含的所有命令?
显然我无法使用这些命令的 BB 版本其他运行诸如 之类的 shell bash
,因为 BusyBox 文件本身将无法bash
打开和运行。但在 BusyBox 的运行实例中,在我看来,BB 可以通过两种方法运行命令:
- 它可以分叉并执行 BusyBox 的新实例,使用适当的名称调用它,并从磁盘读取 BusyBox 文件来执行此操作。
- 它可以分叉并执行一些内部逻辑来运行指定的命令(例如,通过将其作为函数调用运行)。
如果 (1) 是 BusyBox 的工作方式,我预计在删除 BB 二进制文件后,某些 BusyBox 提供的命令将在 BB 的运行实例中变得不可用。
如果 (2) 是这样工作的,则 BusyBox 甚至可以用于恢复 BB 本身已被删除的系统 — 前提是仍然存在可访问的正在运行的 BusyBox 实例。
这有记录在任何地方吗?如果没有,有没有办法安全地测试它?
答案1
默认情况下,BusyBox 不会对它内置的小程序(用 列出的命令busybox --help
)执行任何特殊操作。
但是,如果在编译时启用FEATURE_SH_STANDALONE
和FEATURE_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 在其两个版本中都启用了这些功能busybox
和busybox-static
包。
FEATURE_SH_STANDALONE
因此,如果您有使用和编译的 BusyBox 可执行文件FEATURE_PREFER_APPLETS
,则即使删除了可执行文件,您也可以从 BusyBox shell 执行所有 BusyBox 命令(上面未列出的小程序除外,如果/proc/self/exe
不可用)。
1 BusyBox 中实际上有两种“sh”的实现——ash 和 hush——但它们在这方面的行为是相同的。
答案2
答案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:~$