Чи справді вбудовані команди BusyBox?


28

Я читав знамениту легенду про відновлення Unix , і мені спало на думку цікаво:

Якби у мене була відкрита оболонка BusyBox, а сам двійковий файл BusyBox був видалений, я все-таки зможу використовувати всі команди, що входять у двійковий файл BusyBox?

Зрозуміло, я не зможу використовувати BB-версію цих команд з іншої запущеної оболонки, наприклад bash, оскільки сам файл BusyBox був би недоступний для bashвідкриття та запуску. Але зсередини запущеного примірника BusyBox, мені здається, може існувати два методи, за допомогою яких BB запускає команду:

  1. Він може розщедрити і виконати новий екземпляр BusyBox, викликавши його, використовуючи відповідне ім'я - та прочитавши файл BusyBox з диска для цього.
  2. Він може розщедритися і виконати деяку внутрішню логіку для запуску зазначеної команди (наприклад, запустивши її як виклик функції).

Якщо (1) працює таким чином BusyBox, я б очікував, що певні команди, надані BusyBox, стануть недоступними в запущеному екземплярі BB після видалення бінарного BB.

Якщо (2) це працює, BusyBox можна було б використовувати навіть для відновлення системи, де був видалений сам BB - за умови, що все ще доступний запущений екземпляр BusyBox.

Це десь задокументовано? Якщо ні, чи є спосіб безпечно перевірити його?


2
is there a way to safely test it?Завантажте загальне openwrtзображення x86 та додайте зображення до нової машини VirtualBox
басейну

2
І це викликає питання, як продовжують працювати команди Busybox після того, як PATHне встановлено? Чи передбачає це значення за замовчуванням PATH?
муру

2
@muru: З вихідного коду (принаймні, для його зольного клону) схоже, що він ставиться до невстановленого PATH так само, як і до порожнього рядка, тому він шукає поточний каталог, і тільки це.
Геннінг Макгольм

@HenningMakholm Ну, на мій коментар відповіла відповідь Гілла. Однак добре це знати - я очікував, що працюватимуть лише побудови.
муру

Відповіді:


33

За замовчуванням BusyBox не робить нічого особливого щодо вбудованих аплетів (команди, перелічені з busybox --help).

Однак якщо параметри FEATURE_SH_STANDALONEта FEATURE_PREFER_APPLETSпараметри включені під час компіляції, тоді, коли BusyBox sh¹ виконує команду, яка є відомим іменем аплету, вона не робить звичайного PATHпошуку, а замість цього виконує вбудовані аплети через ярлик:

  • Аплети, які у вихідному коді оголошені як "noexec", виконуються як виклики функцій у роздвоєному процесі. Станом BusyBox 1,22, такі аплети поехес: 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.
  • Аплети, які у вихідному коді оголошені як "nofork", виконуються як виклики функцій у тому ж процесі. Станом BusyBox 1,22, такі аплети nofork: [[, [, basename, cat, dirname, echo, false, fsync, length, logname, mkdir, printenv, printf, pwd, rm, rmdir, seq, sync, test, true, usleep, whoami, yes.
  • Інші аплети дійсно виконуються (з forkі execve), але замість того, щоб робити PATHпошук, BusyBox виконує /proc/self/exe, якщо вони доступні (як правило, це в Linux) та шлях, визначений під час компіляції в іншому випадку.

Це задокументовано трохи детальніше в docs/nofork_noexec.txt. Декларації аплету містяться у include/applets.src.hвихідному коді.

Більшість конфігурацій за замовчуванням вимикають ці функції, так що BusyBox виконує зовнішні команди, як і будь-яка інша оболонка. Debian вмикає ці функції і в своїх, busyboxі в busybox-staticпакунках.

Отже, якщо у вас є компільований виконуваний файл BusyBox FEATURE_SH_STANDALONEі FEATURE_PREFER_APPLETS, ви можете виконати всі команди BusyBox з оболонки BusyBox, навіть якщо виконуваний файл видалений (за винятком аплетів, які не перераховані вище, якщо /proc/self/exeвони недоступні).

¹ Насправді є дві реалізації "sh" у BusyBox - ash та hush - але вони поводяться однаково в цьому відношенні.


1
@Wildcard FEATURE_PREFER_APPLETSі FEATURE_SH_STANDALONEє прапорцями часу компіляції, що дозволяють або вимикають функції. Аплетки розмічені noforkі noexecнезалежно від того, які прапори використовували. Від того, чи матиме таке маркування вплив, залежить від FEATURE_PREFER_APPLETSтого, чи ввімкнено. Отже, три можливі поведінки: 1. FEATURE_PREFER_APPLETSвимкнено, 2. FEATURE_PREFER_APPLETSувімкнено і аплет є nofork, 3. FEATURE_PREFER_APPLETSувімкнено, а аплет є noexec. Третій пункт у документах це добре пояснює. І останній розділ показує можливі випадки.
муру

1
@Wildcard FEATURE_SH_STANDALONE(що вимагає FEATURE_PREFER_APPLETS). noforkне потрібна. З FEATURE_SH_STANDALONE, /proc/self/exeвикористовується у відповідних випадках, тому він буде працювати, навіть якщо BB був видалений . Ви можете перевірити це з досить мінімальним ризиком на будь-якому Debian або Arch Linux systm, запуску busybox ash, unset PATHвиконайте команди Басина. Це чудово працює.
муру

3
У системі Ubuntu 14.04.1 LTS Busybox налаштований на перевагу аплетів. Оскільки ні catні chmodне вимагає Exec-кий шлях до файлу, ви можете відновити виконуваний файл таким чином: cat /proc/self/exe > busybox; chmod 755 busybox.
босоніж IO

1
@forest Існує величезна різниця: tacпотрібно або шукати вхідний файл, який не завжди доступний, або читати весь вхід у пам'ять. catможе читати його дані від початку до кінця, відкидаючи те, що вже оброблено. Це набагато простіше у виконанні, а також він набагато частіше використовується, тому має сенс оптимізувати його.
hvd

1
@Wildcard Nofork та noexec - це вказівки, встановлені для кожного аплету. FEATURE_xxxє варіантом часу компіляції для BusyBox в цілому. Показники nofork та noexec мають значення лише у тому випадку, якщо FEATURE_PREFER_APPLETSвони активні (принаймні, для виконання команди в оболонці, вони також використовуються в деяких інших контекстах).
Жил "ТАК - перестань бути злим"

8

is there a way to safely test it? З загальним зображенням x86 openwrt:

скріншот vbox

Більшість команд не є вбудованими, але деякі є, як echoі printf. Бінарний файл з довільним вмістом можна створити за допомогою printf, але chmod +xце буде проблемою.


Цікаво; Ви це запускаєте зсередини BusyBox чи іншої оболонки?
Уайлдкард

4
(Також ви б заперечили вставити текст, а не скріншот?)
Wildcard

@Wildcard /bin/ash -> busybox.
басейн

1
Як і у відповіді Жиля, якщо FEATURE_SH_STANDALONEце ввімкнено, ви не отримаєте такої поведінки. Другий mvбуде добре працювати.
муру
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.