默认情况下,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,。tacunix2dos
- 在源代码中被声明为“ nofork”的小程序在同一过程中作为函数调用执行。作为BusyBox的1.22,下面的小程序nofork: ,
[[,[,basename,cat,dirname,echo,false,fsync,length,logname,mkdir,printenv,printf,pwd,rm,rmdir,seq,sync,test,true,usleep,。whoamiyes
- 其他小程序实际上是使用(
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机器上