Ich habe die berühmte Unix Recovery Legend gelesen und mich gefragt:
Wenn ich eine BusyBox-Shell geöffnet hätte und die BusyBox-Binärdatei selbst gelöscht würde, wäre ich dann weiterhin in der Lage, alle in der BusyBox-Binärdatei enthaltenen Befehle zu verwenden?
Es ist klar, dass ich die BB-Version dieser Befehle nicht von einer anderen laufenden Shell wie zum Beispiel verwenden könnte bash
, da die BusyBox-Datei selbst nicht bash
zum Öffnen und Ausführen verfügbar wäre . Aber innerhalb der laufenden Instanz von BusyBox scheint es für mich zwei Methoden zu geben, mit denen BB einen Befehl ausführen kann:
- Es könnte eine neue Instanz von BusyBox auflösen und ausführen, indem es sie unter dem entsprechenden Namen aufruft - und dazu die BusyBox-Datei von der Festplatte liest.
- Es könnte eine interne Logik zum Ausführen des angegebenen Befehls aufteilen und ausführen (z. B. durch Ausführen als Funktionsaufruf).
Wenn (1) die Art und Weise ist, wie BusyBox funktioniert, würde ich erwarten, dass bestimmte von BusyBox bereitgestellte Befehle in einer laufenden Instanz von BB nicht mehr verfügbar sind, nachdem die BB-Binärdatei gelöscht wurde.
Wenn (2) so funktioniert, kann BusyBox auch zur Wiederherstellung eines Systems verwendet werden, auf dem BB selbst gelöscht wurde - vorausgesetzt, es ist noch eine laufende Instanz von BusyBox verfügbar.
Ist das irgendwo dokumentiert? Wenn nicht, gibt es eine Möglichkeit, es sicher zu testen?
quelle
is there a way to safely test it?
Laden Sie das generische x86openwrt
Bild und fügen Sie das Bild auf ein neuen VirtualBox MaschinePATH
deaktiviert wurden. Nimmt es einen Standardwert von anPATH
?Antworten:
Standardmäßig führt BusyBox in Bezug auf die eingebauten Applets (die mit aufgelisteten Befehle
busybox --help
) keine besonderen Aktionen aus .Wenn jedoch die Optionen
FEATURE_SH_STANDALONE
undFEATURE_PREFER_APPLETS
zur Kompilierungszeit aktiviert sind, führt BusyBox sh¹ beim Ausführen eines Befehls, bei dem es sich um einen bekannten Applet-Namen handelt, nicht die normalePATH
Suche durch, sondern führt die integrierten Applets über eine Verknüpfung aus: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
undexecve
). Anstatt jedoch einePATH
Suche durchzuführen, wird BusyBox ausgeführt/proc/self/exe
, sofern verfügbar (was normalerweise unter Linux der Fall ist), und ansonsten wird ein Pfad zur Kompilierungszeit definiert.Dies ist in etwas ausführlicher dokumentiert
docs/nofork_noexec.txt
. Die Applet-Deklarationen befinden sich iminclude/applets.src.h
Quellcode.Die meisten Standardkonfigurationen deaktivieren diese Funktionen, sodass BusyBox wie jede andere Shell externe Befehle ausführt. Debian aktiviert diese Funktionen sowohl in seiner
busybox
als auch in seinenbusybox-static
Paketen.Wenn Sie also eine ausführbare BusyBox-Datei mit
FEATURE_SH_STANDALONE
und kompiliert habenFEATURE_PREFER_APPLETS
, können Sie alle BusyBox-Befehle von einer BusyBox-Shell aus ausführen, auch wenn die ausführbare Datei gelöscht wird (mit Ausnahme der oben nicht aufgeführten Applets, sofern diese/proc/self/exe
nicht verfügbar sind).¹ In BusyBox gibt es zwei Implementierungen von "sh" - ash und hush -, die sich jedoch in dieser Hinsicht gleich verhalten.
quelle
FEATURE_PREFER_APPLETS
undFEATURE_SH_STANDALONE
sind Flags zur Kompilierungszeit, die Funktionen aktivieren oder deaktivieren. Die Applets sind markiertnofork
undnoexec
unabhängig davon, welche Flags verwendet wurden. Ob solche Markierungen eine Wirkung haben oder nicht, hängt davon abFEATURE_PREFER_APPLETS
, ob sie aktiviert sind. Daher gibt es drei mögliche Verhaltensweisen: 1.FEATURE_PREFER_APPLETS
deaktiviert, 2.FEATURE_PREFER_APPLETS
aktiviert und Applet istnofork
, 3.FEATURE_PREFER_APPLETS
aktiviert und Applet istnoexec
. Der dritte Absatz in den Dokumenten erklärt es gut. Und der letzte Abschnitt zeigt die möglichen Fälle.FEATURE_SH_STANDALONE
(was erfordertFEATURE_PREFER_APPLETS
).nofork
wird nicht benötigt. MitFEATURE_SH_STANDALONE
,/proc/self/exe
wird wo zutreffend verwendet, so dass es auch dann funktioniert , wenn BB gelöscht wurde . Sie können dies mit recht geringem Risiko auf jedem Debian oder Arch Linux systm testen, laufenbusybox ash
,unset PATH
tun Becken Befehle. Es funktioniert gut.cat
nochchmod
benötigen einen Pfad exec-ing, können Sie die ausführbare Datei wiederherstellen thusly:cat /proc/self/exe > busybox; chmod 755 busybox
.tac
Erfordert entweder eine suchbare Eingabedatei, die nicht immer verfügbar ist, oder das Lesen der gesamten Eingabe in den Speicher.cat
kann seine Eingaben von Anfang bis Ende lesen und verwerfen, was bereits verarbeitet wurde. Es ist viel einfacher zu implementieren und wird auch viel häufiger verwendet. Daher ist es sinnvoller, dieses zu optimieren.FEATURE_xxx
ist eine Kompilierungsoption für BusyBox als Ganzes. Die Angaben nofork und noexec spielen nur dann eine Rolle, wenn sieFEATURE_PREFER_APPLETS
aktiv sind (zumindest zum Ausführen eines Befehls in der Shell werden sie auch in einigen anderen Kontexten verwendet).is there a way to safely test it?
Mit dem generischen x86-OpenWRT-Image:Die meisten Befehle sind nicht integriert, einige jedoch wie
echo
undprintf
. Eine Binärdatei mit beliebigen Inhalten kann mit erstellt werdenprintf
, ist jedochchmod +x
ein Problem.quelle
/bin/ash -> busybox
.FEATURE_SH_STANDALONE
aktiviert, wird dieses Verhalten nicht angezeigt. Die zweitemv
wird einwandfrei funktionieren.