যখন কোনও রুটহীন ব্যবহারকারী রুট ব্যবহারকারীর প্রক্রিয়াতে সংকেত প্রেরণ করে তখন কী ঘটে?


33

আমি ইউনিক্স সিগন্যালের সুরক্ষা নিয়ে ভাবছি।

SIGKILLপ্রক্রিয়া মেরে ফেলবে। সুতরাং, যখন কোনও নন-রুট ব্যবহারকারীর প্রক্রিয়া কোনও রুট ব্যবহারকারীর প্রক্রিয়াতে সংকেত প্রেরণ করে তখন কী ঘটে? প্রক্রিয়াটি এখনও সিগন্যাল হ্যান্ডলারটি সম্পাদন করে?

আমি স্বীকৃত উত্তরটি (গলুম) অনুসরণ করি এবং আমি টাইপ man capabilitesকরি এবং আমি লিনাক্স কার্নেল সম্পর্কে অনেক কিছুই পাই। থেকে man capabilities:

NAME

   capabilities - overview of Linux capabilities
DESCRIPTION

   For the purpose of performing permission checks, traditional UNIX
   implementations distinguish two categories of processes: privileged
   processes (whose effective user ID is 0, referred to as superuser or
   root), and unprivileged processes (whose effective UID is nonzero).
   Privileged processes bypass all kernel permission checks, while
   unprivileged processes are subject to full permission checking based
   on the process's credentials (usually: effective UID, effective GID,
   and supplementary group list).

   Starting with kernel 2.2, Linux divides the privileges traditionally
   associated with superuser into distinct units, known as capabilities,
   which can be independently enabled and disabled.  Capabilities are a
   per-thread attribute.

5
SIGKILLএগুলি ছাড়াও , যা একটি বিশেষ ক্ষেত্রে এবং কার্নেল দ্বারা সম্পূর্ণভাবে পরিচালিত হয়, সিগন্যালগুলি কেবল একটি অনুরোধ। প্রাপ্তি প্রক্রিয়া তাদের সাথে তারা কিছু করতে পারে।
চিপনার

3
@ চেপনার SIGKILL এবং অন্যটি ছাড়াও SIGSTOP...
jlliagre

1
@ চেপনার গ্রহণের প্রক্রিয়াটিকে সক্রিয়ভাবে সিদ্ধান্ত নিতে হবে যে এটি সংকেতটি পরিচালনা করতে চায়। যদি গ্রহণের প্রক্রিয়াটি এটি না করে থাকে, তবে ডিফল্টরূপে অনেকগুলি সংকেত প্রক্রিয়াটিকে ঠিক একইভাবে হত্যা SIGKILLকরবে। প্রাথমিকভাবে SIGINT, SIGKILLএবং SIGTERMঠিক একই প্রভাব ফেলবে, পার্থক্যটি হ'ল প্রাপ্তি প্রক্রিয়া তাদের কারও জন্য এই ডিফল্টটিকে পরিবর্তন করতে পারে।
ক্যাস্পার্ড

উত্তর:


34

লিনাক্সে এটি ফাইলের ক্ষমতার উপর নির্ভর করে।

নিম্নলিখিত সহজ mykill.cউত্স নিন :

#include <stdio.h>
#include <sys/types.h>
#include <signal.h>
#include <stdlib.h>

void exit_usage(const char *prog) {
        printf("usage: %s -<signal> <pid>\n", prog);
        exit(1);
}

int main(int argc, char **argv) {
        pid_t pid;
        int sig;

        if (argc != 3)
                exit_usage(argv[0]);

        sig = atoi(argv[1]);
        pid = atoi(argv[2]);

        if (sig >= 0 || pid < 2)
                exit_usage(argv[0]);

        if (kill(pid, -sig) == -1) {
                perror("failed");
                return 1;
        }
        printf("successfully sent signal %d to process %d\n", -sig, pid);

        return 0;
}

এটি তৈরি করুন:

gcc -Wall mykill.c -o /tmp/mykill

এখন ব্যবহারকারী রুট হিসাবে পটভূমিতে একটি ঘুম প্রক্রিয়া শুরু করুন:

root@horny:/root# /bin/sleep 3600 &
[1] 16098

এখন সাধারণ ব্যবহারকারী হিসাবে এটি হত্যা করার চেষ্টা করুন:

demouser@horny:/home/demouser$ ps aux | grep sleep
root     16098  0.0  0.0  11652   696 pts/20   S    15:06   0:00 sleep 500

demouser@horny:/home/demouser$ /tmp/mykill -9 16098
failed: Operation not permitted

এখন রুট ব্যবহারকারী হিসাবে /tmp/mykillক্যাপগুলি পরিবর্তন করুন :

root@horny:/root# setcap cap_kill+ep /tmp/mykill

এবং সাধারণ ব্যবহারকারী হিসাবে আবার চেষ্টা করুন:

demouser@horny:/home/demouser$ /tmp/mykill -9 16098
successfully sent signal 9 to process 16098

অবশেষে /tmp/mykillসুস্পষ্ট কারণে মুছে দিন ;)


3
আপনার ক্লু অনুসরণ করুন, আমি "ম্যান
ক্যাপিলিটিস

24

কিছুই:

strace kill -HUP 1
[...]
kill(1, SIGHUP)    = -1 EPERM (Operation not permitted)
[...]

1
এই ধরণের সুরক্ষাটি কি ওএস স্তর দ্বারা করা হয় বা ব্যবহারকারীর সিগন্যাল হ্যান্ডলারে হার্ড কোডড হয়?
লাভস্প্রিং

3
@ লভসপ্রিং কার্নেল লক্ষ্য প্রক্রিয়াতে সংকেত সরবরাহ করে না। সিস্কলটি একটি ত্রুটিযুক্ত করে ফিরে আসে এবং এটিকে উপেক্ষা করা ছাড়াও।
হাউক লেগেইন

সাধারণভাবে এটি সত্য নয়। এটি ক্ষমতা উপর নির্ভর করে।
গোলাম

1
@psmears হ্যাঁ, তবে অন্যদেরও একই ধারণা রয়েছে (উদাহরণস্বরূপ সোলারিতে "সুবিধাগুলি")। সুতরাং উত্তর "কিছুই না" অবশ্যই ভুল।
golum

1
@ গল্লুম: এটি একেবারেই ভুল নয় (সর্বোপরি, এটি সমস্ত ইউনিক্স-পরিবার ওএসের উপর পূর্বনির্ধারিত আচরণ এবং উদাহরণস্বরূপ পুরানো লিনাক্স কার্নেল সহ অনেকের মধ্যে একমাত্র সম্ভাব্য) তবে আপনি ঠিক বলেছেন যে এটি অসম্পূর্ণ - তবে কেবল উল্লেখ করা যেখানে তাদের সমর্থন দেওয়া হয় সে সম্পর্কে আরও বিশদে না গিয়ে "ক্ষমতা" সাধারণ ইউনিক্স সম্পর্কে একটি প্রশ্নেও অসম্পূর্ণ :)
গীতসংহিতা

5

kill(2) ম্যান পেজ ব্যাখ্যা করে:

লিনাক্স নোটস

বিভিন্ন কার্নেল সংস্করণ জুড়ে, লিনাক্স অপরিকল্পিত প্রক্রিয়াটির জন্য অন্য প্রসেসে সংকেত প্রেরণের জন্য প্রয়োজনীয় অনুমতিগুলির জন্য বিভিন্ন বিধি প্রয়োগ করেছে। 1.0 থেকে 1.2.2 কার্নেলগুলিতে, প্রেরকের কার্যকর ব্যবহারকারী আইডি যদি প্রাপকের সাথে মিলে যায় বা প্রেরকের প্রকৃত ব্যবহারকারী আইডিটি প্রাপকের সাথে মিলে যায় তবে একটি সংকেত পাঠানো যেতে পারে could কার্নেল 1.2.3 থেকে 1.3.77 অবধি, প্রেরকের কার্যকর ব্যবহারকারী আইডি যদি রিসিভারের আসল বা কার্যকর ব্যবহারকারী আইডির সাথে মেলে তবে একটি সংকেত পাঠানো যেতে পারে। POSIX.1-2-2001 অনুসারে বর্তমান বিধিগুলি কার্নেল ১.৩.7878 এ গৃহীত হয়েছিল।


1.3.78 হ'ল অত্যন্ত প্রাচীন ইতিহাস, 1.3 হিসাবে। 1995 বা এর আশেপাশের তারিখগুলি। ১.৩ ছিল উন্নয়নের সিরিজ ২.০ (1996 সালে) পর্যন্ত
ভোনব্র্যান্ড

-1

সিগন্যাল বহন করবে কিন্তু প্রক্রিয়া মালিক মূল অন্তর্ভুক্ত। সুতরাং, অন্য ব্যবহারকারীর প্রক্রিয়াটি সমাপ্ত করার অধিকার নেই তাই আপনি অনুমতি ত্রুটির সমস্যাটি পাবেন।

প্রক্রিয়া সমাপ্তি কেবল তখনই সম্ভব যখন আপনি প্রক্রিয়াটির মালিকানা (যথাযথ অধিকার) রাখেন।


না, sys_kill ব্যাক -১ দেয় এবং এর্নো -EPERM হবে।
পিটার বলেছেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.