Je lisais la célèbre légende de récupération Unix , et je me suis demandé:
Si j'avais un shell BusyBox ouvert et que le binaire BusyBox était lui-même supprimé, serais-je toujours en mesure d'utiliser toutes les commandes incluses dans le binaire BusyBox?
De toute évidence, je ne serais pas en mesure d'utiliser la version BB de ces commandes d' un autre shell en cours d'exécution bash
, car le fichier BusyBox lui-même ne serait pas disponible pour bash
s'ouvrir et s'exécuter. Mais à partir de l'instance en cours d'exécution de BusyBox, il me semble qu'il pourrait y avoir deux méthodes par lesquelles BB exécuterait une commande:
- Il peut créer et exécuter une nouvelle instance de BusyBox, en l'appelant en utilisant le nom approprié et en lisant le fichier BusyBox à partir du disque.
- Il peut bifurquer et exécuter une logique interne pour exécuter la commande spécifiée (par exemple, en l'exécutant comme un appel de fonction).
Si (1) est la façon dont BusyBox fonctionne, je m'attendrais à ce que certaines commandes fournies par BusyBox deviennent indisponibles à partir d'une instance en cours d'exécution de BB après la suppression du binaire BB.
Si (2) fonctionne comme cela, BusyBox pourrait être utilisé même pour la récupération d'un système où BB lui-même avait été supprimé - à condition qu'il y ait toujours une instance en cours d'exécution de BusyBox accessible.
Est-ce documenté quelque part? Sinon, existe-t-il un moyen de le tester en toute sécurité?
la source
is there a way to safely test it?
Téléchargez l'openwrt
image générique x86 et attachez l'image à une nouvelle machine VirtualBoxPATH
été désactivées? Suppose-t-il une valeur par défaut dePATH
?Réponses:
Par défaut, BusyBox ne fait rien de spécial concernant les applets qu'il a intégrées (les commandes répertoriées avec
busybox --help
).Cependant, si les options
FEATURE_SH_STANDALONE
etFEATURE_PREFER_APPLETS
sont activées au moment de la compilation, alors lorsque BusyBox sh¹ exécute une commande qui est un nom d'applet connu, il ne fait pas laPATH
recherche normale , mais exécute à la place ses applets intégrées via un raccourci: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
etexecve
), mais au lieu de faire unePATH
recherche, BusyBox s'exécute/proc/self/exe
, si disponible (ce qui est normalement le cas sous Linux), et un chemin défini au moment de la compilation sinon.Ceci est documenté un peu plus en détail dans
docs/nofork_noexec.txt
. Les déclarations d'applet sontinclude/applets.src.h
dans le code source.La plupart des configurations par défaut désactivent ces fonctionnalités, de sorte que BusyBox exécute des commandes externes comme tout autre shell. Debian active ces fonctionnalités dans ses packages
busybox
etbusybox-static
.Donc, si vous avez un exécutable BusyBox compilé avec
FEATURE_SH_STANDALONE
etFEATURE_PREFER_APPLETS
, vous pouvez exécuter toutes les commandes BusyBox à partir d'un shell BusyBox même si l'exécutable est supprimé (à l'exception des applets qui ne sont pas répertoriées ci-dessus, si elles/proc/self/exe
ne sont pas disponibles).¹ Il existe en fait deux implémentations de "sh" dans BusyBox - ash et hush - mais elles se comportent de la même manière à cet égard.
la source
FEATURE_PREFER_APPLETS
etFEATURE_SH_STANDALONE
sont des indicateurs de compilation, activant ou désactivant des fonctionnalités. Les applets sont marquéesnofork
etnoexec
quels que soient les drapeaux utilisés. Que ces marquages aient ou non un effet dépend deFEATURE_PREFER_APPLETS
leur activation. Par conséquent, trois comportements possibles: 1.FEATURE_PREFER_APPLETS
désactivé, 2.FEATURE_PREFER_APPLETS
activé et l'applet estnofork
, 3.FEATURE_PREFER_APPLETS
activé et l'applet estnoexec
. Le troisième para dans la documentation l'explique bien. Et la dernière section montre les cas possibles.FEATURE_SH_STANDALONE
(qui nécessiteFEATURE_PREFER_APPLETS
).nofork
n'est pas nécessaire. AvecFEATURE_SH_STANDALONE
,/proc/self/exe
est utilisé le cas échéant, il fonctionnera donc même si BB a été supprimé . Vous pouvez tester cela avec un risque assez minime sur une Debian ou Arch Linux systm, exécutezbusybox ash
,unset PATH
, faire les commandes de bassin. Ça fonctionne bien.cat
nechmod
nécessitent exec-ing un chemin, vous pouvez récupérer le fichier exécutable ainsi:cat /proc/self/exe > busybox; chmod 755 busybox
.tac
nécessite soit un fichier d'entrée recherché qui n'est pas toujours disponible, soit la lecture de la totalité de l'entrée en mémoire.cat
peut lire son entrée du début à la fin, en rejetant ce qui est déjà traité. Il est beaucoup plus facile à implémenter et il est également beaucoup plus couramment utilisé, il est donc plus logique d'optimiser celui-ci.FEATURE_xxx
est une option de compilation pour BusyBox dans son ensemble. Les indications nofork et noexec n'ont d'importance que si ellesFEATURE_PREFER_APPLETS
sont actives (au moins dans le but d'exécuter une commande dans le shell, elles sont également utilisées dans d'autres contextes).is there a way to safely test it?
Avec l'image générique x86 openwrt:La plupart des commandes ne sont pas intégrées, mais certaines le sont, comme
echo
etprintf
. Un fichier binaire avec un contenu arbitraire peut être créé en utilisantprintf
, maischmod +x
sera un problème.la source
/bin/ash -> busybox
.FEATURE_SH_STANDALONE
est activé, vous n'obtiendrez pas ce comportement. Le secondmv
fonctionnera parfaitement bien.