मैं कैपश का उपयोग कैसे करता हूं: मैं न्यूनतम क्षमताओं के साथ एक अनप्रीविज्ड पिंग चलाने की कोशिश कर रहा हूं


13

मैं क्षमताओं के साथ प्रयोग कर रहा हूं, डेबियन ग्नू / लिनक्स पर।

मैंने अपनी वर्तमान कार्यशील निर्देशिका में कॉपी / बिन / पिंग की नकल की है। जैसा कि उम्मीद थी कि यह काम नहीं करता है, यह मूल रूप से सेतु जड़ था।

फिर मैं अपनी पिंग को न्यूनतम क्षमताओं (रूट नहीं) को करने देता sudo /sbin/setcap cap_net_raw=ep ./pingहूं, और मेरी पिंग काम करता है, जैसी कि उम्मीद थी।

फिर sudo /sbin/setcap -r ./pingउस क्षमता को निरस्त करना है। यह अब उम्मीद के मुताबिक काम नहीं कर रहा है।

मैं अब पिंग का उपयोग कर काम पाने की कोशिश करता हूं capsh

capsh कोई विशेषाधिकार नहीं है, इसलिए मुझे इसे रूट के रूप में चलाने की आवश्यकता है, लेकिन फिर रूट को छोड़ दें और इस प्रकार अन्य सभी विशेषाधिकार।

मुझे लगता है कि मुझे भी इसकी आवश्यकता है secure-keep-caps, यह प्रलेखित नहीं है capsh, लेकिन क्षमता मैनुअल में है। मुझे इससे कुछ नम्बर मिले /usr/include/linux/securebits.h। वे सही प्रतीत होते हैं, क्योंकि --printइन बिट्स का आउटपुट सही होना दर्शाता है।

मैं घंटों से फिडिंग कर रहा हूं, अभी तक मेरे पास यही है।

sudo /sbin/capsh --keep=1 --secbits=0x10 --caps="cap_net_raw+epi" == --secbits=0x10 --user=${USER} --print -- -c "./ping localhost"

हालाँकि pingत्रुटियों के साथ ping: icmp open socket: Operation not permitted, यह तब होता है जब यह क्षमता नहीं होती है। इसके अलावा --printशो Current: =p cap_net_raw+i, यह पर्याप्त नहीं है जो हमें चाहिए e

sudo /sbin/capsh --caps="cap_net_raw+epi" --print -- -c "./ping localhost"सेट करने की क्षमता Current: = cap_net_raw+eipसही है, लेकिन हमें छोड़ देता है root

संपादित करें -1

मैंने अब कोशिश की है sudo /sbin/capsh --keep=1 --secbits=0x11 --caps=cap_net_raw+epi --print -- -c "touch zz; ./ping -c1 localhost;"

यह उत्पादन करता है:

touch: cannot touch `zz': Permission denied
ping: icmp open socket: Operation not permitted

पहली त्रुटि अपेक्षित है secure-noroot: yes लेकिन दूसरी नहीं हैCurrent: = cap_net_raw+eip

संपादित -2

अगर मैं इसे ==पहले रखता हूं , तो --printयह अब पता चलता है Current: = cap_net_raw+i, ताकि पिछली त्रुटि बताई जा सके, लेकिन यह नहीं कि हम जड़ से स्विच करते समय क्षमता क्यों खो रहे हैं, हालांकि मुझे लगता है कि secure-keep-capsइसे ठीक करना चाहिए।

संपादित -3

जब मैं निष्पादित कर सकता हूं, तो मैं प्रभावी (ई), और अनुमत (पी) खो रहा हूं। यह अपेक्षित है, लेकिन मुझे लगा कि सिक्योर-की-कैप, उन्हें खो जाने से रोकना चाहिए। क्या मैं कुछ भूल रहा हूँ।

संपादित -4

मैं और अधिक शोध कर रहा हूं, और फिर से मैनुअल पढ़ रहा हूं। ऐसा लगता है कि सामान्य रूप से eऔर pक्षमताओं को खो दिया जाता है: जब आप उपयोगकर्ता से स्विच करते हैं root(या लागू होते हैं secure-noroot, इस प्रकार रूट को एक सामान्य उपयोगकर्ता बनाते हैं), तो इसके साथ ओवरडाइड किया जा सकता है secure-keep-caps; जब आप फोन करते हैं exec, जहां तक ​​मैं बता सकता हूं कि यह एक आक्रमणकारी है।

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

तो अब मेरा सवाल यह है कि मैं क्या याद कर रहा हूं, इसके capshलिए क्या है ।

संपादित -5

मैंने एक उत्तर पुन: परिवेश क्षमताओं को जोड़ा है। शायद capshविरासत में मिली क्षमताओं के साथ भी इस्तेमाल किया जा सकता है, लेकिन उपयोगी होने के लिए इन्हें निष्पादन योग्य फ़ाइल पर सेट करना होगा। मैं यह नहीं देख सकता कि कैसे घात क्षमताओं के बिना कुछ भी उपयोगी नहीं हो सकता है, या विरासत में मिली क्षमताओं को अनुमति दे सकता है।


संस्करण:

  • capshपैकेज libcap2-binसंस्करण से1:2.22-1.2
  • संपादन -3 से पहले मैंने नवीनतम capshको पकड़ लिया git://git.debian.org/collab-maint/libcap2.gitऔर उसका उपयोग शुरू कर दिया।
  • uname -a Linux richard-laptop 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/Linux उपयोगकर्ता-भूमि 32 बिट है।

1
क्या आपने बाद में अपस्ट्रीम रिलीज के साथ लेकेनस्टेन के उदाहरण की कोशिश की ? हो रही capshcollab-maint रेपो से आप नहीं दिया होता "नवीनतम" capsh, डेबियन पैकेज अभी भी परिवेश क्षमताओं का समर्थन नहीं करता है। अपस्ट्रीम 2.27 करता है।
स्टीफन किट

1
@StephenKitt जानना अच्छा है, लेकिन मूल प्रश्न यह है कि उपयोग क्या है capsh, परिवेश की अनुपस्थिति में (जैसा कि यह मूल रूप से था)। मैं क्या खो रहा हूँ। इसका उपयोग होना ही चाहिए।
ctrl-alt-delor-

जवाबों:


12

क्षमताओं प्रक्रियाओं के गुण हैं। परंपरागत रूप से तीन सेट हैं:

  • अनुमत क्षमताएं ( पी ): क्षमताएं जो वर्तमान प्रक्रिया में "सक्रिय" हो सकती हैं।
  • प्रभावी क्षमताएं ( ): ऐसी क्षमताएं जो वर्तमान प्रक्रिया में वर्तमान में उपयोग करने योग्य हैं।
  • इनहेरिट करने योग्य क्षमताएं ( i ): फाइल क्षमताएं जो विरासत में मिली हो।

रूट के रूप में चलने वाले कार्यक्रमों में हमेशा पूर्ण अनुमति और प्रभावी क्षमताएं होती हैं, इसलिए अधिक क्षमताओं को "जोड़ने" का कोई ध्यान देने योग्य प्रभाव नहीं होता है। (अंतर्निहित क्षमताओं को सामान्य रूप से खाली है।) setcap cap_net_raw+ep pingइस कार्यक्रम को चलाने वाले किसी भी उपयोगकर्ता के लिए डिफ़ॉल्ट रूप से आप इन क्षमताओं को सक्षम करते हैं।

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

क्षमताओं के साथ खेलते समय, इन नुकसानों पर ध्यान दें:

  • जब उपयोगकर्ता को रूट से गैर-रूट में बदलते हैं, तो प्रभावी और अनुमत क्षमताओं को मंजूरी दे दी जाती है (देखें उपयोगकर्ता आईडी का प्रभाव क्षमताओं में क्षमताओं पर परिवर्तन (7) )। सेट साफ़ करने से बचने --keep=1के capshलिए आप विकल्प का उपयोग कर सकते हैं ।
  • उपयोगकर्ता या समूह आईडी को बदलते समय परिवेश की क्षमताओं को स्पष्ट किया जाता है। समाधान: उपयोगकर्ता आईडी बदलने के बाद परिवेश क्षमताओं को जोड़ें , लेकिन एक बच्चे की प्रक्रिया को निष्पादित करने से पहले
  • एक क्षमता केवल परिवेश क्षमताओं में जोड़ी जा सकती है यदि वह पहले से ही अनुमत और अंतर्निहित दोनों क्षमताओं में सेट है।

capshLibcap 2.25 से कार्यक्रम अभी तक परिवेश क्षमताओं को संशोधित करने की क्षमता नहीं है, लेकिन बाद में विज्ञप्ति नए विकल्प जोड़ते हैं। ध्यान दें कि विकल्प क्रम महत्वपूर्ण है। उदाहरण का उपयोग:

sudo capsh --caps="cap_net_raw+eip cap_setpcap,cap_setuid,cap_setgid+ep" \
    --keep=1 --user=nobody --addamb=cap_net_raw -- \
    -c "./ping -c1 127.0.0.1"

युक्ति: आप कमांड लाइन --printमें कहीं भी विकल्प जोड़ सकते हैं capshऔर इसकी वर्तमान क्षमताओं को देख सकते हैं।

नोट: cap_setpcapके लिए आवश्यक है --addamb, जबकि cap_setuid,cap_setgidके लिए आवश्यक हैं --userविकल्प।


6

लेकेनस्टेन का जवाब सटीक और पूर्ण लगता है लेकिन मैं एक अलग कोण से एक और स्पष्टीकरण प्रदान करने की कोशिश करूंगा जो उस समस्या पर जोर देने की कोशिश करेगा जो परिवेश क्षमताओं को हल करता है।

जब आप चलते sudo capsh --user=<some_user> --हैं, तो ब्याज की 2 प्रणाली कॉल होती है जो क्षमताओं को पुनर्गणित करने का कारण बनती हैं (और संभावित रूप से गिराए गए):

  1. setuidके अनुसार man capabilities:

SECBIT_KEEP_CAPS इस ध्वज को सेट करने से एक ऐसा धागा प्राप्त होता है, जिसमें एक या अधिक 0 UIDs होते हैं, जो अपनी क्षमताओं को बनाए रखने के लिए अपने UIDs को एक नॉनज़ेरो मान में बदल देता है। यदि यह ध्वज सेट नहीं किया गया है, तो इस तरह के एक UIDswitch धागे को सभी क्षमताओं को खो देता है।

दूसरे शब्दों में, capshऊपर दिए गए हमारे कमांड में, हमें यह सुनिश्चित करने की आवश्यकता है कि SECBIT_KEEP_CAPS setuidसिस्टम कॉल के दौरान सेट है । अन्यथा सभी क्षमताएं खो जाती हैं। यह क्या --keep=1करता है। तो अब आज्ञा बन जाती हैsudo capsh --user=<some_user> --keep=1 --

  1. execve: हम उपयोग करते हैं --keep=1विकल्प, सभी क्षमता सेट (प्रभावी की अनुमति दाय) संरक्षित कर रहे हैं जब तक ऊपरexecve सिस्टम कॉल, तथापि execveक्षमताओं पुनर्गणना किया जाना है (गैर-रूट उपयोगकर्ताओं के लिए) के साथ-साथ का कारण बनता है, और एक तो स्पष्ट नहीं तरीके से। संक्षेप में, परिवेशी क्षमताओं को जोड़ने से पहले , एक थ्रेड में "अनुमति" सेट में होने की क्षमता के लिए execve, कॉल के बाद या तो:

    • फ़ाइल की "अनुमति" सेट में वह क्षमता होनी चाहिए । इसके साथ किया जा सकता है setcap cap_net_raw+p /bin/bash। ऐसा करने से पूरे अभ्यास बेकार हो जाता है क्योंकि थ्रेड की क्षमता सेट (बाउंडिंग सेट के अलावा) का अब कोई प्रभाव नहीं पड़ता है।
    • फ़ाइल और थ्रेड दोनों में उनके "निहित" सेट में वह क्षमता होनी चाहिए । आप सोच सकते हैं कि setcap cap_net_raw+iयह चाल execveचली जाएगी लेकिन यह पता चलता है कि एक अप्रभावित उपयोगकर्ताओं द्वारा कॉल किए जाने पर थ्रेड की अंतर्निहित अनुमतियाँ गिरा दी जाती हैं (जो हम वर्तमान में धन्यवाद हैं setuid)। तो एक अनपेक्षित उपयोगकर्ता के रूप में इस स्थिति को संतुष्ट करने का कोई तरीका नहीं है।

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


2

कर्नेल में बग / सुविधा हो सकती है। कुछ चर्चा हुई है:

मुझे कुछ भी पता नहीं है, अगर कुछ भी किया गया है, इसे ठीक करने के लिए।

मुझे गलत मत समझो - वर्तमान व्यवहार सुरक्षित है। लेकिन यह इतना सुरक्षित है कि यह उन चीजों के रास्ते में हो जाता है जिन्हें काम करना चाहिए।

संपादित करें: http://man7.org/linux/man-pages/man7/capabilities.7.html के अनुसार एक नई क्षमता सेट परिवेश (लिनक्स 4.3 के बाद से) है। ऐसा लगता है कि यह अनुमति देगा जो आवश्यक है।

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