BusyBox komutları gerçekten yerleşik mi?


28

Ünlü Unix Kurtarma Efsanesini okuyordum ve şunu merak ettim:

Açık bir BusyBox kabuğum olsaydı ve BusyBox ikilisinin kendisi silinmiş olsaydı, hala BusyBox ikilisinde bulunan tüm komutları kullanabilir miydim?

Açıkçası ben gelenler komutların BB sürümünü kullanmak mümkün olmaz başka gibi çalışan kabuk bashBusyBox Dosyanın kendisi için kullanılamaz olacaktır çünkü bashaçık ve run. Ancak BusyBox'un çalışan örneğinden, bana öyle geliyor ki, BB'nin bir komutu çalıştırması için iki yöntem olabilir:

  1. Yeni bir BusyBox örneğini çatallayabilir ve çalıştırabilir, uygun adı kullanarak çağırabilir ve BusyBox dosyasını diskten okuyabilir.
  2. Belirtilen komutu çalıştırmak için bir içsel mantık kurabilir ve gerçekleştirebilir (örneğin, işlev çağrısı olarak çalıştırarak).

(1) BusyBox'ın çalışma şekliyse, BB ikili dosyası silindikten sonra belirli bir BusyBox tarafından sağlanan komutların çalışan bir BB örneği içinden kullanılamayacağını umardım.

(2) nasıl çalışırsa, BusyBox, hala BB'nin silindiği bir sistemin kurtarılması için bile kullanılabilir - hala çalışan bir BusyBox örneği mevcut olması koşuluyla.

Bu herhangi bir yerde belgeleniyor mu? Değilse, güvenle test etmenin bir yolu var mı?


2
is there a way to safely test it?Genel x86 openwrtresmi indirin ve resmi yeni bir VirtualBox makinesine ekleyin
havza

2
Ve bu soruyu gündeme getiriyor, Busybox komutları ayarlandıktan sonra nasıl çalışmaya devam ediyor PATH? Varsayılan bir değer kabul ediyor PATHmu?
muru

2
@muru: Kaynak kodundan (en azından onun kül klonu için), boş bir dizgeyle aynı şekilde ayarlanmamış bir PATH'a davrandığı gibi görünüyor, bu nedenle geçerli dizini arar ve yalnızca bu.
Henning Makholm

@HenningMakholm Peki, yorumum Gilles 'cevabı tarafından cevaplandı. Ancak, bunu bilmek güzel - sadece işe yaramazların yapması bekleniyor.
muru

Yanıtlar:


33

Varsayılan olarak, BusyBox yerleşik olduğu uygulamalarla ilgili özel bir şey yapmaz (ile listelenen komutlar busybox --help).

Bununla birlikte, FEATURE_SH_STANDALONEve FEATURE_PREFER_APPLETSseçenekleri derleme zamanında etkinse, BusyBox bilinen bir uygulama adı olan bir komutu çalıştırdığında normal PATHaramayı yapmaz , bunun yerine yerleşik uygulamalarını kısayoldan çalıştırır:

  • Kaynak kodunda "noexec" olarak bildirilen aparatlar, çatallı bir işlemde fonksiyon çağrıları olarak yürütülür. BusyBox 1.22 itibariyle, aşağıdaki uygulamalar noexec şunlardır: 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.
  • Kaynak kodunda “nofor” olarak bildirilen aparatlar aynı süreçte fonksiyon çağrıları olarak yürütülür. BusyBox 1.22 itibariyle, aşağıdaki uygulamalar nofork şunlardır: [[, [, basename, cat, dirname, echo, false, fsync, length, logname, mkdir, printenv, printf, pwd, rm, rmdir, seq, sync, test, true, usleep, whoami, yes.
  • Diğer uygulamalar gerçekten (ile forkve ile execve) yürütülür , ancak bir PATHarama yapmak yerine /proc/self/exe, varsa (normalde Linux'ta olduğu gibi) BusyBox , aksi takdirde derleme zamanında tanımlanmış bir yolu çalıştırır.

Bu, içinde biraz daha ayrıntılı olarak belgelenmiştir docs/nofork_noexec.txt. Uygulama bildirimleri include/applets.src.hkaynak kodundadır.

Çoğu varsayılan yapılandırma bu özellikleri kapatır, böylece BusyBox herhangi bir kabuk gibi harici komutları çalıştırır. Debian onun hem bu özellikleri açar busyboxve busybox-staticpaketler.

Yani bir BusyBox yürütülebilir ile derlenmiş varsa FEATURE_SH_STANDALONEve FEATURE_PREFER_APPLETS(eğer yukarıda yer almayan uygulamaları haricinde o zaman yürütülebilir silinmiş olsa bile bir BusyBox kabuğundan tüm BusyBox komutları yürütebilirsiniz, /proc/self/exemevcut değildir).

Y BusyBox'ta aslında "sh" nin iki uygulaması var - kül ve sus - ama bu açıdan aynı şekilde davranıyorlar.


1
@Wildcard FEATURE_PREFER_APPLETSve FEATURE_SH_STANDALONEderleme zamanı bayrakları, özellikleri etkinleştirme veya devre dışı bırakma. Applet'ler işaretlenir noforkve noexeckullanılan edildiği bayrakları bağımsız olarak. Bu tür işaretlemelerin herhangi bir etkisinin olup FEATURE_PREFER_APPLETSolmadığı, etkin olmasına bağlıdır . Bu nedenle, üç olası davranış: 1. FEATURE_PREFER_APPLETSdevre dışı, 2. FEATURE_PREFER_APPLETSetkin ve uygulama nofork, 3. FEATURE_PREFER_APPLETSetkin ve uygulama noexec. Dokümanlardaki üçüncü paragraf bunu güzelce açıklar. Ve son bölüm olası davaları göstermektedir.
muru

1
@Wildcard FEATURE_SH_STANDALONE(gerektirir FEATURE_PREFER_APPLETS). noforkgerekli değil. İle FEATURE_SH_STANDALONE, /proc/self/exeuygulanabildiği yerde kullanılır, bu yüzden çalışacak BB silindi bile . Sen oldukça az herhangi Debian veya Arch Linux systm üzerinde risk, kaçak ile bu test edebilirsiniz busybox ash, unset PATH, Havza komutları yok. İyi çalışıyor.
muru

3
Bir Ubuntu 14.04.1 LTS sisteminde, Busybox uygulamaları tercih etmek üzere yapılandırılmıştır. Ne yana catne de chmodexec-ing bir yol adı gerektirir, sen thusly çalıştırılabilir kurtarabilirsiniz: cat /proc/self/exe > busybox; chmod 755 busybox.
Yalınayak IO

1
@forest Çok büyük bir fark var: tacya her zaman ulaşılamayan aranabilir bir giriş dosyası ya da tüm girişi belleğe okumayı gerektirir. catGirişini baştan sona okuyabilir, işlenmiş olanı elden çıkarabilir. Uygulaması çok daha kolay ve ayrıca çok daha yaygın olarak kullanılıyor, bu yüzden onu optimize etmek daha mantıklı.
hvd

1
@Wildcard Nofork ve noexec her uygulamada ayarlanan göstergelerdir. FEATURE_xxxBusyBox için bir bütün olarak derleme zamanı seçeneğidir. Nofork ve noexec endikasyonları sadece FEATURE_PREFER_APPLETSaktif olup olmadıklarına dikkat eder (en azından kabukta bir komut yürütmek amacıyla, başka bazı bağlamlarda da kullanılırlar).
Gilles 'SO- kötülük' dur

8

is there a way to safely test it? Genel x86 openwrt görüntüsü ile:

vbox ekran görüntüsü

Komutların çoğu yerleşik değildir, ancak bazıları echove gibidir printf. Keyfi içeriği olan bir ikili dosya kullanılarak oluşturulabilir printf, ancak chmod +xbir problem olacaktır.


İlginç; BusyBox içinden mi yoksa başka bir kabuktan mı koşuyorsun?
Joker

4
(Ayrıca, ekran görüntüsünden ziyade metnin içine yapıştırmayı
Wildcard

@Wildcard /bin/ash -> busybox.
Havzası

1
Gilles'un cevabında olduğu gibi, eğer FEATURE_SH_STANDALONEetkinse, bu davranışı elde edemezsiniz. İkinci mvmükemmel çalışacak.
muru
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.