Sind BusyBox-Befehle wirklich eingebaut?

28

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 bashzum Ö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:

  1. 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.
  2. 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?

Platzhalter
quelle
2
is there a way to safely test it?Laden Sie das generische x86 openwrtBild und fügen Sie das Bild auf ein neuen VirtualBox Maschine
Becken
2
Und dies wirft die Frage auf, wie Busybox-Befehle weiter funktionieren, nachdem sie PATHdeaktiviert wurden. Nimmt es einen Standardwert von an PATH?
muru
2
@muru: Aus dem Quellcode (zumindest für seinen Ash-Klon) sieht es so aus, als würde er einen nicht gesetzten Pfad genauso behandeln wie einen leeren String, also durchsucht er das aktuelle Verzeichnis und nur das.
Henning Makholm
@ HenningMakholm Nun, mein Kommentar wurde von Gilles 'Antwort beantwortet. Es ist jedoch gut zu wissen, dass - ich hatte erwartet, dass nur integrierte Funktionen funktionieren.
muru

Antworten:

33

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_STANDALONEund FEATURE_PREFER_APPLETSzur Kompilierungszeit aktiviert sind, führt BusyBox sh¹ beim Ausführen eines Befehls, bei dem es sich um einen bekannten Applet-Namen handelt, nicht die normale PATHSuche durch, sondern führt die integrierten Applets über eine Verknüpfung aus:

  • Applets, die im Quellcode als "noexec" deklariert sind, werden als Funktionsaufrufe in einem gegabelten Prozess ausgeführt. Ab BusyBox 1.22 werden die folgenden Applets sind noexec: 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.
  • Applets, die im Quellcode als "nofork" deklariert sind, werden im selben Prozess als Funktionsaufrufe ausgeführt. Ab BusyBox 1,22 sind die folgenden Applets nofork: [[, [, basename, cat, dirname, echo, false, fsync, length, logname, mkdir, printenv, printf, pwd, rm, rmdir, seq, sync, test, true, usleep, whoami, yes.
  • Andere Applets werden tatsächlich ausgeführt (mit forkund execve). Anstatt jedoch eine PATHSuche 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 im include/applets.src.hQuellcode.

Die meisten Standardkonfigurationen deaktivieren diese Funktionen, sodass BusyBox wie jede andere Shell externe Befehle ausführt. Debian aktiviert diese Funktionen sowohl in seiner busyboxals auch in seinen busybox-staticPaketen.

Wenn Sie also eine ausführbare BusyBox-Datei mit FEATURE_SH_STANDALONEund kompiliert haben FEATURE_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/exenicht verfügbar sind).

¹ In BusyBox gibt es zwei Implementierungen von "sh" - ash und hush -, die sich jedoch in dieser Hinsicht gleich verhalten.

Gilles 'SO - hör auf böse zu sein'
quelle
1
@Wildcard FEATURE_PREFER_APPLETSund FEATURE_SH_STANDALONEsind Flags zur Kompilierungszeit, die Funktionen aktivieren oder deaktivieren. Die Applets sind markiert noforkund noexecunabhängig davon, welche Flags verwendet wurden. Ob solche Markierungen eine Wirkung haben oder nicht, hängt davon ab FEATURE_PREFER_APPLETS, ob sie aktiviert sind. Daher gibt es drei mögliche Verhaltensweisen: 1. FEATURE_PREFER_APPLETSdeaktiviert, 2. FEATURE_PREFER_APPLETSaktiviert und Applet ist nofork, 3. FEATURE_PREFER_APPLETSaktiviert und Applet ist noexec. Der dritte Absatz in den Dokumenten erklärt es gut. Und der letzte Abschnitt zeigt die möglichen Fälle.
muru
1
@Wildcard FEATURE_SH_STANDALONE(was erfordert FEATURE_PREFER_APPLETS). noforkwird nicht benötigt. Mit FEATURE_SH_STANDALONE, /proc/self/exewird 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, laufen busybox ash, unset PATHtun Becken Befehle. Es funktioniert gut.
muru
3
Auf einem Ubuntu 14.04.1 LTS-System ist Busybox so konfiguriert, dass Applets bevorzugt werden. Da weder catnoch chmodbenötigen einen Pfad exec-ing, können Sie die ausführbare Datei wiederherstellen thusly: cat /proc/self/exe > busybox; chmod 755 busybox.
Barfuß IO
1
@forest Es gibt einen großen Unterschied: tacErfordert entweder eine suchbare Eingabedatei, die nicht immer verfügbar ist, oder das Lesen der gesamten Eingabe in den Speicher. catkann 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.
HDV
1
@Wildcard Nofork und noexec sind Angaben, die auf jedem Applet festgelegt sind. FEATURE_xxxist eine Kompilierungsoption für BusyBox als Ganzes. Die Angaben nofork und noexec spielen nur dann eine Rolle, wenn sie FEATURE_PREFER_APPLETSaktiv sind (zumindest zum Ausführen eines Befehls in der Shell werden sie auch in einigen anderen Kontexten verwendet).
Gilles 'SO- hör auf böse zu sein'
8

is there a way to safely test it? Mit dem generischen x86-OpenWRT-Image:

vbox screenshot

Die meisten Befehle sind nicht integriert, einige jedoch wie echound printf. Eine Binärdatei mit beliebigen Inhalten kann mit erstellt werden printf, ist jedoch chmod +xein Problem.

Becken
quelle
Interessant; Führen Sie das in BusyBox selbst oder einer anderen Shell aus?
Wildcard
4
(Würde es Ihnen auch etwas ausmachen, den Text anstatt eines Screenshots einzufügen?)
Wildcard
@Wildcard /bin/ash -> busybox.
Becken
1
Wie in Gilles 'Antwort, wenn FEATURE_SH_STANDALONEaktiviert, wird dieses Verhalten nicht angezeigt. Die zweite mvwird einwandfrei funktionieren.
muru