निष्पादन से पहले कमांड बायनेरिज़ का सत्यापन


13

क्या यह जांचने की कोई विधि है कि आप वास्तव में बैश स्क्रिप्ट से क्या निष्पादित कर रहे हैं?

अपने bash स्क्रिप्ट कई आदेशों बुला रहा है कहो (उदाहरण के लिए: tar, mail, scp, mysqldump) और आप यह सुनिश्चित करें कि बनाने के लिए तैयार हैं tarवास्तविक है, असली tarहै, जिसके द्वारा निर्धार्य है rootउपयोगकर्ता फ़ाइल और मूल निर्देशिका के मालिक और केवल लिखने की अनुमति के साथ एक होने के और मालिक के /tmp/surprise/tarसाथ www-dataया कुछ नहीं apache2

निश्चित रूप से मैं PATHऔर पर्यावरण के बारे में जानता हूं , मुझे यह जानने की उत्सुकता है कि क्या इसके अलावा एक चल रही स्क्रिप्ट से जांच की जा सकती है और यदि हां, तो वास्तव में कैसे?

उदाहरण: (छद्म कोड)

tarfile=$(which tar)
isroot=$(ls -l "$tarfile") | grep "root root"
#and so on...

2
यदि आप इतने पागल हैं, तो अपने स्वयं के बायनेरिज़ का उपयोग करें!
Ipor Sircer

8
इसके अलावा which, सही तरीके से यह नहीं कहा जा सकता है कि tarजैसा कि xhienne द्वारा उत्तर lsदिया गया है, फ़ाइल (नों) के बारे में गलत जानकारी वापस करने के लिए हैक किया जा सकता है, यदि कोई हो। इसके अलावा grepझूठी जानकारी वापस जाने के लिए काट दिया जा सकता है, इसके बजाय शेल मिलान का उपयोग करके बचा जा सकता है, लेकिन फिर शेल को हैक किया जा सकता है। और शेल को typeपहली जगह से गलत परिणाम देने के लिए हैक किया जा सकता है - या पूरी तरह से प्रतिस्थापित करने के बाद से शेल की बदली 50-वर्षीय ओएस की तुलना में यूनिक्स का एक महत्वपूर्ण नवाचार था। केन थॉम्पसन का 1984 ट्यूरिंग पता देखें। यह सभी तरह से नीचे कछुए है।
dave_thompson_085 12/17

2
मैं लिनक्स के लिए इसका जवाब नहीं दे सकता - केवल AIX - जिसमें एक घटक होता है जिसे ट्रस्टेड एक्ज़ीक्यूशन ( TE) कहा जाता है - जिसमें हस्ताक्षर के साथ एक डेटाबेस होता है (यानी, एमडी 5 चेकसम की तुलना में अधिक व्यापक। जब टीए सक्रिय होता है और एक फ़ाइल डेटाबेस में होती है जिसे आप चुन सकते हैं। क्या प्रोग्राम चलता है - या केवल चेतावनी देता है कि यह डेटाबेस से मेल नहीं खाता है। इसके अलावा, दो अन्य सेटिंग्स हैं: TEP(विश्वसनीय निष्पादन पथ) और TLP(विश्वसनीय लिबास पथ)। केवल TEP में ही कार्यक्रमों को निष्पादित किया जा सकता है और पुस्तकालय केवल लोड किए जा सकते हैं। निर्देशिका को TLP में शामिल किया गया है। लिनक्स में I में 'AppArmor' नाम की एक चीज है जो आपकी मदद कर सकती है।
माइकल फेल्ट

1
आपके पास इस तरह की सुरक्षा हो सकती है, लेकिन स्क्रिप्ट से नहीं - जब तक आपकी स्क्रिप्ट अनियंत्रित वातावरण में निष्पादित नहीं होती है, तब तक बहुत देर हो चुकी होती है। सभी के लिए आप सब कुछ जानते हैं जो आप देख सकते हैं एक हमलावर द्वारा स्थापित चुरोट है।
चार्ल्स डफी

2
... यदि आप चाहते हैं कि एक प्रणाली है जो नीचे सभी तरह से विश्वसनीय है, तो आपको क्रोमोस दृष्टिकोण पर जाने की आवश्यकता है: क्या आपके फर्मवेयर ने आपके हार्डवेयर में एक कुंजी के साथ हस्ताक्षर किया है; फर्मवेयर द्वारा सत्यापित आपका बूटलोडर / कर्नेल; सत्यापन के लिए ब्लॉक-स्तरीय हस्ताक्षरों का उपयोग करते हुए आपका रूट ओएस विभाजन केवल पढ़ने के लिए; आदि वहाँ भी हैं जो @MichaelFelt पर चर्चा के समान उपलब्ध हैं - वफ़ादारी मापन आर्किटेक्चर देखें - लेकिन प्रदर्शन प्रभाव अधिक है और अखंडता का स्तर कम हो गया है (क्योंकि द्विआधारी हस्ताक्षर की जाँच करने से आपको गैर-निष्पादन योग्य के माध्यम से हमलों में मदद नहीं मिलती है सामग्री)।
चार्ल्स डफी

जवाबों:


24

आप जिन बायनेरिज़ को निष्पादित करने जा रहे हैं, उन्हें मान्य करने के बजाय, आप शुरू से ही सही बायनेरिज़ निष्पादित कर सकते हैं। जैसे अगर आप यह सुनिश्चित करना चाहते हैं कि आप दौड़ने नहीं जा रहे हैं /tmp/surprise/tar, तो बस /usr/bin/tarअपनी स्क्रिप्ट में चलाएं । वैकल्पिक रूप से, $PATHकुछ भी चलाने से पहले अपने मान को सेट करें ।

यदि आप फ़ाइलों /usr/bin/और अन्य सिस्टम निर्देशिकाओं पर भरोसा नहीं करते हैं , तो विश्वास हासिल करने का कोई तरीका नहीं है। आपके उदाहरण में, आप स्वामी के साथ जाँच कर रहे हैं ls, लेकिन आप कैसे जानते हैं कि आप भरोसा कर सकते हैं ls? यही तर्क अन्य समाधानों पर भी लागू होता है जैसे कि md5sumऔर strace

जहां सिस्टम अखंडता में उच्च विश्वास की आवश्यकता होती है, आईएमए जैसे विशेष समाधान का उपयोग किया जाता है। लेकिन यह ऐसी चीज नहीं है जिसे आप किसी स्क्रिप्ट से उपयोग कर सकते हैं: पूरे सिस्टम को एक विशेष तरीके से स्थापित करना होगा, जिसमें अपरिवर्तनीय फ़ाइलों की अवधारणा है।


जब अलग-अलग डिस्ट्रीब्यूशन के /binबजाय बायनेरिज़ को चुनने के लिए चुनते हैं, तो यह टूट जाता है /usr/bin
डेमियन यरिक

IMA इसके लिए दो उत्पादन-तैयार दृष्टिकोणों में से एक है - दूसरा रूट-स्तरीय सत्यापन को ब्लॉक-स्तरीय सत्यापन करने के लिए ChromeOS द्वारा लिया गया dm-verity दृष्टिकोण है।
चार्ल्स डफी

@DamianYerrick निष्पक्ष टिप्पणी। $PATHउन दोनों रास्तों पर सेट करें , यदि कई वितरण समर्थन की आवश्यकता है।
दिमित्री ग्रिगोरीव

AIX TE (RBAC के साथ या बिना) एक तीसरा "प्रोडक्शन-रेडी" कर्नेल-बिलिन होगा जो इसे पूरा करेगा - शायद और भी। टीई, एक बार निष्क्रिय से अधिक सक्षम होने पर - फ़ाइलों को खोलने और / या कार्यक्रमों को निष्पादित होने से रोक देगा। इसके अतिरिक्त, एप्लिकेशन और लाइब्रेरी का उपयोग विशेष रूप से TEP (विश्वसनीय निष्पादन पथ) या TLP (विश्वसनीय लाइब्रेरी पथ) पर सेट किया जा सकता है। बेसिक जानकारी के लिए ibm.com/support/knowledgecenter/en/ssw_aix_61/… देखें
माइकल फेल्ट

6

यदि एक घुसपैठिया आपके सिस्टम तक पहुंच प्राप्त कर चुका है और आपके $PATH(जिसमें /tmpकिसी भी परिस्थिति में शामिल नहीं होना चाहिए ) को संशोधित करने में सक्षम है , तो निष्पादनकर्ताओं के मालिकों के बारे में चिंता करना शुरू करने में बहुत देर हो चुकी है।

इसके बजाय आपको एक घुसपैठ से निपटने के तरीके के बारे में पढ़ना चाहिए ।

पूरी तरह से घुसपैठ से बचने पर ध्यान केंद्रित करना बेहतर है।

यदि आपके पास एक ऐसी प्रणाली है जहां इस प्रकार की चीजें मायने रखती हैं, तो यह उन हिस्सों को अलग करने के लिए एक अच्छा विचार हो सकता है जो उन हिस्सों से सार्वजनिक होने की आवश्यकता है जो निजी होने की जरूरत है, साथ ही संचार के साधनों का लेखा-जोखा करना इन के बीच में।


4

md5sumकिसी फ़ाइल का सत्यापन करके कुछ हद तक संभव है । इस प्रकार सिस्टम पर जो aptपैकेज प्रबंधन का उपयोग करता है - मेरे विशेष मामले में, उबंटू 16.04 - फाइल है /var/lib/dpkg/info/tar.md5sums, जो tarस्थापना के दौरान आई सभी फाइलों के md5 रकम को संग्रहीत करता है । तो आप एक साधारण इफ-स्टेटमेंट लिख सकते हैं जो यह जांचता है कि md5sum /bin/tarउस फाइल में क्या मिला है।

यह निश्चित रूप से मानता है कि फ़ाइल के साथ छेड़छाड़ नहीं की गई है। यह निश्चित रूप से केवल तभी हो सकता है जब हमलावर ने रूट / सुडो एक्सेस प्राप्त किया हो, जिस बिंदु पर सभी दांव बंद हैं।


8
लेकिन आप कैसे मान्य करते हैं /usr/bin/md5sum?
दिमित्री ग्रिगोरीव

यदि कोई हमलावर बदलने में सक्षम है /bin/tarया /usr/bin/tar, यह बहुत संभावना है कि वे भी बस बदल सकते हैं md5sumया /var/lib/dpkg/info/tar.md5sums। या $SHELL
जोनास श्फ़र

1
मुझे लगता है कि मैंने पहले ही अंतिम पैराग्राफ में उल्लेख किया है, कि इस तरह की चीज होने के लिए, एक हमलावर को सिस्टम तक रूट एक्सेस प्राप्त करने की आवश्यकता होगी, और उस बिंदु पर कुछ भी संभव है। ऐसे मामलों में, जहां हमलावर की जड़ तक पहुंच नहीं है, लेकिन एक उपयोगकर्ता के लिए पथ परिवर्तन को बदल सकता है या एक ऐसा उपनाम बना सकता है जहां tarअलग-अलग बाइनरी को इंगित करता है, जो काम करेगा। जब एक सिस्टम को रूट स्तर पर समझौता किया जाता है, तो आपके पास एक विकल्प होता है - इसे कक्षा से nuke
Sergiy Kolodyazhnyy

3

हां, एक विधि है: बिलिन typewhichकमांड के विपरीत जो केवल आपके PATH में खोज करता है, typeआपको बताएगा कि क्या वास्तव में कमांड नाम एक आरक्षित कीवर्ड, एक बिलिन, एक उपनाम, एक फ़ंक्शन या एक डिस्क फ़ाइल है।

$ type -t foobar || echo "Not found"
Not found

$ type -t echo
builtin

$ enable -n echo; type -t echo; type -p echo
file
/usr/bin/echo

$ echo() { printf "(echoing) %s\n" "$*"; }; type -t echo
function

$ alias echo="/bin/echo 'I say: ' "; type -t echo
alias

इसके अलावा type -aआप अपने आदेश के लिए सभी उम्मीदवारों को दे देंगे (पहली से आखिरी पसंद तक):

$ type -a echo
echo is aliased to `/bin/echo 'I say: ' '
echo is a function
echo () 
{ 
    printf "(echoing) %s\n" "$*"
}
echo is a shell builtin
echo is /usr/local/bin/echo
echo is /bin/echo

अंत में, यदि आप अपनी डिस्क पर केवल बायनेरिज़ के बारे में चिंतित हैं, तो आप type -Paअपने पैट में सभी बायनेरिज़ को प्राप्त करने के लिए उपयोग कर सकते हैं (ऊपर जैसा आदेश):

$ type -Pa tar
/home/me/bin/tar                <= oh oh, is this normal?
/bin/tar

उस ने कहा, typeअकेले आपको यह नहीं बताएगा कि अंत में क्या कमांड कहा जाएगा। उदाहरण के लिए, यदि आपका tarएक उपनाम है जो एक द्विआधारी (जैसे alias tar="/tmp/tar") typeकहता है तो आपको बताएगा कि यह एक है alias


type -aसभी रूपों में शामिल हैं (उदाहरण के लिए उपनाम और बाहरी कार्यक्रम)
dave_thompson_085

धन्यवाद @dave, यह वास्तव में दिलचस्प है, मैंने अपना जवाब अपडेट किया है
xhienne

1
typeआपको बताएंगे कि जैसा कि बाश जानता है, लेकिन अगर हम किसी दुर्भावनापूर्ण हमलावर से नियंत्रण में हैं, तो यह मानने का कोई कारण नहीं है कि यह क्या सोचता है कि यह वास्तविक सच्चाई को दर्शाता है। आप सभी को पता है कि आपके LD_PRELOADद्वारा किए गए हर एक सी-लाइब्रेरी कॉल को इंटरसेप्ट करने वाला एक मॉड्यूल है।
चार्ल्स डफी

1
@CharlesDuffy आप बिल्कुल सही हैं। मैं सुरक्षा कोण की ओर जवाब नहीं देना चाहता था। मैं शीर्ष पर सवाल का जवाब देने का प्रस्ताव कर रहा हूं: "क्या कोई विधि है जो आप वास्तव में बैश स्क्रिप्ट से निष्पादित कर रहे हैं" यह जांचने के लिए कोई विकल्प है which

मैंने पहले कभी नहीं देखा enable। मैंने इन उत्तरों से प्राप्त सलाह का उपयोग type enableयह जानने के लिए किया कि यह एक शेल निर्मित है और फिर help enableयह देखने के लिए कि यह क्या करता है।
जो

3

आप जाँच कर सकते हैं कि कौन सी कमांड वास्तव में स्क्रिप्ट द्वारा निष्पादित की जा रही हैं strace। उदाहरण के लिए:

strace -f -e execve ./script.sh

निम्नलिखित स्क्रिप्ट के साथ:

#!/bin/bash
touch testfile.txt
echo "Hello" >> testfile.txt
cat testfile.txt
rm testfile.txt

strace-e execveपैरामीटर के साथ उपयोग किए जाने पर निष्पादित कमांड का सटीक मार्ग बताएगा :

execve("./script.sh", ["./script.sh"], [/* 69 vars */]) = 0 
Process 8524 attached
[pid  8524] execve("/usr/bin/touch", ["touch", "testfile.txt"], [/* 68 vars */]) = 0 
[pid  8524] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=8524, si_status=0, si_utime=0, si_stime=0} --- 
Process 8525 attached [pid > 8525] execve("/bin/cat", ["cat", "testfile.txt"], [/* 68 vars */]) = 0
Hello [pid  8525] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=8525, si_status=0, si_utime=0, si_stime=0} --- 
Process 8526 attached [pid > 8526] execve("/bin/rm", ["rm", "testfile.txt"], [/* 68 vars */]) = 0
[pid  8526] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=8526, si_status=0, si_utime=0, si_stime=0} ---
+++ exited with 0 +++

पैरामीटर (स्ट्रेस मैन से):

-f: ट्रेस चाइल्ड प्रक्रियाएं क्योंकि वे वर्तमान में टॉर्क (2), vfork (2) और क्लोन (2) सिस्टम कॉल के परिणामस्वरूप ट्रेस की गई प्रक्रियाओं द्वारा बनाई गई हैं। ध्यान दें कि -p PID -fप्रक्रिया के सभी थ्रेड्स PID संलग्न करेंगे यदि यह बहु-थ्रेडेड है, न केवल थ्रेड_आईडी = PID के साथ थ्रेड।

-e trace=file: सभी सिस्टम कॉल ट्रेस करें जो एक तर्क के रूप में एक फ़ाइल नाम लेते हैं। आप इसे एक संक्षिप्त नाम के रूप में सोच सकते हैं, -e trace=open,stat,chmod,unlink,...जिसके लिए यह देखना उपयोगी है कि प्रक्रिया किस फ़ाइलों का संदर्भ दे रही है। इसके अलावा, संक्षिप्त नाम का उपयोग यह सुनिश्चित करेगा कि आप गलती से सूची में lstat जैसी कॉल शामिल करना न भूलें।


3
यह किसी भी तरह से स्वचालित परीक्षण करने के लिए एक स्क्रिप्ट द्वारा प्रयोग करने योग्य नहीं है, और यह मानने का कोई विशेष कारण straceनहीं है कि खुद को विकृत नहीं किया गया है।
चार्ल्स डफी

0

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

यहाँ छवि विवरण दर्ज करें

'स्ट्रेस' कमांड है जो आपके कमांड को भागों में समेटता है ...

यहाँ छवि विवरण दर्ज करें

यदि आप वास्तव में गहराई में जाना चाहते हैं, तो आप स्क्रिप्ट के लिए डीकंपाउटर की जांच करना चाहते हैं कि इसका निष्पादन होने जा रहा है। दूसरे शब्दों में आपको उस कमांड की असेंबलर व्याख्या की जांच करनी चाहिए। वहां पर बैश के लिए objdump -d। लिनक्स बिन स्क्रिप्ट मुख्य रूप से Cप्रोग्रामिंग लैंग्वेज के साथ बनाई गई हैं, इसलिए अच्छे Cडीकॉम्पेलर का उपयोग करें ।

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