Estaba leyendo la famosa Leyenda de recuperación de Unix , y se me ocurrió preguntarme:
Si tuviera un shell de BusyBox abierto, y el binario de BusyBox se eliminara, ¿podría seguir usando todos los comandos incluidos en el binario de BusyBox?
Claramente, no podría usar la versión BB de esos comandos desde otro shell en ejecución como bash, ya que el archivo BusyBox en sí no estaría disponible para bashabrir y ejecutar. Pero desde la instancia en ejecución de BusyBox, me parece que podría haber dos métodos por los cuales BB ejecutaría un comando:
- Podría bifurcar y ejecutar una nueva instancia de BusyBox, llamándolo con el nombre apropiado y leyendo el archivo BusyBox desde el disco para hacerlo.
- Podría bifurcar y realizar alguna lógica interna para ejecutar el comando especificado (por ejemplo, ejecutándolo como una llamada de función).
Si (1) es la forma en que funciona BusyBox, esperaría que ciertos comandos proporcionados por BusyBox no estén disponibles desde una instancia en ejecución de BB después de que se eliminen los binarios de BB.
Si (2) es cómo funciona, BusyBox podría usarse incluso para la recuperación de un sistema en el que la propia BB había sido eliminada, siempre que todavía hubiera una instancia de BusyBox accesible.
¿Está documentado en alguna parte? Si no, ¿hay alguna manera de probarlo de manera segura?
fuente

is there a way to safely test it?Descargue laopenwrtimagen genérica x86 y adjunte la imagen a una nueva máquina VirtualBoxPATHse desarma? ¿Asume un valor predeterminado dePATH?Respuestas:
Por defecto, BusyBox no hace nada especial con respecto a los applets que ha incorporado (los comandos enumerados con
busybox --help).Sin embargo, si las opciones
FEATURE_SH_STANDALONEyFEATURE_PREFER_APPLETSestán habilitadas en el momento de la compilación, cuando BusyBox sh¹ ejecuta un comando que es un nombre de applet conocido, no realiza laPATHbúsqueda normal , sino que ejecuta sus applets integrados a través de un acceso directo: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.[[,[,basename,cat,dirname,echo,false,fsync,length,logname,mkdir,printenv,printf,pwd,rm,rmdir,seq,sync,test,true,usleep,whoami,yes.forkyexecve), pero en lugar de hacer unaPATHbúsqueda, BusyBox se ejecuta/proc/self/exe, si está disponible (que normalmente es el caso en Linux), y una ruta definida en el momento de la compilación de lo contrario.Esto se documenta con un poco más de detalle en
docs/nofork_noexec.txt. Las declaraciones de applet estáninclude/applets.src.hen el código fuente.La mayoría de las configuraciones predeterminadas desactivan estas funciones, de modo que BusyBox ejecuta comandos externos como cualquier otro shell. Debian convierte estas características en tanto en sus
busyboxybusybox-staticpaquetes.Entonces, si tiene un ejecutable de BusyBox compilado con
FEATURE_SH_STANDALONEyFEATURE_PREFER_APPLETS, entonces puede ejecutar todos los comandos de BusyBox desde un shell de BusyBox, incluso si el ejecutable se elimina (excepto los applets que no se enumeran arriba, si/proc/self/exeno está disponible).Actually En realidad, hay dos implementaciones de "sh" en BusyBox - ash y hush - pero se comportan de la misma manera a este respecto.
fuente
FEATURE_PREFER_APPLETSyFEATURE_SH_STANDALONEson indicadores de tiempo de compilación, que habilitan o deshabilitan funciones. Los applets están marcadosnoforkenoexecindependientemente de qué banderas se usaron. El hecho de que tales marcas tengan algún efecto o no depende deFEATURE_PREFER_APPLETSestar habilitado. Por lo tanto, tres comportamientos posibles: 1.FEATURE_PREFER_APPLETSdeshabilitado, 2.FEATURE_PREFER_APPLETShabilitado y applet esnofork, 3.FEATURE_PREFER_APPLETShabilitado y applet esnoexec. El tercer párrafo en los documentos lo explica muy bien. Y la última sección muestra los posibles casos.FEATURE_SH_STANDALONE(que requiereFEATURE_PREFER_APPLETS).noforkno es necesario ConFEATURE_SH_STANDALONE,/proc/self/exese usa cuando corresponde, por lo que funcionará incluso si se eliminó BB . Puede probar esto con un riesgo bastante mínima en cualquier systm Debian o Linux del arco, carrerabusybox ash,unset PATH, hacer los comandos de la cuenca. Funciona bien.catnichmodrequieren exec-ing una ruta, puede recuperar el archivo ejecutable de esta manera:cat /proc/self/exe > busybox; chmod 755 busybox.tacrequiere un archivo de entrada que no esté siempre disponible o leer toda la entrada en la memoria.catpuede leer su entrada de principio a fin, descartando lo que ya está procesado. Es mucho más fácil de implementar y también se usa mucho más comúnmente, por lo que tiene más sentido optimizarlo.FEATURE_xxxes una opción en tiempo de compilación para BusyBox en su conjunto. Las indicaciones nofork y noexec solo importan siFEATURE_PREFER_APPLETSestá activo (al menos con el propósito de ejecutar un comando en el shell, también se usan en otros contextos).is there a way to safely test it?Con la imagen genérica x86 openwrt:La mayoría de los comandos no están integrados, pero algunos son, como
echoyprintf. Se puede crear un archivo binario con contenido arbitrarioprintf, perochmod +xserá un problema.fuente
/bin/ash -> busybox.FEATURE_SH_STANDALONEestá habilitado, no obtendrá este comportamiento. El segundomvfuncionará perfectamente bien.