Czy polecenia BusyBox są naprawdę wbudowane?

28

Czytałem słynną Legendę odzyskiwania systemu Unix i przyszło mi do głowy, aby się zastanawiać:

Gdybym miał otwartą powłokę BusyBox, a sam plik binarny BusyBox zostałby usunięty, czy nadal będę mógł używać wszystkich poleceń zawartych w pliku binarnym BusyBox?

Oczywiście nie byłbym w stanie użyć wersji BB tych poleceń z innej działającej powłoki, takiej jak bash, ponieważ sam plik BusyBox byłby niedostępny bashdo otwarcia i uruchomienia. Ale z działającej instancji BusyBox wydaje mi się, że mogą istnieć dwie metody, za pomocą których BB uruchamia polecenie:

  1. Może rozwidlać i wykonywać nową instancję BusyBox, wywołując ją przy użyciu odpowiedniej nazwy - i w tym celu odczytując plik BusyBox z dysku.
  2. Może rozwidlać i wykonywać wewnętrzną logikę, aby uruchomić określone polecenie (na przykład uruchamiając je jako wywołanie funkcji).

Jeśli (1) jest sposobem działania BusyBox, oczekiwałbym, że niektóre polecenia dostarczone przez BusyBox staną się niedostępne z działającej instancji BB po usunięciu pliku binarnego BB.

Jeśli (2) działa, BusyBox może być użyty nawet do odzyskania systemu, w którym usunięto sam BB - pod warunkiem, że nadal dostępna jest działająca instancja BusyBox.

Czy jest to gdziekolwiek udokumentowane? Jeśli nie, czy istnieje sposób na bezpieczne przetestowanie?

Dzika karta
źródło
2
is there a way to safely test it?Pobierz ogólny openwrtobraz x86 i dołącz obraz do nowej maszyny VirtualBox
dorzecza
2
Rodzi to pytanie, w jaki sposób polecenia Busybox nadal działają po rozbrojeniu PATH? Czy przyjmuje wartość domyślną PATH?
mur
2
@muru: Z kodu źródłowego (przynajmniej dla jego jesionowego klonu) wygląda tak, jakby traktuje on nieuzbrojoną ŚCIEŻKĘ tak samo, jak pusty ciąg, więc przeszukuje bieżący katalog i tylko to.
Henning Makholm
@HenningMakholm Cóż, na mój komentarz odpowiedział odpowiedź Gillesa. Jednak dobrze jest wiedzieć - spodziewałem się, że tylko wbudowane będą działać.
muru

Odpowiedzi:

33

Domyślnie BusyBox nie robi nic specjalnego w odniesieniu do wbudowanych apletów (komendy wymienione jako busybox --help).

Jeśli jednak opcje FEATURE_SH_STANDALONEi FEATURE_PREFER_APPLETSsą włączone w czasie kompilacji, to gdy BusyBox sh¹ wykonuje polecenie o znanej nazwie apletu, nie wykonuje normalnego PATHwyszukiwania, ale uruchamia wbudowane aplety za pomocą skrótu:

  • Aplety zadeklarowane w kodzie źródłowym jako „noexec” są wykonywane jako wywołania funkcji w procesie rozwidlenia. Począwszy od BusyBox 1,22 następujące Programy te są 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.
  • Aplety zadeklarowane jako „nofork” w kodzie źródłowym są wykonywane jako wywołania funkcji w tym samym procesie. Począwszy od BusyBox 1,22 następujące Programy te są nofork: [[, [, basename, cat, dirname, echo, false, fsync, length, logname, mkdir, printenv, printf, pwd, rm, rmdir, seq, sync, test, true, usleep, whoami, yes.
  • Inne aplety są naprawdę wykonywane (za pomocą forki execve), ale zamiast PATHwyszukiwania, BusyBox wykonuje się /proc/self/exe, jeśli są dostępne (co zwykle ma miejsce w Linuksie), a ścieżka jest zdefiniowana w innym czasie.

Jest to udokumentowane bardziej szczegółowo w docs/nofork_noexec.txt. Deklaracje apletów znajdują się w include/applets.src.hkodzie źródłowym.

Większość domyślnych konfiguracji wyłącza te funkcje, dzięki czemu BusyBox wykonuje polecenia zewnętrzne, jak każda inna powłoka. Debian włącza te funkcje zarówno w swoim pakiecie, jak busyboxi w busybox-staticpakietach.

Więc jeśli masz skompilowany plik wykonywalny BusyBox, FEATURE_SH_STANDALONEi FEATURE_PREFER_APPLETSmożesz wykonać wszystkie polecenia BusyBox z powłoki BusyBox, nawet jeśli plik wykonywalny jest usunięty (z wyjątkiem apletów, które nie są wymienione powyżej, jeśli /proc/self/exenie są dostępne).

¹ W BusyBox istnieją dwie implementacje „sh” - ash i hush - ale pod tym względem zachowują się tak samo.

Gilles „SO- przestań być zły”
źródło
1
@Wildcard FEATURE_PREFER_APPLETSi FEATURE_SH_STANDALONEsą flagami czasu kompilacji, włączającymi lub wyłączającymi funkcje. Aplety są oznaczone noforki noexecniezależnie od użytych flag. To, czy takie oznaczenia mają jakikolwiek wpływ, zależy od FEATURE_PREFER_APPLETSwłączenia. Stąd trzy możliwe zachowania: 1. FEATURE_PREFER_APPLETSwyłączone, 2. FEATURE_PREFER_APPLETSwłączone i aplet jest nofork, 3. FEATURE_PREFER_APPLETSwłączone i aplet jest noexec. Trzeci akapit w doktrynach ładnie to wyjaśnia. I ostatnia sekcja pokazuje możliwe przypadki.
muru,
1
@Wildcard FEATURE_SH_STANDALONE(która wymaga FEATURE_PREFER_APPLETS). noforknie jest potrzebne. Z FEATURE_SH_STANDALONE, /proc/self/exejest używany tam, gdzie ma to zastosowanie, więc będzie działać, nawet jeśli BB został usunięty . Można to sprawdzić się z dość minimalnym ryzyku na jakimkolwiek SYSTM Debian lub Arch Linux, perspektywie busybox ash, unset PATHwykonaj polecenia Basin jest. To działa dobrze.
mur
3
W systemie LTS Ubuntu 14.04.1 Busybox jest skonfigurowany tak, aby preferował aplety. Ponieważ ani catteż nie chmodwymagają exec-ing na ścieżkę, można odzyskać plik wykonywalny wygląda następująco: cat /proc/self/exe > busybox; chmod 755 busybox.
Boso IO
1
@forest Istnieje ogromna różnica: tacwymaga albo widocznego pliku wejściowego, który nie zawsze jest dostępny, albo wczytania całego wejścia do pamięci. catmoże odczytać dane wejściowe od początku do końca, odrzucając to, co już zostało przetworzone. Jest o wiele łatwiejszy do wdrożenia i jest również o wiele częściej używany, więc sensowniej jest go zoptymalizować.
hvd
1
@Wildcard Nofork i noexec są wskazaniami ustawionymi dla każdego apletu. FEATURE_xxxjest opcją kompilacji w czasie dla BusyBox jako całości. Wskazania nofork i noexec mają znaczenie tylko wtedy, gdy FEATURE_PREFER_APPLETSsą aktywne (przynajmniej w celu wykonania polecenia w powłoce są one również używane w innych kontekstach).
Gilles „SO- przestań być zły”
8

is there a way to safely test it? Z ogólnym obrazem openwrt x86:

zrzut ekranu vbox

Większość poleceń nie jest wbudowana, ale niektóre są takie jak echoi printf. Plik binarny z dowolną zawartością można utworzyć za pomocą printf, ale chmod +xbędzie to problem.

basen
źródło
Ciekawy; uruchamiasz to z poziomu samego BusyBox, czy innej powłoki?
Wildcard
4
(Czy wolisz wkleić tekst niż zrzut ekranu?)
Wildcard,
@Wildcard /bin/ash -> busybox.
dorzecze
1
Tak jak w odpowiedzi Gillesa, jeśli FEATURE_SH_STANDALONEjest włączona, nie dostaniesz tego zachowania. Drugi mvbędzie działał idealnie dobrze.
muru