क्या कोई स्क्रिप्ट निष्पादन योग्य हो सकती है लेकिन पठनीय नहीं है?


65

क्या किसी स्क्रिप्ट को निष्पादित करना संभव है अगर उसे पढ़ने की अनुमति नहीं है? रूट मोड में, मैंने एक स्क्रिप्ट बनाई और मैं चाहता हूं कि दूसरा उपयोगकर्ता इस स्क्रिप्ट को निष्पादित करें लेकिन इसे पढ़ें नहीं। मैंने chmodपढ़ने और लिखने के लिए मना किया था , लेकिन निष्पादित करने की अनुमति दी, हालांकि उपयोगकर्ता मोड में, मैंने उस संदेश को देखा जो कहता है: अनुमति से इनकार किया।


जवाबों:


68

मुद्दा यह है कि स्क्रिप्ट क्या चल रहा है नहीं है, लेकिन दुभाषिया (है bash, perl, python, आदि)। और दुभाषिए को स्क्रिप्ट पढ़ने की जरूरत है। यह एक "नियमित" कार्यक्रम से अलग है, जैसे ls, उस प्रोग्राम को सीधे कर्नेल में लोड किया गया है, जैसा कि दुभाषिया करेगा। चूंकि कर्नेल स्वयं प्रोग्राम फाइल पढ़ रहा है, इसलिए उसे रीड एक्सेस की चिंता करने की आवश्यकता नहीं है। दुभाषिया को स्क्रिप्ट फ़ाइल को पढ़ने की जरूरत है, क्योंकि एक सामान्य फ़ाइल को पढ़ना होगा।


2
हां लेकिन उनके मामले में क्या कोई समाधान है?
ओलिवियर पोंस

13
एक संभावना है कि एक सरल सी प्रोग्राम होगा जो स्क्रिप्ट को एम्बेड करता है और दुभाषिया को स्पष्ट रूप से कॉल करता है। एसी प्रोग्राम को निष्पादित करने के लिए पढ़ने की अनुमति की आवश्यकता नहीं है।
अरसेज

1
कड़ाई से बोलते हुए, कर्नेल इस मामले में भेदभाव नहीं करता है और यह वास्तव में शेल को चलाएगा (उसी तरह जैसे कि निष्पादन योग्य फ़ाइल एक बाइनरी थी)। हालाँकि, शेल स्वयं तुरंत क्रैश हो जाएगा क्योंकि यह इनपुट फ़ाइल (स्क्रिप्ट फ़ाइल सामग्री) नहीं पढ़ सकता है।
जोजेफ

34

यह केवल बायनेरिज़ के लिए संभव है।

$ chown foo:foo bar
$ chmod 701 bar

अप्रभावित उपयोगकर्ता के रूप में:

$ ls -lha bar
-rwx-----x 1 foo foo 7.0K 2012-03-15 03:06 bar

$ cat bar
cat: bar: Permission denied

$ ./bar
baz

अब, यहाँ किकर है। हालांकि फ़ाइल पारंपरिक तरीकों से अपठनीय है, आप वास्तव में फ़ाइल को पढ़ने से रोक नहीं सकते हैं। यह वास्तव में http://smashthestack.org/ (स्तर 13) पर एक चुनौती है । एक अच्छी तरह से ज्ञात उपयोगिता कहा जाता hktraceहै जो आपको फ़ाइल का उपयोग करके पढ़ने की अनुमति देता है ptrace


बहुत दिलचस्प (hktrace)।
fthinker

1
क्या शेल स्क्रिप्ट को बाइनरी फॉर्मेट में बदलना संभव है?
22

4
वास्तव में, आप इसे रोक सकते हैं, मुझे लगता है। वर्तमान लिनक्स कर्नेल संस्करण गैर-डंपेबल के लिए प्रक्रिया सेट करते हैं, जिसका अर्थ है कि कोई भी सामान्य उपयोगकर्ता इसे अब और नहीं पचा सकता है, यदि उपयोगकर्ता को बाइनरी पढ़ने की अनुमति नहीं है।
thejh

6

यह संभव नहीं है, कम से कम लिनक्स पर (अन्य यूनीक इसे अनुमति दे सकते हैं); इसके बारे में सोचें, जब आप स्क्रिप्ट चलाते हैं, तो यह जानने के लिए कि उसे क्या करना है, शेल को पढ़ना होगा।


3
यह निश्चित रूप से संभव है; OpenBSD किसी भी स्क्रिप्ट को बिना अनुमति के निष्पादित किया जा सकता है। हुड के तहत यह दुभाषिया का उपयोग करने के लिए दुपट्टा फ़ाइल डिस्क्रिप्टर बनाकर करता है।
eradman

@eradman मैंने एक उत्तर में (उदाहरण के साथ, स्पष्टीकरण, और मेरी कुछ टिप्पणियों के साथ) डाल दिया है
mosvy

3

आप कर सकते हैं, मुझे लगता है, ऐसा करते हैं setuid

सिवाय इसके कि आप नहीं कर सकते क्योंकि अधिकांश डिस्ट्रोस (जाहिरा तौर पर) setuidअक्षम हो गए हैं क्योंकि यह एक बड़ा सुरक्षा छेद है। यह मेरा काम करने में अक्षम है, इसलिए मुझे वास्तव में नहीं पता है कि यह उत्तर काम करेगा, मैं इसे वैसे भी पोस्ट कर रहा हूं क्योंकि मुझे लगता है कि यह चाहिए

वैसे भी, अगर मैं वह करना चाहता था जो आप करना चाहते थे - और मेरे पास setuidस्क्रिप्ट के लिए सक्षम के साथ एक डिस्ट्रो था - मैं कुछ ऐसा करूंगा:

$ chmod 700 myscript
$ cat > myscript-nonroot
#!/bin/sh
bash myscript
^D
$ sudo chown root:root myscript-nonroot
$ sudo chmod 4755 myscript-nonroot # make SURE this isn't world-writable!

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

चूंकि myscript-nonroot फ़ंक्शन सभी द्वारा पठनीय है, इसे पढ़ा और निष्पादित किया जा सकता है, और जब तक आप दो लाइन प्राप्त करते हैं जहां आप वास्तव में अपनी स्क्रिप्ट निष्पादित करते हैं ( bash myscript) यह रूट के रूप में चलाया जा रहा है (या जो आप चाहते हैं, सटीक उपयोगकर्ता कोई फर्क नहीं पड़ता, जब तक कि रैपर फ़ाइल एक ही उपयोगकर्ता के स्वामित्व में है।)


4755 का क्या अर्थ है? मैं इसके लिए नया हूं, इसलिए मैं जानना चाहूंगा कि इसका क्या मतलब है। मैं 755 भाग को समझता हूं। धन्यवाद
केवदोग 7

2
4सेट setuid बिट। मैनपेज पर chmod मैन पेज में मोड्स अनुभाग देखें ।
क्वॉडलिबिटर

ठीक है, मैं अभी भी काफी कुछ नहीं समझता, लेकिन मुझे 755थोड़ा समझने में थोड़ा समय लगा।
केवदोग K K

हाँ, वास्तव chmod 755में 0775 अष्टक से अधिक है। वहाँ चारों ओर बहुत भ्रम है कि .. इस पृष्ठ ( manpagez.com/man/1/chmod ) में एक आवेगपूर्ण और अनपेक्षित क्षैतिज स्क्रॉल है जिसे मैं समझ नहीं सकता ...
erm3nda

2

पिछले कथनों का आधा सच है। आप एक स्क्रिप्ट सेटअप कर सकते हैं ताकि यह उपयोगकर्ता द्वारा पठनीय न हो, लेकिन फिर भी निष्पादन योग्य हो। यह प्रक्रिया थोड़ी खींची हुई है, लेकिन यह / etc / sudoer में एक अपवाद बनाकर संभव है, ताकि उपयोगकर्ता स्क्रिप्ट के लिए अस्थायी रूप से पासवर्ड के लिए संकेत किए बिना चला सके। यह विधि: - अन्य डिस्ट्रो के लिए सेटिड पैच के आसपास मिलती है। - आप उपयोगकर्ता के लिए सब कुछ के अधिकार के बिना एक विशेष स्क्रिप्ट के लिए अस्थायी रूप से उन्नत अनुमति देने के लिए अनुमति देता है।

इस पोस्ट पर दिए गए इंस्ट्रक्शन को फॉलो करें: फाइल अनुमति को ही निष्पादित करें


1

इस स्थिति में मैंने एक NOPASSWD विकल्प के साथ sudo का उपयोग किया ताकि उपयोगकर्ता इसे पढ़ने में सक्षम हुए बिना स्क्रिप्ट चला सकें।


0

यह OpenBSD पर काम करता है

जैसा कि @eradman की एक टिप्पणी में पहले ही उल्लेख किया गया है , यह OpenBSD पर संभव है।

जड़ के रूप में:

hzy# cat <<'EOT' >/tmp/foo; chmod 001 /tmp/foo
#! /bin/sh
: this is secret
echo done
EOT

एक नियमित उपयोगकर्ता के रूप में:

hzy$ cat /tmp/foo
cat: /tmp/foo: Permission denied
hzy$ /tmp/foo
done

/dev/fd/3दुभाषिया के लिए (या स्क्रिप्ट के लिए खुली एफडी जो भी हो) पास करके काम करता है । यह चाल लिनक्स पर काम नहीं करेगी , जहां /dev/fd/Nविशेष वर्ण उपकरण नहीं हैं जो dup(2)खोले जाने पर fd की वापसी करते हैं, लेकिन मूल फ़ाइल / डेंट्री के लिए "जादू" को सहानुभूति होती है, जो फ़ाइल को खरोंच से खोलती है [1]। इसे Free / NetBSD या Solaris में लागू किया जा सकता है ...

लेकिन ऐसा नहीं है कि यह टूट गया है

मूल रूप से x(निष्पादित) अनुमति देने का अर्थ है rकिसी भी फ़ाइल पर (पढ़ी गई) अनुमति देना, जिसमें एक शबंग है [2]:

hzy$ cat /tmp/foo
cat: /tmp/foo: Permission denied
hzy$ ktrace -ti /tmp/foo
done
hzy$ kdump | tail -n8
 70154 sh       GIO   fd 10 read 38 bytes
       "#! /bin/sh
        : this is secret
        echo done
       "
 70154 sh       GIO   fd 1 wrote 5 bytes
       "done

ktraceएकमात्र तरीका नहीं है; यदि दुभाषिया गतिशील रूप से निष्पादन योग्य है जैसे perlया python, एक LD_PRELOADएड हैक जो read(2)फ़ंक्शन को ओवरराइड करता है इसके बजाय इसका उपयोग किया जा सकता है।

और नहीं, इसे सेतु बनाने से एक नियमित उपयोगकर्ता को इसकी सामग्री को देखने से रोका नहीं जा सकेगा; वह बस इसे नीचे चला सकती है ptrace(2), जिससे सेतु के टुकड़ों को अनदेखा किया जाएगा:

जड़ के रूप में:

hzyS# cat <<'EOT' >/tmp/bar; chmod 4001 /tmp/bar
#! /bin/sh
: this is secret
id
EOT

एक नियमित उपयोगकर्ता के रूप में:

hzyS$ ktrace -ti /tmp/bar
uid=1001(duns) euid=0(root) gid=1001(duns) groups=1001(duns)
hzyS$ kdump
    ... nothing, the kernel disabled the ktrace ...
hzyS$ cc -Wall -xc - -o pt <<'EOT'
#include <unistd.h>
#include <sys/types.h>
#include <sys/ptrace.h>
#include <sys/wait.h>
#include <signal.h>

int main(int ac, char **av){
        int s; pid_t pid;
        if((pid = fork()) == 0){
                ptrace(PT_TRACE_ME, 0, 0, 0);
                execvp(av[1], av + 1);
        }
        while(wait(&s) > 0 && WIFSTOPPED(s)){
                s = WSTOPSIG(s);
                ptrace(PT_CONTINUE, pid, (caddr_t)1, s == SIGTRAP ? 0 : s);
        }
}
EOT
hzyS$ ./pt ktrace -ti /tmp/bar
uid=1001(duns) gid=1001(duns) groups=1001(duns)
hzyS$ kdump | tail -5
 29543 sh       GIO   fd 10 read 31 bytes
       "#! /bin/sh
        : this is secret
        id
       "

(क्षमा करें, अगर यह प्रदर्शित करने का सबसे कठिन तरीका नहीं है)

[१] इसे लिनक्स पर प्रयोग करके देखा जा सकता है binfmt_misc, लेकिन दुभाषिया को संशोधित करना होगा, या एक आवरण का उपयोग करना होगा; एक उदाहरण के लिए इस उत्तर के अंतिम भाग को जानबूझकर असुरक्षित रूप से बनाया गया देखें।

[२] या सामान्य तौर पर, कोई भी फाइल जिसके कारण execve()वापसी नहीं होगी ENOEXEC


-2

हां, यदि आप रूट यूजर हैं, तो आप बिना रीड की अनुमति के फाइल को निष्पादित कर सकते हैं

# echo "echo hello" > test
# chmod 100 test
# ll test
---x------ 1 root root 10 Nov 29 12:13 test
# ./test
hello

लेकिन अगर आप किसी अन्य उपयोगकर्ता के साथ लॉग इन करते हैं, तो आप इस फ़ाइल को निष्पादित नहीं कर सकते

$ ./test
-bash: ./test: Permission denied

3
यह वास्तव में इस सवाल का जवाब नहीं देता है, क्योंकि रूट बिना अनुमति के भी फाइल को पढ़ सकता है।
wandandrea

-5

अपनी स्क्रिप्ट को बिना पढ़े अभी तक निष्पादन योग्य बनाने के लिए, आपके पास 3 प्रमुख विकल्प हैं:

पहला विकल्प

मैन्युअल रूप से इसे एन्क्रिप्ट करने के लिए ओपनस् कमांड का उपयोग करें। और भविष्य में, जब आप स्क्रिप्ट को चलाना चाहते हैं, तो आपको फिर से मैन्युअल रूप से ओपनसेल चलाना होगा, और डिक्रिप्ट करने के लिए पासवर्ड प्रदान करना होगा।

खुलने के साथ एन्क्रिप्शन:

बिल्ली yourcript.sh | Opensl aes-128-cbc -a -salt -k yourpassword> yourscript.enc

Opensl के साथ डिक्रिप्शन:

बिल्ली yourcript.enc | Opensl aes-128-cbc -a -d -salt -k yourpassword> yourscript.dec

yourcript.dec आपकी मूल लिपि yourcript.sh जैसी ही होगी

दूसरा विकल्प

अपनी स्क्रिप्ट को स्वचालित रूप से एन्क्रिप्ट करने और स्क्रिप्ट के एन्क्रिप्टेड संस्करण को निष्पादन योग्य बनाने के लिए www.Ensc एन्क्रिप्शन. com जैसी साइट का उपयोग करें । यह साइट Opensl की एन्क्रिप्शन क्षमताओं और कुछ अन्य गतिरोध तरीकों का उपयोग करती है, जिससे घुसपैठियों के लिए आपकी स्क्रिप्ट में छिपी या छिपी रहस्यों का खुलासा करना काफी मुश्किल हो जाता है। इस साइट के साथ, आप शेल स्क्रिप्ट और कमांड लाइन पर्ल, पायथन, रूबी स्क्रिप्ट को एन्क्रिप्ट कर सकते हैं। मुझे लगता है कि php भी।

तीसरा विकल्प

Shc जैसे टूल का उपयोग करें । ऐसा लगता है कि 2012 से इसे अपडेट नहीं किया गया है। लेकिन मैंने पिछले दिनों इसका इस्तेमाल किया है। आपको प्रत्येक OS के लिए अपनी स्क्रिप्ट को संकलित करना होगा, जिस पर आप इसका उपयोग करना चाहते हैं, यदि OS आपके द्वारा उपयोग किए गए संकलन से भिन्न है।

सारांश:

यदि आपका कोड छिपाना आपके लिए बहुत महत्वपूर्ण है, तो केवल अनुमतियों पर निर्भर रहना और स्वामित्व आपकी सहायता करने वाला है, क्योंकि रूट वाला कोई भी व्यक्ति इसे प्राप्त कर सकता है। यह सिर्फ एक तथ्य है। आप क्या कर सकते हैं, अगर आप वास्तव में किसी के द्वारा अपने कोड को अनधिकृत रूप से देखने से रोकना चाहते हैं तो ओपनसेल कमांड के चारों ओर एक स्क्रिप्ट लिखना है। इसे ऐसा करें कि, स्क्रिप्ट के चलने से पहले, यह पासवर्ड के लिए संकेत देगा और पासवर्ड दिए जाने के बाद, यह स्क्रिप्ट को बिना किसी अस्थायी फ़ाइल पर लिखे चलाएगा। यदि यह बहुत अधिक काम की तरह लगता है तो विकल्प 2 और 3 आपके उद्देश्यों के लिए पर्याप्त होना चाहिए।


"Shc" लिंक पहले से एक पृष्ठ की ओर भी इशारा करता है। क्या आप इस पृष्ठ / सेवा से संबद्ध किसी भी अवसर से हैं?
phk

3
यदि आप अपनी स्क्रिप्ट को सिफर करते हैं तो यह बिना चाबी के नहीं चल पाएगी। यदि आपने इसे चलाने के लिए किसी उपयोगकर्ता को कुंजी भेजी है, तो यह सामग्री देखने में सक्षम होगी। यह अटपटी बात है ...
erm3nda
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.