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 bash
abrir 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 laopenwrt
imagen genérica x86 y adjunte la imagen a una nueva máquina VirtualBoxPATH
se 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_STANDALONE
yFEATURE_PREFER_APPLETS
están habilitadas en el momento de la compilación, cuando BusyBox sh¹ ejecuta un comando que es un nombre de applet conocido, no realiza laPATH
bú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
.fork
yexecve
), pero en lugar de hacer unaPATH
bú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.h
en 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
busybox
ybusybox-static
paquetes.Entonces, si tiene un ejecutable de BusyBox compilado con
FEATURE_SH_STANDALONE
yFEATURE_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/exe
no 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_APPLETS
yFEATURE_SH_STANDALONE
son indicadores de tiempo de compilación, que habilitan o deshabilitan funciones. Los applets están marcadosnofork
enoexec
independientemente de qué banderas se usaron. El hecho de que tales marcas tengan algún efecto o no depende deFEATURE_PREFER_APPLETS
estar habilitado. Por lo tanto, tres comportamientos posibles: 1.FEATURE_PREFER_APPLETS
deshabilitado, 2.FEATURE_PREFER_APPLETS
habilitado y applet esnofork
, 3.FEATURE_PREFER_APPLETS
habilitado 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
).nofork
no es necesario ConFEATURE_SH_STANDALONE
,/proc/self/exe
se 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.cat
nichmod
requieren exec-ing una ruta, puede recuperar el archivo ejecutable de esta manera:cat /proc/self/exe > busybox; chmod 755 busybox
.tac
requiere un archivo de entrada que no esté siempre disponible o leer toda la entrada en la memoria.cat
puede 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_xxx
es una opción en tiempo de compilación para BusyBox en su conjunto. Las indicaciones nofork y noexec solo importan siFEATURE_PREFER_APPLETS
está 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
echo
yprintf
. Se puede crear un archivo binario con contenido arbitrarioprintf
, perochmod +x
será un problema.fuente
/bin/ash -> busybox
.FEATURE_SH_STANDALONE
está habilitado, no obtendrá este comportamiento. El segundomv
funcionará perfectamente bien.