Saya sedang membaca Legenda Pemulihan Unix yang terkenal , dan terpikir oleh saya untuk bertanya:
Jika saya memiliki shell BusyBox terbuka, dan biner BusyBox itu sendiri dihapus, apakah saya masih dapat menggunakan semua perintah yang termasuk dalam biner BusyBox?
Jelas saya tidak akan dapat menggunakan versi BB perintah orang-orang dari lain shell berjalan seperti bash
, karena file BusyBox itu sendiri akan tersedia untuk bash
untuk membuka dan menjalankan. Tapi dari dalam instance BusyBox yang sedang berjalan, menurut saya mungkin ada dua metode yang digunakan BB untuk menjalankan perintah:
- Itu dapat melakukan fork dan mengeksekusi instance baru BusyBox, menyebutnya menggunakan nama yang sesuai — dan membaca file BusyBox dari disk untuk melakukannya.
- Itu bisa fork dan melakukan beberapa logika internal untuk menjalankan perintah yang ditentukan (misalnya, dengan menjalankannya sebagai panggilan fungsi).
Jika (1) adalah cara BusyBox bekerja, saya berharap bahwa perintah-perintah yang disediakan BusyBox tertentu tidak akan tersedia dari dalam instance BB yang berjalan setelah biner BB dihapus.
Jika (2) cara kerjanya, BusyBox dapat digunakan bahkan untuk pemulihan sistem di mana BB itu sendiri telah dihapus — asalkan masih ada instance berjalan BusyBox yang dapat diakses.
Apakah ini didokumentasikan di mana saja? Jika tidak, adakah cara untuk mengujinya dengan aman?
sumber
is there a way to safely test it?
Unduhopenwrt
gambar x86 generik dan lampirkan gambar tersebut ke mesin VirtualBox baruPATH
tidak disetel? Apakah ini mengasumsikan nilai defaultPATH
?Jawaban:
Secara default, BusyBox tidak melakukan sesuatu yang spesial sehubungan dengan applet yang telah dibangunnya (perintah-perintah terdaftar dengan
busybox --help
).Namun, jika opsi
FEATURE_SH_STANDALONE
danFEATURE_PREFER_APPLETS
diaktifkan pada waktu kompilasi, maka ketika BusyBox sh¹ mengeksekusi perintah yang merupakan nama applet yang dikenal, itu tidak melakukanPATH
pencarian normal , tetapi menjalankan applet built-in melalui shortcut: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
danexecve
), tetapi alih-alih melakukanPATH
pencarian, BusyBox mengeksekusi/proc/self/exe
, jika tersedia (yang biasanya terjadi di Linux), dan jalur yang ditentukan pada waktu kompilasi sebaliknya.Ini didokumentasikan sedikit lebih detail di
docs/nofork_noexec.txt
. Deklarasi applet ada diinclude/applets.src.h
dalam kode sumber.Sebagian besar konfigurasi default mematikan fitur-fitur ini, sehingga BusyBox menjalankan perintah eksternal seperti shell lainnya. Debian mengaktifkan fitur-fitur ini baik dalam paketnya
busybox
maupunbusybox-static
.Jadi jika Anda memiliki BusyBox yang dapat dieksekusi dikompilasi dengan
FEATURE_SH_STANDALONE
danFEATURE_PREFER_APPLETS
, maka Anda dapat menjalankan semua perintah BusyBox dari shell BusyBox bahkan jika executable dihapus (kecuali untuk applet yang tidak tercantum di atas, jika/proc/self/exe
tidak tersedia).¹ Sebenarnya ada dua implementasi "sh" di BusyBox - ash dan hush - tetapi mereka berperilaku yang sama dalam hal ini.
sumber
FEATURE_PREFER_APPLETS
danFEATURE_SH_STANDALONE
merupakan flag waktu kompilasi, yang mengaktifkan atau menonaktifkan fitur. Applet ditandainofork
dannoexec
terlepas dari bendera mana yang digunakan. Apakah tanda tersebut berpengaruh atau tidak tergantung padaFEATURE_PREFER_APPLETS
diaktifkan. Oleh karena itu, tiga perilaku yang mungkin: 1.FEATURE_PREFER_APPLETS
dinonaktifkan, 2.FEATURE_PREFER_APPLETS
diaktifkan dan applet adalahnofork
, 3.FEATURE_PREFER_APPLETS
diaktifkan dan appletnoexec
. Para ketiga dalam dokumen menjelaskannya dengan baik. Dan bagian terakhir menunjukkan kemungkinan kasus.FEATURE_SH_STANDALONE
(yang mengharuskanFEATURE_PREFER_APPLETS
).nofork
tidak dibutuhkan. DenganFEATURE_SH_STANDALONE
,/proc/self/exe
digunakan jika berlaku, sehingga akan berfungsi bahkan jika BB telah dihapus . Anda dapat menguji ini dengan risiko cukup minimal pada setiap systm Debian atau Arch Linux, runbusybox ash
,unset PATH
, lakukan perintah cekungan ini. Ini bekerja dengan baik.cat
atauchmod
membutuhkan exec-ing pathname, Anda dapat memulihkan executable sebagai berikut: untukcat /proc/self/exe > busybox; chmod 755 busybox
.tac
membutuhkan file input yang dapat dicari yang tidak selalu tersedia, atau membaca seluruh input ke dalam memori.cat
dapat membaca inputnya dari awal hingga akhir, membuang apa yang sudah diproses. Ini jauh lebih mudah diimplementasikan dan juga lebih umum digunakan, jadi lebih masuk akal untuk mengoptimalkan yang itu.FEATURE_xxx
adalah opsi waktu kompilasi untuk BusyBox secara keseluruhan. Indikasi nofork dan noexec hanya penting jikaFEATURE_PREFER_APPLETS
aktif (setidaknya untuk tujuan mengeksekusi perintah di shell, mereka juga digunakan dalam beberapa konteks lain).is there a way to safely test it?
Dengan gambar openwrt x86 generik:Sebagian besar perintah tidak built-in, tetapi ada juga yang seperti
echo
danprintf
. File biner dengan konten sewenang-wenang dapat dibuat menggunakanprintf
, tetapichmod +x
akan menjadi masalah.sumber
/bin/ash -> busybox
.FEATURE_SH_STANDALONE
diaktifkan, Anda tidak akan mendapatkan perilaku ini. Yang keduamv
akan bekerja dengan baik.