मैं एक कठिन प्रक्रिया को कैसे मार सकता हूं


10

मैं एक ऐसा कार्यक्रम बनाना चाहता हूं जिसे शुरू करने के बाद (यहां तक ​​कि व्यवस्थापक के लिए भी) रूट नियमों के साथ इसे रोकना मुश्किल होगा। एक बार प्रक्रिया शुरू होने के बाद स्टार्टअप पर खुद को शुरू करना जारी रखना चाहिए। रोकने की प्रक्रिया में कुछ समय लगना चाहिए (यानी महंगा होना चाहिए)।

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

मैंने सोचा था कि समाधान निम्नलिखित है-

  1. प्रक्रिया को चलाने के दौरान हर बार एक अलग नाम के साथ चलना चाहिए, ताकि मैं प्रक्रिया के नाम की भविष्यवाणी न कर सकूं और उसे मार सकूं।

  2. प्रक्रिया बंद होने पर /etc/rc5.d में खुद को बचाएगा

  3. प्रक्रिया कुछ ज्ञात स्थान में एक साइबरफोर का उपयोग करके अपना नाम एन्क्रिप्ट करेगी। रोक प्रक्रिया को प्रोग्राम नाम को पुनर्प्राप्त करने और इसे मारने के लिए bruteforce का उपयोग करना होगा।

मैं इस कार्य के लिए एक अच्छा समाधान खोजना चाहता हूं।


2
आप वास्तव में सही हैं, यह एक बहुत ही मतलब कार्यक्रम की तरह लगता है
किवी

सांस्कृतिक वेब साइटों ... हाँ मैं समझता हूँ। मुझे लगता है कि डीएनएस को गलत डीएनएस की सूची के साथ संकलित करने से आपको मदद मिल सकती है
किवी

@ किवी हां यह एक विकल्प है, लेकिन फिर मैं सिर्फ DNS को पुनर्स्थापित कर सकता हूं?
मिहिर

आपके पास हमेशा हर चीज के लिए एक रास्ता हो सकता है। हो सकता है कि किसी मित्र से पूछें कि आप कंप्यूटर का रूट पासवर्ड रखते हैं, जो आप पूछ रहे हैं उसका अनुपालन करने का एक अच्छा तरीका है: डी, ​​क्योंकि आप बूट करने योग्य यूएसबी कुंजी का उपयोग करके समाप्त हो जाएंगे, यदि आपको सांस्कृतिक सामग्री पसंद है।
कीवी

हां लेकिन यह साधारण 2 मिनट का काम नहीं होना चाहिए।
मिहिर

जवाबों:


8

एक दृष्टिकोण पीआईडी ​​नामस्थान का उपयोग करने के लिए हो सकता है:

अपने सिस्टम init=/some/cmdको कर्नेल पैरामीटर के साथ बूट करें , जहां /some/cmdएक नए नामस्थान ( CLONE_NEWPID) में एक प्रक्रिया की तलाश है और इसमें चलता /sbin/initहै (इसमें उस नए नामस्थान में पीआईडी ​​1 होगा और रूट नेमस्पेस में पीआईडी ​​2 होगा), फिर माता-पिता में, अपने "" निष्पादित करें। कार्यक्रम "।

आप शायद एक तरह से या किसी अन्य तरीके से अपने कार्यक्रम को नियंत्रित करने का एक तरीका चाहते हैं (उदाहरण के लिए टीसीपी या ABSTRACT यूनिक्स सॉकेट)।

आप शायद अपने कार्यक्रम को स्मृति में रखना चाहते हैं और फाइल सिस्टम के अधिकांश संदर्भों को बंद कर देंगे ताकि यह किसी भी चीज़ पर निर्भर न हो।

यह प्रक्रिया बाकी सिस्टम से नहीं देखी जाएगी। बाकी सिस्टम एक कंटेनर की तरह चलेंगे।

यदि वह प्रक्रिया मर जाती है, तो कर्नेल घबरा जाएगा जो आपको एक अतिरिक्त गारंटी देता है।

एक असुविधाजनक साइड-इफेक्ट हालांकि यह है कि हम आउटपुट में कर्नेल थ्रेड्स नहीं देखेंगे ps

अवधारणा के प्रमाण के रूप में ( इस तरकीब का उपयोग कर अपने सिस्टम की कॉपी को केमू वर्चुअल मशीन में बूट करें)

एक ऐसा बनाएँ /tmp/init:

#! /bin/sh -
echo Starting
/usr/local/bin/unshare -fmp -- sh -c '
  umount /proc
  mount -nt proc p /proc
  exec bash <&2' &
ifconfig lo 127.1/8
exec socat tcp-listen:1234,fork,reuseaddr system:"ps -efH; echo still running"

(आपको उपयोग unshare-लाइनक्स (2.14) के हाल के संस्करण से आवश्यकता है)। ऊपर हम socat"प्रोग्राम" के रूप में उपयोग कर रहे हैं जो सिर्फ आउटपुट के साथ पोर्ट 1234 पर टीसीपी कनेक्शन पर जवाब देता है ps -efH

उसके बाद अपने VM को बूट करें:

kvm -kernel /boot/vmlinuz-$(uname -r) -initrd /boot/initrd.img-$(uname -r) \
    -m 1024 -fsdev local,id=r,path=/,security_model=none \
    -device virtio-9p-pci,fsdev=r,mount_tag=r -nographic -append \
    'root=r rootfstype=9p rootflags=trans=virtio console=ttyS0 init=/tmp/init rw'

फिर, हम देखते हैं:

Begin: Running /scripts/init-bottom ... done.
Starting
[...]
root@(none):/# ps -efH
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 14:24 ?        00:00:00 bash
root         4     1  0 14:24 ?        00:00:00   ps -efH
root@(none):/# telnet localhost 1234
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
UID        PID  PPID  C STIME TTY          TIME CMD
root         2     0  0 14:24 ?        00:00:00 [kthreadd]
root         3     2  0 14:24 ?        00:00:00   [ksoftirqd/0]
[...]
root         1     0  2 14:24 ?        00:00:00 socat tcp-listen:1234,fork,reuseaddr system:ps -efH; echo still running
root       204     1  0 14:24 ?        00:00:00   /usr/local/bin/unshare -fmp -- sh -c    umount /proc   mount -nt proc p /proc   exec bash <&2
root       206   204  0 14:24 ?        00:00:00     bash
root       212   206  0 14:25 ?        00:00:00       telnet localhost 1234
root       213     1  0 14:25 ?        00:00:00   socat tcp-listen:1234,fork,reuseaddr system:ps -efH; echo still running
root       214   213  0 14:25 ?        00:00:00     socat tcp-listen:1234,fork,reuseaddr system:ps -efH; echo still running
root       215   214  0 14:25 ?        00:00:00       sh -c ps -efH; echo still running
root       216   215  0 14:25 ?        00:00:00         ps -efH
still running
Connection closed by foreign host.
root@(none):/# QEMU: Terminated

लेकिन फिर क्या मैं बूटफाइल को शुरू / नहीं / कुछ / सेमी तक नहीं बदल सकता हूं?
मिहिर

1
@Miheer, और आप USB कुंजी से बूट कर सकते हैं, या एक अलग ऑपरेटिंग सिस्टम स्थापित कर सकते हैं ... इससे बचने के लिए, आपको मशीन और BIOS और बूट लोडर और कर्नेल और initrd को भौतिक रूप से लॉक करने की आवश्यकता होगी (और कार्यक्रम शुरू हो गया है) उस initrd से) कुछ रीड-ओनली डिवाइस पर। अन्यथा, आप जो कुछ भी करते हैं, आप हमेशा हार्ड ड्राइव को लेने और अपनी प्रक्रिया शुरू करने वाली चीज को हटाने में सक्षम होंगे।
स्टीफन चेज़लस

1

निश्चित नहीं है कि यह अंतिम समाधान है या यदि यह इसे करने का सबसे अच्छा तरीका है। मेरी राय:

  • संशोधित करें initक्योंकि यह पहली प्रक्रिया है अगर यह मर जाता है अन्य सभी भी मर जाते हैं। तो आपकी मशीन केवल इसके साथ उपयोग करने योग्य होगी।

  • एक कर्नेल मॉड्यूल बनाएं और इसके आधार पर महत्वपूर्ण मॉड्यूल लोड करें (यदि यह मारा जाता है तो यह initउदाहरण की तरह श्रृंखला प्रतिक्रिया का कारण बनेगा )।

  • एक निश्चित प्रक्रिया के लिए किल अनुरोधों को अनदेखा करने के लिए कर्नेल को संशोधित करें।

ध्यान रखें कि अंतिम दो कर्नेल मोड में चलेंगे (जो कि लिबास और इसलिए एक के मामले में बहुत सीमित है)। संशोधित initकरने से आप कई सुविधाओं का उपयोग कर सकते हैं।


1
यकीन नहीं होता अगर यह वास्तव में सुरक्षित है।
तंती

और इस प्रक्रिया को कैसे रोकें?
मिहिर

इसके लिए सॉफ्टवेयर में ही काम करना होगा। आपको सॉफ़्टवेयर को रोकने का अनुरोध करने का एक तरीका बनाना होगा। मान लें कि इसमें एक थ्रेड है जो किसी फ़ाइल की जाँच करता है जैसे: /var/lib/stop.request। यदि इस फ़ाइल में एक पासवर्ड X है तो सॉफ्टवेयर उस कार्य को रोक देता है जो वह कर रहा है और एक तरह के स्लीप मोड में प्रवेश करता है। आप दूसरी फ़ाइल /var/lib/start.request बनाकर इसे फिर से सक्षम कर सकते हैं।
तिनि
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.