क्या बिजीबॉक्स कमांड वास्तव में निर्मित हैं?


28

मैं प्रसिद्ध यूनिक्स रिकवरी लेजेंड पढ़ रहा था , और यह मेरे लिए आश्चर्य की बात है:

यदि मेरे पास एक बिजीबॉक्स शेल खुला था, और बिजीबॉक्स बाइनरी को स्वयं हटा दिया गया था, तो क्या मैं अभी भी बिजीबॉक्स बाइनरी में शामिल सभी कमांड का उपयोग कर पाऊंगा?

स्पष्ट रूप से मैं उन कमांडों के बीबी संस्करण का उपयोग किसी अन्य रनिंग शेल से नहीं कर पाऊंगा bash, जैसे कि खुद bashको खोलने और चलाने के लिए बिजीबॉक्स फ़ाइल अनुपलब्ध होगी । लेकिन बिजीबॉक्स के चल रहे उदाहरण के भीतर, यह मुझे प्रतीत होता है कि दो तरीके हो सकते हैं जिनके द्वारा बीबी एक कमांड चलाएगा:

  1. यह फ़ॉरेस्टबॉक्स के एक नए उदाहरण को कांटा और निष्पादित कर सकता है, इसे उपयुक्त नाम का उपयोग करके कॉल करता है - और ऐसा करने के लिए डिस्क से बिजीबॉक्स फ़ाइल को पढ़ना।
  2. यह निर्दिष्ट कमांड को चलाने के लिए कुछ आंतरिक तर्क को कांटा और प्रदर्शन कर सकता है (उदाहरण के लिए, इसे फ़ंक्शन कॉल के रूप में चलाकर)।

अगर (1) बिजीबॉक्स काम करने का तरीका है, तो मैं उम्मीद करूंगा कि बी बी के डिलीट होने के बाद बी बी के रनिंग इंस्टेंस के भीतर से कुछ बिजीबॉक्स-उपलब्ध कमांड अनुपलब्ध हो जाएंगे।

यदि (2) यह कैसे काम करता है, तो बिजीबॉक्स का इस्तेमाल उस सिस्टम की रिकवरी के लिए भी किया जा सकता है, जहां बीबी खुद को डिलीट कर चुका था-बशर्ते कि वहां पर अभी भी बिजीबॉक्स एक्सेस का रनिंग इंस्टेंस हो।

क्या यह कहीं भी प्रलेखित है? यदि नहीं, तो क्या इसका सुरक्षित परीक्षण करने का कोई तरीका है?


2
is there a way to safely test it?जेनेरिक x86 openwrtछवि को डाउनलोड करें और छवि को एक नए वर्चुअलबॉक्स मशीन
बेसिन

2
और यह सवाल उठाता है, कि कैसे व्यस्त होने के बाद बिजीबॉक्स कमांड काम करना जारी रखते हैं PATH? क्या यह एक डिफ़ॉल्ट मान है PATH?
मुरु

2
@ एमुरु: स्रोत कोड से (कम से कम इसके ऐश क्लोन के लिए) ऐसा लगता है कि यह एक परेशान पेट का इलाज करता है क्योंकि यह एक खाली स्ट्रिंग होगा, इसलिए यह वर्तमान निर्देशिका को खोजता है, और केवल यही।
हेनिंग मैखोलम

@ हेनिंगमखोलम खैर, मेरी टिप्पणी का जवाब गिल्स ने दिया। हालांकि, यह जानना अच्छा है कि - मुझे काम करने के लिए केवल बिलिन की उम्मीद थी।
मूरू

जवाबों:


33

डिफ़ॉल्ट रूप से, बिजीबॉक्स उन एप्लेट्स के संबंध में कुछ विशेष नहीं करता है जो उसने (कमांड्स लिस्टेड busybox --help) में बनाए हैं ।

हालाँकि, यदि संकलन के समय विकल्प FEATURE_SH_STANDALONEऔर FEATURE_PREFER_APPLETSविकल्प सक्षम हैं, तो जब बिजीबॉक्स shutes एक कमांड निष्पादित करता है, जो एक ज्ञात एप्लेट नाम है, तो यह सामान्य PATHलुकअप नहीं करता है , बल्कि शॉर्टकट के माध्यम से इसके बिल्ट-इन एप्लेट्स चलाता है:

  • स्रोत कोड में "noexec" के रूप में घोषित किए गए Apple को कांटे की प्रक्रिया में फ़ंक्शन कॉल के रूप में निष्पादित किया जाता है। बिजीबॉक्स 1.22 तक निम्नलिखित एप्लेट 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
  • स्रोत कोड में "nofork" के रूप में घोषित किए गए Apple को एक ही प्रक्रिया में फ़ंक्शन कॉल के रूप में निष्पादित किया जाता है। बिजीबॉक्स 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लुकअप करने के बजाय , बिजीबॉक्स निष्पादित करता है /proc/self/exe, यदि उपलब्ध हो (जो कि आमतौर पर लिनक्स पर मामला होता है), और अन्यथा संकलन समय पर निर्धारित पथ।

यह थोड़ा और अधिक विस्तार से प्रलेखित है docs/nofork_noexec.txt। एप्लेट घोषणाएँ include/applets.src.hस्रोत कोड में हैं।

अधिकांश डिफ़ॉल्ट कॉन्फ़िगरेशन इन सुविधाओं को बंद कर देते हैं, ताकि बिजीबॉक्स किसी अन्य शेल की तरह बाहरी कमांड निष्पादित करता है। डेबियन अपने busyboxऔर busybox-staticपैकेज दोनों में इन सुविधाओं को चालू करता है।

इसलिए यदि आपके पास एक बिजीबॉक्स निष्पादन योग्य है FEATURE_SH_STANDALONEऔर FEATURE_PREFER_APPLETSउसके साथ संकलित किया गया है , तो आप एक बिजीबॉक्स शेल से सभी बिजीबॉक्स कमांड निष्पादित कर सकते हैं, भले ही एग्जीक्यूटिव डिलीट हो जाए (ऊपर सूचीबद्ध नहीं किए गए एप्लेट्स को छोड़कर, यदि /proc/self/exeउपलब्ध नहीं है)।

Ash वास्तव में बिजीबॉक्स में "श" के दो कार्यान्वयन हैं - राख और हश - लेकिन वे इस संबंध में उसी तरह का व्यवहार करते हैं।


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जहां लागू हो , का उपयोग किया जाता है, इसलिए यह तब भी काम करेगा जब बीबी हटा दी गई थी । आप किसी भी डेबियन या आर्क लिनक्स सिस्ट पर न्यूनतम जोखिम के साथ इसका परीक्षण कर सकते हैं busybox ash, unset PATHबेसिन के आदेशों को चला सकते हैं , चला सकते हैं । यह बढ़िया काम करता है।
मुरु

3
उबंटू 14.04.1 एलटीएस सिस्टम पर, एप्लेट्स को प्राथमिकता देने के लिए बिजीबॉक्स कॉन्फ़िगर किया गया है। चूंकि न तो catऔर न ही chmodकिसी pathname के लिए exec-ing की आवश्यकता होती है, इसलिए आप निष्पादन योग्य को पुनर्प्राप्त कर सकते हैं cat /proc/self/exe > busybox; chmod 755 busybox:।
बेयरफुट IO

1
@forest में एक बड़ा अंतर है: tacया तो एक खोजी इनपुट फ़ाइल की आवश्यकता होती है जो हमेशा उपलब्ध नहीं होती है, या पूरे इनपुट को मेमोरी में पढ़ना होता है। catशुरू से अंत तक इसके इनपुट को पढ़ सकते हैं, यह त्याग कर कि यह पहले से ही संसाधित है। इसे लागू करना बहुत आसान है और यह आमतौर पर बहुत अधिक उपयोग किया जाता है, इसलिए यह उस एक को अनुकूलित करने के लिए अधिक समझ में आता है।
hvd

1
@Wildcard Nofork और noexec प्रत्येक एप्लेट पर सेट किए गए संकेत हैं। FEATURE_xxxएक पूरे के रूप में बिजीबॉक्स के लिए संकलन-समय विकल्प है। नोफ़ॉर्क और नोएसेक संकेत केवल तभी मायने रखता है जब FEATURE_PREFER_APPLETSसक्रिय हो (कम से कम शेल में कमांड निष्पादित करने के उद्देश्य से, वे कुछ अन्य संदर्भों में भी उपयोग किए जाते हैं)।
गिल्स एसओ- बुराई को रोकना '

8

is there a way to safely test it? जेनेरिक x86 ओपेन राइट इमेज के साथ:

vbox स्क्रीनशॉट

अधिकांश कमांड बिल्ट-इन नहीं हैं, लेकिन कुछ हैं, जैसे echoऔर printf। मनमानी सामग्री के साथ एक बाइनरी फ़ाइल का उपयोग करके बनाया जा सकता है printf, लेकिन chmod +xएक समस्या होगी।


दिलचस्प; क्या आप बिजीबॉक्स के भीतर से चल रहे हैं, या कुछ अन्य शेल?
वाइल्डकार्ड

4
(इसके अलावा, क्या आप स्क्रीनशॉट के बजाय पाठ में चिपकाने का मन करेंगे?)
वाइल्डकार्ड

@Wildcard /bin/ash -> busybox
बेसिन

1
गाइल्स के जवाब में, यदि FEATURE_SH_STANDALONEसक्षम है, तो आपको यह व्यवहार नहीं मिलेगा। दूसरा mvपूरी तरह से ठीक काम करेगा।
मूरू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.