मैं सुरक्षित रूप से एक अविश्वसनीय टार फ़ाइल कैसे निकालूं?


30

मैं एक टार फ़ाइल को निकालने में सक्षम होना चाहूंगा, जैसे कि सभी निकाली गई फ़ाइलों को एक निश्चित उपसर्ग निर्देशिका के तहत रखा जाता है। बाहरी निर्देशिकाओं के लिए लिखने के लिए टार फ़ाइलों द्वारा किसी भी प्रयास को असफलता का कारण बनना चाहिए।

जैसा कि आप कल्पना कर सकते हैं, यह इतना है कि मैं एक अविश्वसनीय टार फ़ाइल को सुरक्षित रूप से निकाल सकता हूं।

जीएनयू के साथ मैं यह कैसे कर सकता हूं tar?

मेरे द्वारा लाया गया:

tar --exclude='/*' --exclude='*/../*' --exclude='../*' -xvf untrusted_file.tar

लेकिन मुझे यकीन नहीं है कि यह पर्याप्त पागल है।


2
यह पर्याप्त नहीं है। मैंने अतीत में कुछ बुरा तारकोल का निर्माण किया था जो प्रतीकात्मक लिंक के माध्यम से चढ़ता था जो इसे बनाया था। मैंने अपना खुद का टार बनाया जो कि सेटिउड-रूट था ताकि यह चेरोट ("") को निष्पादित कर सके और विशेषाधिकारों को छोड़ सके।
जोशुआ

8
@ जोशुआ इसलिए एक बहुत व्यापक रूप से परीक्षण की गई उपयोगिता को अधिक सुरक्षित बनाने के लिए आपका समाधान अपने स्वयं के संस्करण बनाने और इसे मूल विशेषाधिकार देने के लिए था?
रुकना बंद करो मोनिका

4
@OrangeDog: int main (int argc, char ** argv) {chroot ("।") || बाहर निकलने के (1); setuid (getuid ()); ऑडिट करना आसान है।
यहोशू

2
आप यह भी -tविकल्प का उपयोग करके टार फ़ाइल के अंदर क्या है का निरीक्षण करना चाहते हो सकता है ।
थॉमस

जवाबों:


40

आपको व्यामोह की आवश्यकता नहीं है। जीएनयू tar- और वास्तव में पिछले 30 वर्षों में उत्पादित कोई भी अच्छी तरह से लिखा गया tarकार्यक्रम - टारबॉल में फ़ाइलों को निकालने से इंकार कर देगा जो स्लैश से शुरू होते ..हैं या जिनमें तत्व होते हैं, डिफ़ॉल्ट रूप से।

आपको tarइस तरह के संभावित दुर्भावनापूर्ण टारबॉल निकालने के लिए आधुनिक कार्यक्रमों को मजबूर करने के लिए अपने रास्ते से बाहर जाना होगा : जीएनयू और बीएसडी दोनों को इस सुरक्षा को अक्षम करने के लिए विकल्प की tarआवश्यकता है -P। GNU टार मैनुअल में अनुभाग निरपेक्ष फ़ाइल नाम देखें ।

-Pझंडा POSIX द्वारा निर्दिष्ट नहीं है, ¹ हालांकि, इसलिए अन्य tarकार्यक्रमों इस के साथ मुकाबला करने के विभिन्न तरीके हो सकते हैं। उदाहरण के लिए, शिली टूल्स 'star कार्यक्रम का उपयोग करता है -/और -..इन सुरक्षाओं निष्क्रिय करने के लिए।

केवल एक चीज जिसे आप भोले से जोड़ सकते हैं tar कमान में वह एक -Cध्वज है जो इसे एक सुरक्षित अस्थायी निर्देशिका में चीजों को निकालने के लिए मजबूर करता है, इसलिए आपको cdपहले वहां नहीं होना चाहिए ।


ऐसिड्स :

  1. तकनीकी रूप से, tarPOSIX द्वारा किसी भी अधिक निर्दिष्ट नहीं किया गया है। उन्होंने यूनिक्स कंप्यूटिंग की दुनिया को बताने की कोशिश की, जिसका हमें उपयोग करना चाहिएpax अब tarऔर के बजायcpio , लेकिन कंप्यूटिंग दुनिया ने बड़े पैमाने पर उन्हें नजरअंदाज कर दिया।

    यहाँ यह नोट करना प्रासंगिक है कि POSIX विनिर्देश paxयह नहीं कहता है कि इसे प्रमुख स्लैश या एम्बेडेड ..तत्वों को कैसे संभालना चाहिए । बीएसडी के--insecure लिए एक गैरमानक ध्वज हैpaxएम्बेडेड ..पथ तत्वों के खिलाफ सुरक्षा को दबाने के लिए , लेकिन प्रमुख स्लैश के खिलाफ स्पष्ट रूप से कोई डिफ़ॉल्ट सुरक्षा नहीं है; बीएसडी paxमैन पेज अप्रत्यक्ष रूप -sसे निरपेक्ष पथ जोखिम से निपटने के लिए प्रतिस्थापन नियम लिखने की सिफारिश करता है।

    उस तरह की बात तब होती है जब एक वास्तविक तथ्य सक्रिय उपयोग में रहता है जबकि डी जुरे मानक को काफी हद तक नजरअंदाज कर दिया जाता है।


7
pax - portable archive interchangeAwww, कितना प्यारा, POSIX यह संभवतः सबसे व्यापक रूप से उपयोग किए जाने वाले आर्काइव प्रारूप को बदलने वाला है: P
cat

1
@cat डिफ़ॉल्ट संग्रह प्रारूप एक काफी व्यापक रूप से समर्थित टार वेरिएंट है (AIUI यह cpio प्रारूप का समर्थन करने वाला भी है)। पैक्स बल्कि इस तरह के अभिलेखागार से निपटने के लिए कमांड इंटरफ़ेस को बदलने का एक प्रयास है , क्योंकि टार के कमांड तर्क हैंडलिंग है ... quirky।
रैंडम 832

रैंडम साइड नोट: मुझे पूरा यकीन है कि यह "डी पत्रिका" है, यानी फ्रेंच शब्द, "डी ज्यूर" के विपरीत।
निधि मोनिका का मुकदमा

7
@QaysTaxes यह नहीं है। डे ज्यूरियन लैटिन है और वर्तमान स्थिति के साथ विरोधाभास है, अर्थात डी वास्तव में क्या है। फ्रेंच व्याकरण के नियमों का पालन करने के लिए डी पत्रिकाओं को भी दो पत्रिकाओं होना चाहिए।
प्राइम

1
यह एक दुर्भाग्यपूर्ण झूठे संज्ञान का मामला है। फ्रांसीसी "ड्यू पत्रिका" ("दिन का") लैटिन "डे ज्यूर" ("कानून") की तरह बहुत कुछ दिखता है / लगता है यहां "डी फैक्टो" ("तथ्य") के विपरीत है। कोई यह तर्क दे सकता है कि पैक्स "महीने का मानक" या "मानक डू पत्रिकाएं" हैं ताकि नए मानकों को कितनी बार प्रस्तावित किया जाए, इसका मजाक बनाया जा सके, जबकि उपयोगकर्ताओं का विशाल शरीर बस उनके लिए काम करता है (डी फैक्टो मानक), यह जानते हुए कि (रूपक) कल की अनदेखी के लिए एक नया मानक होगा।
मोंटी हार्डर

19

GNU टार के साथ, यह बस है

tar -xvf untrusted_file.tar

एक खाली निर्देशिका में। /जब तक --absolute-namesविकल्प के साथ स्पष्ट रूप से नहीं बताया जाता है, तब तक GNU टार स्वचालित रूप से एक प्रमुख सदस्य के नाम को हटा देता है । GNU टार भी पता लगाता है कि कब उपयोग के ../कारण एक फ़ाइल toplevel निर्देशिका के बाहर निकाली जाएगी और उन फ़ाइलों को toplevel निर्देशिका में रखता है, उदाहरण के लिए एक घटक toplevel निर्देशिका के foo/../../bar/quxरूप bar/quxमें निकाला जाएगा बजाय toplevel निर्देशिका bar/quxके जनक में । जीएनयू टार भी सांकेतिक लिंक का ख्याल रखता है, जो कि टॉपलेवल डायरेक्टरी के बाहर की ओर इशारा करता है, जैसे foo -> ../..औरfoo/barbar टॉपलेवल निर्देशिका के बाहर निकालने का कारण नहीं होगा ।

ध्यान दें कि यह केवल (जीएनयू टार के पर्याप्त रूप से हाल के संस्करणों पर लागू होता है) और साथ ही कुछ अन्य कार्यान्वयन, जैसे * बीएसडी टार और बिजीबॉक्स टार)। कुछ अन्य कार्यान्वयनों में ऐसी कोई सुरक्षा नहीं है।

प्रतीकात्मक लिंक के कारण, आपके द्वारा उपयोग किए जाने वाले सुरक्षा पर्याप्त नहीं होंगे: संग्रह में पेड़ के बाहर एक निर्देशिका की ओर इशारा करते हुए एक प्रतीकात्मक लिंक हो सकता है और उस निर्देशिका में फ़ाइलों को निकाल सकता है। सदस्य नामों पर विशुद्ध रूप से आधारित उस समस्या को हल करने का कोई तरीका नहीं है, आपको प्रतीकात्मक लिंक के लक्ष्य की जांच करने की आवश्यकता है।

ध्यान दें कि यदि आप एक ऐसी निर्देशिका में निकाल रहे हैं जिसमें पहले से ही प्रतीकात्मक लिंक हैं, तो गारंटी नहीं रह सकती है।


6

कुछ बिंदुओं को कवर करने के लिए अन्य उत्तर नहीं हैं:

  1. सबसे पहले, फ़ाइल को निकालने से पहले उसे देखें:

    tar -tvf untrusted_tar_file.tar
    

    अगर वहाँ कुछ भी है जिसमें आप भरोसा नहीं करते हैं या निकालना चाहते हैं, तो तारकोल को न निकालें।

  2. दूसरा, टारबॉल को एक गैर-रूट उपयोगकर्ता के रूप में निकालें, जिसमें केवल उस एक डायरेक्टरी तक पहुंच हो, जिसे आप टारबॉल निकाल रहे हैं। उदाहरण के लिए, गैर-रूट उपयोगकर्ता के होम डायरेक्टरी के भीतर से टैरबॉल निकालें।

4
1. यह बैच संचालन के लिए व्यावहारिक नहीं है। 2. जब तक आप कस्टम सेटअप नहीं चला रहे हैं, कुछ स्थानों पर सभी उपयोगकर्ताओं द्वारा लिखा जा सकता है, विशेष रूप से / tmp /
पाइप

@ पका एक निर्देशिका और एक नया उपयोगकर्ता भी बना सकता है, और केवल उस उपयोगकर्ता के पास केवल उस निर्देशिका तक पहुंच है, फिर कमांड चलाएं। मुझे अपनी होम डायरेक्टरी काफी पसंद है, धन्यवाद।
बिल्ली

2
@pipe भगवान के अच्छा पृथ्वी पर क्यों आप चाहते हैं कभी पारित अविश्वस्त एक बैच ऑपरेशन के माध्यम से डेटा? यदि आप इस पर भरोसा नहीं करते हैं, तो आप इसे अप्राप्य नहीं चलाते हैं।
एंड्रयू हेनले

6
@AndrewHenle उह, ठीक है। आपको कैसे लगता है कि इंटरनेट पर हर सर्वर काम करता है? क्या आपको लगता है कि स्टेक्सएक्सचेंज का कोई आदमी इस टिप्पणी को अपने डेटाबेस और मार्कअप सिस्टम के माध्यम से चलाता है जबकि मैन्युअल रूप से ऑपरेशन की निगरानी कर रहा है? क्योंकि यह इनपुट बैच ऑपरेशन के माध्यम से डेटा अविशिष्ट है।
पाइप

मैं एक होम डायरेक्टरी में सीधे एक अविश्वसनीय फ़ाइल निकालने की अनुशंसा नहीं करूँगा। आप इसे आप .bashrc और अन्य .config / files, अधिलेखित करने के लिए नहीं चाहते हैं?
हुगेल 31
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.