默认情况下,BusyBox对其内置的applet(使用列出的命令busybox --help
)不做任何特殊处理。
但是,如果在编译时启用了FEATURE_SH_STANDALONE
和FEATURE_PREFER_APPLETS
选项,则当BusyBoxsh¹执行一个已知的applet名称的命令时,它不会进行常规PATH
查找,而是通过快捷方式运行其内置applet:
- 在源代码中被声明为“ 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
和execve
)执行的,但不进行PATH
查找,而是执行BusyBox /proc/self/exe
(如果可用)(在Linux上通常是这种情况)执行,否则执行在编译时定义的路径。
在中有更详细的记录docs/nofork_noexec.txt
。小程序声明include/applets.src.h
在源代码中。
大多数默认配置都会关闭这些功能,因此BusyBox可以像执行其他任何Shell一样执行外部命令。Debian在其busybox
和busybox-static
软件包中都启用了这些功能。
因此,如果您使用FEATURE_SH_STANDALONE
和编译了一个BusyBox可执行文件FEATURE_PREFER_APPLETS
,那么即使删除了该可执行文件,也可以从BusyBox shell执行所有BusyBox命令(上面未列出的applet除外,如果/proc/self/exe
没有的话)。
¹ 实际上,在BusyBox中有“ sh”的两个实现-ash和hush-但在这方面它们的行为方式相同。
is there a way to safely test it?
下载通用x86openwrt
映像并将该映像附加到新的VirtualBox机器上