শেল স্ক্রিপ্টগুলিতে সেটুইডের অনুমতি দিন


184

setuidঅনুমতি বিট লিনাক্স বলে নির্বাহক পরিবর্তে মালিকের কার্যকর ব্যবহারকারী আইডি সহ একটি প্রোগ্রাম চালানোর জন্য:

> cat setuid-test.c

#include <stdio.h>
#include <unistd.h>

int main(int argc, char** argv) {
    printf("%d", geteuid());
    return 0;
}

> gcc -o setuid-test setuid-test.c
> ./setuid-test

1000

> sudo chown nobody ./setuid-test; sudo chmod +s ./setuid-test
> ./setuid-test

65534

তবে এটি কেবল এক্সিকিউটেবলের ক্ষেত্রেই প্রযোজ্য; শেল স্ক্রিপ্টস সেটিউড বিট উপেক্ষা করে:

> cat setuid-test2

#!/bin/bash
id -u

> ./setuid-test2

1000

> sudo chown nobody ./setuid-test2; sudo chmod +s ./setuid-test2
> ./setuid-test2

1000

উইকিপিডিয়া বলেছেন :

সুরক্ষা ত্রুটিগুলির বর্ধিত সম্ভাবনার কারণে, অনেকগুলি অপারেটিং সিস্টেম এক্সিকিউটেবল শেল স্ক্রিপ্টগুলিতে প্রয়োগ করার সময় সেটুইড বৈশিষ্ট্যটিকে উপেক্ষা করে।

ধরে নিচ্ছি যে আমি এই ঝুঁকিগুলি মেনে নিতে রাজি আছি, লিনাক্সকে শেল স্ক্রিপ্টগুলিতে এক্সিকিউটেবলের মতো একইরকম আচরণ করার জন্য কি কোনও উপায় আছে?

যদি তা না হয় তবে এই সমস্যাটির জন্য কি সাধারণ পরিকল্পনা রয়েছে? আমার বর্তমান সমাধানটি হ'ল পাসওয়ার্ড প্রম্পটটি এড়াতে আমি যে ব্যবহারকারীকে এটির মতো চালানো চাই সে হিসাবে কোনও প্রদত্ত স্ক্রিপ্টটি চালানোর sudoersঅনুমতি দেওয়ার ALLজন্য একটি এন্ট্রি যুক্ত করা NOPASSWD। এর মূল উত্সাহটি হ'ল sudoersআমি যখনই এটি করতে চাইছি ততবার প্রবেশের প্রয়োজন এবং sudo some-scriptকেবলমাত্র পরিবর্তে কলারের প্রয়োজন issome-script

উত্তর:


202

লিনাক্স সমস্ত ব্যাখ্যাযুক্ত এক্সিকিউটেবলের (যেমন #!লাইন দিয়ে শুরু করা এক্সিকিউটেবল ) উপর সেটুইড বিট উপেক্ষা করে । Comp.unix.questions প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী setuid শেল স্ক্রিপ্ট সাথে নিরাপত্তা সমস্যা ব্যাখ্যা করে। এই সমস্যাগুলি দুটি ধরণের: শেবাং-সম্পর্কিত এবং শেল-সম্পর্কিত; আমি নীচে আরও বিশদ যেতে।

আপনি যদি সুরক্ষার বিষয়ে চিন্তা না করেন এবং লিনাক্সের অধীনে সেটুয়েড স্ক্রিপ্টগুলি মঞ্জুরি দিতে চান তবে আপনাকে কার্নেলটি প্যাচ করতে হবে। 3.x কার্নেলের এর হিসাবে, আমি আপনাকে একটি কল যোগ করতে হবে মনে install_exec_credsমধ্যে load_scriptফাংশন, কল করার আগে open_exec, কিন্তু আমি পরীক্ষিত নি।


সেতুয়েড শেবাং

শেবাং ( #!) সাধারণত যেভাবে প্রয়োগ করা হয় তার অন্তর্নিহিত একটি জাতি শর্ত রয়েছে :

  1. কার্নেল এক্সিকিউটেবলকে খোলে এবং এটি দিয়েই এটি শুরু হয় #!
  2. কার্নেল এক্সিকিউটেবলটি বন্ধ করে দেয় এবং পরিবর্তে দোভাষীকে খোলে।
  3. কার্নেলটি স্ক্রিপ্টের পথটি আর্গুমেন্ট তালিকার (যেমন argv[1]) interোকায় এবং অনুবাদককে কার্যকর করে।

যদি এই প্রয়োগের সাথে সেটুইড স্ক্রিপ্টগুলি অনুমোদিত হয় তবে আক্রমণকারী একটি বিদ্যমান সেটুইড স্ক্রিপ্টের প্রতীকী লিঙ্ক তৈরি করে, এটি সম্পাদন করে এবং কার্নেলটি ধাপ 1 সম্পাদন করার পরে লিঙ্কটি পরিবর্তন করার ব্যবস্থা করে এবং দোভাষীর কাছাকাছি পৌঁছানোর আগেই আক্রমণকারী একটি স্বেচ্ছাসেবী স্ক্রিপ্ট শুরু করতে পারে can তার প্রথম যুক্তি খোলার। এই কারণে, বেশিরভাগ ইউনিটস যখন শেবাং সনাক্ত করে তখন সেটুইড বিটটিকে উপেক্ষা করে

এই প্রয়োগটি সুরক্ষিত করার একটি উপায় হ'ল কর্নেলের পক্ষে স্ক্রিপ্ট ফাইলটি লক করা পর্যন্ত ততক্ষণ পর্যন্ত দোভাষী এটি খুলবেন না (লক্ষ্য করুন এটি অবশ্যই ফাইলটিকে লিঙ্কযুক্ত বা ওভাররাইটিং প্রতিরোধ করতে পারে না, তবে কোনও ডিরেক্টরিকে ডিরেক্টরিতে নতুন নামকরণও করতে হবে)। তবে ইউনিক্স সিস্টেমগুলি বাধ্যতামূলক লকগুলি থেকে দূরে সরে যায় এবং প্রতীকী লিঙ্কগুলি একটি সঠিক লক বৈশিষ্ট্যটিকে বিশেষত কঠিন এবং আক্রমণাত্মক করে তোলে। আমি মনে করি না কেউ এইভাবে এটি করে।

কয়েকটি ইউনিক্স সিস্টেম (মূলত ওপেনবিএসডি, নেটবিএসডি এবং ম্যাক ওএস এক্স, যার মধ্যে একটি কার্নেল সেটিং সক্ষম করার প্রয়োজন রয়েছে) একটি অতিরিক্ত বৈশিষ্ট্য ব্যবহার করে সুরক্ষিত সেতুয়েড শেবাং প্রয়োগ করে: পথটি ইতিমধ্যে ফাইল বর্ণনাকারী এনটিতে খোলা ফাইলটিকে বোঝায় (তাই খোলা আছে মোটামুটি সমতুল্য )। অনেকগুলি ইউনিক্স সিস্টেমে (লিনাক্স সহ) সেটআপ স্ক্রিপ্ট নেই তবে but/dev/fd/N/dev/fd/Ndup(N)/dev/fd

  1. কার্নেল এক্সিকিউটেবলকে খোলে এবং এটি দিয়েই এটি শুরু হয় #!। ধরা যাক এক্সিকিউটেবলের জন্য ফাইল বর্ণনাকারী 3
  2. কার্নেল দোভাষী খোলে।
  3. কার্নেলটি /dev/fd/3আর্গুমেন্ট তালিকা সন্নিবেশ করায় argv[1]এবং অনুবাদককে কার্যকর করে।

সোভেন মাসচেখের শেবাং পৃষ্ঠায় সেউইড সমর্থন সহ, ইউনিসে জুড়ে শেবাং সম্পর্কিত প্রচুর তথ্য রয়েছে।


দোভাষী

ধরে নেওয়া যাক আপনি আপনার প্রোগ্রামটিকে মূল হিসাবে চালিত করতে সক্ষম হয়েছেন, কারণ আপনার ওএস সেটআপড শেবাংকে সমর্থন করে বা আপনি কোনও দেশীয় বাইনারি র‌্যাপার ব্যবহার করেছেন (যেমন sudo)। আপনি কি একটি সুরক্ষা গর্ত খুলেছেন? হতে পারে । এখানে সমস্যাটি বর্ণিত বনাম সংকলিত প্রোগ্রামগুলি সম্পর্কে নয় । সমস্যাটি হ'ল যদি আপনার রানটাইম সিস্টেমটি সুবিধাগুলি দিয়ে কার্যকর করা হয় তবে নিরাপদে আচরণ করে।

  • যে কোনও গতিশীলভাবে সংযুক্ত নেটিভ বাইনারি এক্সিকিউটেবলটি ডায়নামিক লোডার (উদাহরণস্বরূপ /lib/ld.so) দ্বারা ব্যাখ্যা করা উপায় যা প্রোগ্রামের জন্য প্রয়োজনীয় ডায়নামিক লাইব্রেরিগুলি লোড করে। অনেকগুলি ওয়েবসাইটে, আপনি পরিবেশের মাধ্যমে ডায়নামিক লাইব্রেরিগুলির জন্য অনুসন্ধানের পথটি কনফিগার করতে পারেন ( LD_LIBRARY_PATHপরিবেশের পরিবর্তনশীলের একটি সাধারণ নাম), এবং সমস্ত সম্পাদিত বাইনারিগুলিতে অতিরিক্ত লাইব্রেরিও লোড করতে পারেন ( LD_PRELOAD)। প্রোগ্রামের invoker স্থাপন একটি বিশেষ ভাবে পেরেছিলেন যে প্রোগ্রামের প্রেক্ষাপটে নির্বিচারে কোড নির্বাহ করতে পারেন libc.soমধ্যে $LD_LIBRARY_PATH(অন্যান্য কৌশল মধ্যে)। সমস্ত বুদ্ধিমান সিস্টেমগুলি LD_*সেটুইড এক্সিকিউটেবলের মধ্যে ভেরিয়েবলগুলি উপেক্ষা করে ।

  • ইন শেল যেমন SH, csh শেল ও ডেরিভেটিভস হিসাবে, বিভিন্ন পরিবেশের স্বয়ংক্রিয়ভাবে শেল পরামিতি হয়ে। যেমন PATH, IFSএবং আরও অনেকগুলি প্যারামিটারগুলির মাধ্যমে , স্ক্রিপ্টের চালককে শেল স্ক্রিপ্টগুলির প্রসঙ্গে স্বেচ্ছাসেবক কোড কার্যকর করার অনেক সুযোগ রয়েছে। কিছু শেল এই ভেরিয়েবলগুলি স্যান ডিফল্টগুলিতে সেট করে যদি তারা সনাক্ত করে যে স্ক্রিপ্টটি সুবিধাগুলি সহ আহ্বান করা হয়েছে তবে আমি জানি না যে আমি বিশ্বাস করব এমন কোনও নির্দিষ্ট প্রয়োগ রয়েছে।

  • বেশিরভাগ রানটাইম এনভায়রনমেন্টে (দেশীয়, বাইটকোড বা ব্যাখ্যা করা যাই হোক না কেন) একই বৈশিষ্ট্য রয়েছে। কিছু লোক নির্ধারিত এক্সিকিউটেবলগুলিতে বিশেষ সতর্কতা অবলম্বন করে, যদিও স্থানীয় কোডগুলি চালিত ডায়ামিক লিঙ্কিংয়ের (যা সতর্কতা অবলম্বন করে) এর চেয়ে প্রায়শই কোনও কাজ করে না।

  • পার্ল একটি উল্লেখযোগ্য ব্যতিক্রম। এটি স্পষ্টতভাবে একটি নিরাপদ উপায়ে সেটুইড স্ক্রিপ্টগুলিকে সমর্থন করে । প্রকৃতপক্ষে, আপনার ওএস স্ক্রিপ্টগুলিতে সেটুইড বিট উপেক্ষা করলেও আপনার স্ক্রিপ্ট সেটআপড চালাতে পারে। এর কারণ পার্ল জাহাজগুলি একটি সেটুইড রুট সহায়ক সহ প্রয়োজনীয় চেকগুলি সম্পাদন করে এবং পছন্দসই সুবিধাগুলি সহ পছন্দসই স্ক্রিপ্টগুলিতে দোভাষীকে পুনরায় অনুরোধ করে। এটি পার্লেস্ক ম্যানুয়ালটিতে ব্যাখ্যা করা হয়েছে । এটি ব্যবহৃত হত যে #!/usr/bin/suidperl -wTপরিবর্তে সেটলয়েড পার্ল স্ক্রিপ্টগুলি প্রয়োজন #!/usr/bin/perl -wT, তবে বেশিরভাগ আধুনিক সিস্টেমে #!/usr/bin/perl -wTযথেষ্ট।

মনে রাখবেন যে দেশীয় বাইনারি র‍্যাপার ব্যবহার করে এই সমস্যাগুলি প্রতিরোধ করতে নিজের মধ্যে কিছু হয় না । প্রকৃতপক্ষে, এটি পরিস্থিতি আরও খারাপ করে তুলতে পারে, কারণ এটি আপনার রানটাইম পরিবেশকে এটি অধিকার থেকে নেওয়া হয়েছে এবং এটির রানটাইম কনফিগারেশনকে বাইপাস করে তা সনাক্ত করতে বাধা দিতে পারে।

নেটিভ বাইনারি র‌্যাপার শেল স্ক্রিপ্টকে নিরাপদ করে তুলতে পারে যদি মোড়ক পরিবেশটি স্বাস্থ্যকর করে তোলে । স্ক্রিপ্ট অবশ্যই খুব বেশি অনুমান (উদাহরণস্বরূপ বর্তমান ডিরেক্টরি সম্পর্কে) তৈরি না করা উচিত তবে এটি যায়। এই পরিবেশের স্যানিটাইজ করার জন্য এটি সেট আপ করা হয়েছে এর জন্য আপনি sudo ব্যবহার করতে পারেন। ব্ল্যাকলিস্টিং ভেরিয়েবলগুলি ত্রুটি-প্রবণ, তাই সর্বদা হোয়াইটলিস্ট। উবুন্টু দিয়ে, নিশ্চিত করুন যে env_resetবিকল্পটি চালু করা হয়, setenvবন্ধ, এবং যে env_fileএবং env_keepশুধুমাত্র নির্দোষ ভেরিয়েবল ধারণ করে।


টি এল, ডিআর:

  • সেতুয়েড শেবাং নিরাপত্তাহীন তবে সাধারণত উপেক্ষা করা হয়।
  • আপনি যদি সুবিধাগুলি সহ কোনও প্রোগ্রাম চালনা করেন (হয় সুডো বা সেটুয়েডের মাধ্যমে), নেটিভ কোড বা পার্ল লিখুন, বা পরিবেশকে স্যানিটাইজ করে এমন একটি মোড়কের সাহায্যে প্রোগ্রাম শুরু করুন (যেমন env_resetবিকল্পের সাথে সুডো )।

You এই আলোচনা সমানভাবে প্রযোজ্য যদি আপনি "সেটগিড" এর জন্য "সেটগিড" রাখেন; এগুলি উভয়ই স্ক্রিপ্টে লিনাক্স কার্নেল দ্বারা উপেক্ষা করা হয়


2
@ জোশ: সুরক্ষিত সেটেলয়েড শেল স্ক্রিপ্টগুলি সম্ভব, তবে কেবলমাত্র শেল প্রয়োগকারী এবং স্ক্রিপ্ট লেখক যদি খুব সতর্ক হন। নেটিভ কোডের পরিবর্তে, আমি পার্লকে প্রস্তাব দিই, যেখানে প্রয়োগকারীরা সাবধানতা অবলম্বন করেছেন যে স্ক্রিপ্ট লেখকের পক্ষে সামান্য প্রচেষ্টা করে সেটআপড স্ক্রিপ্টগুলি নিরাপদ হওয়া উচিত।
গিলস

3
স্পষ্টতই suidperl
স্টাফগুলি

7
প্রকৃতপক্ষে suidperlপার্ল 5.11 (5.12 স্থিতিশীল) হিসাবে সরানো হয়েছে: পার্ল ৫১০ ডেল্টা:> "সাইডপারল" সরানো হয়েছে। এটি সঠিকভাবে সমর্থন করে না এমন সিস্টেমে সেটুইড অনুমতি বিটগুলি অনুকরণ করার একটি ব্যবস্থা সরবরাহ করত। perl5120 ডেল্টা:> "সাইডপারল" আর পার্লের অংশ নয়। এটি সঠিকভাবে সমর্থন করে না এমন সিস্টেমে সেটুইড অনুমতি বিটগুলি অনুকরণ করার একটি ব্যবস্থা সরবরাহ করত।
র্যান্ডি স্টোনার

5
পার্ল 5.6.1 ডক্স (প্রায় এক দশক আগে) থেকে এই লাইনটি নোট করুন ... পেরেল ৫61১ ডেল্টা:> নোট করুন যে পার্লের সাম্প্রতিক সংস্করণে সাইড্পারেল ডিফল্টরূপে নির্মিত বা ইনস্টল করা নেই। সাইডপারেলের ব্যবহার অত্যন্ত নিরুৎসাহিত । আপনি যদি মনে করেন আপনার এটির প্রয়োজন আছে তবে প্রথমে sudo এর মতো বিকল্প ব্যবহার করে দেখুন। কোর্টেসন.সুডো দেখুন ।
র্যান্ডি স্টোনার

3
আমি বুঝতে পারি না: এটি সমস্যার কারণগুলির ব্যাখ্যা বলে মনে হচ্ছে, তবে এখানে ওপি-র প্রশ্নের প্রকৃত উত্তর আছে কি? আমার ওএসকে সেটুয়েড শেল স্ক্রিপ্টগুলি চালানোর জন্য কি কোনও উপায় আছে?
টম

55

এই সমস্যাটি সমাধানের একটি উপায় হ'ল এমন প্রোগ্রাম থেকে শেল স্ক্রিপ্ট কল করা যা সেটুইড বিটটি ব্যবহার করতে পারে।
এটি sudo মত কিছু। উদাহরণস্বরূপ, আপনি এখানে একটি সি প্রোগ্রামে এটি কীভাবে সম্পন্ন করবেন:

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

int main()
{
    setuid( 0 );   // you can set it at run time also
    system( "/home/pubuntu/setuid-test2.sh" );
    return 0;
 }

সেটআপড-টেস্ট 2.c হিসাবে এটি সংরক্ষণ করুন।
কম্পাইল
এখন এই প্রোগ্রাম বাইনারি উপর setuid করুন:

su - nobody   
[enter password]  
chown nobody:nobody a.out  
chmod 4755 a.out  

এখন, আপনি এটি চালাতে সক্ষম হবেন এবং আপনি আপনার স্ক্রিপ্টটি কারও অনুমতি ছাড়াই সম্পাদন করতে দেখবেন।
তবে এখানে হয় আপনাকে স্ক্রিপ্টের পথটি হার্ডকোড করতে হবে বা উপরের এক্সেল পর্যন্ত কমান্ড লাইন আর্গ হিসাবে পাস করতে হবে।


25
কমান্ড লাইন আর্গুমেন্ট হিসাবে স্ক্রিপ্টটি পাস করার অনুমতি দেওয়ার পরামর্শের বিরুদ্ধে আমি পরামর্শ দেব, যেহেতু যে প্রোগ্রামটি সম্পাদন করতে পারে এমন যে কোনও ব্যক্তিকে সেই সংজ্ঞায়িত ব্যবহারকারীর হিসাবে যে কোনও স্ক্রিপ্ট চালানোর ক্ষমতা দেয়।
dsp

39
নোট করুন যে স্ক্রিপ্টের পুরো পথটি হার্ডকোড করা থাকলেও এটি অসম্পূর্ণ। শেলটি পরিবেশ থেকে ভেরিয়েবলের উত্তরাধিকারী হবে এবং তাদের মধ্যে অনেকেই আমন্ত্রককে স্বেচ্ছাসেবক কোড ইনজেক্ট করার অনুমতি দেয়। PATHএবং LD_LIBRARY_PATHসুস্পষ্ট ভেক্টর। কিছু শাঁস চালানো $ENVবা $BASHENVবা ~/.zshenvএমনকি আগে তারা স্ক্রিপ্ট সঠিক নির্বাহ শুরু করেন, যাতে আপনি স্ক্রিপ্ট-এ গিয়ে এ সব থেকে রক্ষা করতে পারবে না। সুবিধাগুলি সহ শেল স্ক্রিপ্ট শুরু করার একমাত্র নিরাপদ উপায় হল পরিবেশ পরিষ্কার করা । এটি নিরাপদে কীভাবে করা যায় তা সুডো জানেন। সুতরাং আপনার নিজের মোড়ক লিখবেন না, সুডো ব্যবহার করুন
গিলস

28
আমার খারাপ লাগছে যে তিনি হঠাৎ করে এর জন্য হতাশ হয়ে পড়েছেন - আমি স্পষ্টভাবে বলেছিলাম যে আমিও অনিরাপদ সংস্করণগুলি শুনতে চাইছিলাম, এবং আমি এটি কার্যকর করার সময় কল্পনা করছিলাম যা শেল স্ক্রিপ্টের যুক্তিটি যখন আমি বলেছিলাম তখন তা গ্রহণ করেছিল। স্পষ্টতই এটি ব্যাপকভাবে নিরাপত্তাহীন, তবে কী সম্ভাবনা রয়েছে তা জানতে চেয়েছিলাম
মাইকেল মরোজেক

8
@ গিলস: এফওয়াইআই, লিনাক্স LD_LIBRARY_PATHযখন সেটুয়েড বিটের মুখোমুখি হয় তখন অন্যান্য বিষয়গুলির মধ্যে আনসেট করে ।
মাধ্যাকর্ষণ

3
ব্যবহারের পরিবর্তে system, আপনি পরিবারের কোনওটি ব্যবহার করা সহজ (এবং আরও দক্ষ) সন্ধান করতে পারেন exec- সম্ভবত execve। এইভাবে, আপনি একটি নতুন প্রক্রিয়া তৈরি করেন না বা একটি শেল শুরু করেন না এবং আপনি যুক্তিগুলি ফরোয়ার্ড করতে পারেন (ধরে নেওয়া হয় যে আপনার সুবিধাযুক্ত স্ক্রিপ্টটি নিরাপদে যুক্তিগুলি পরিচালনা করতে পারে)।
টবি স্পিড 18

23

আমি এই নৌকোয় এমন কয়েকটি স্ক্রিপ্ট উপসর্গ করেছি:

#!/bin/sh
[ "root" != "$USER" ] && exec sudo $0 "$@"

নোট করুন যে এটি ব্যবহার করে না setuidতবে কেবলমাত্র বর্তমান ফাইলটি দিয়ে এটি প্রয়োগ করে sudo


4
এটি সেটুইড ব্যবহার করে না তবে কেবল আপনাকে একটি sudoপ্রম্পট দেয় । (আমার জন্য, সেটুয়েডের পুরো পয়েন্টটি সুডোর প্রয়োজন ছাড়াই জিনিসগুলি রুট হিসাবে চালানোর অনুমতি দেয়))
লু

12

আপনি যদি কল এড়াতে চান তবে আপনি sudo some_scriptকেবল এটি করতে পারেন:

  #!/ust/bin/env sh

  sudo /usr/local/scripts/your_script

SETUID প্রোগ্রামগুলি চূড়ান্ত যত্নের সাথে ডিজাইন করা দরকার কারণ তারা মূল সুবিধাগুলি দিয়ে চলে এবং ব্যবহারকারীরা তাদের উপর বিশাল নিয়ন্ত্রণ রাখেন। তাদের সমস্ত তাত্পর্যপূর্ণ পরীক্ষা করা দরকার। আপনি এটি স্ক্রিপ্ট দিয়ে করতে পারবেন না কারণ:

  • শেলগুলি সফ্টওয়্যারের বড় টুকরো যা ব্যবহারকারীর সাথে প্রচুর পরিমাণে যোগাযোগ করে। সমস্ত কিছু পরীক্ষা করা প্রায় অসম্ভব - বিশেষত যেহেতু বেশিরভাগ কোডের উদ্দেশ্য এই জাতীয় মোডে চালানো নয়।
  • স্ক্রিপ্টগুলি বেশিরভাগ তাত্ক্ষণিক সমাধান এবং সাধারণত সেভাবে যত্নের সাথে প্রস্তুত হয় না যে তারা সেটুইডের অনুমতি দেয়। তাদের অনেকগুলি সম্ভাব্য বিপজ্জনক বৈশিষ্ট্য রয়েছে।
  • তারা অন্যান্য প্রোগ্রামের উপর অনেক বেশি নির্ভর করে। শেলটি পরীক্ষা করা যথেষ্ট ছিল না। sed, awkইত্যাদিও পরীক্ষা করা দরকার

দয়া করে নোট করুন যে sudoকিছু বিড়ম্বনা-চেকিং সরবরাহ করে তবে এটি পর্যাপ্ত নয় - আপনার নিজের কোডের প্রতিটি লাইন চেক করুন।

শেষ নোট হিসাবে: ক্ষমতা ব্যবহার বিবেচনা করুন। তারা আপনাকে ব্যবহারকারীর বিশেষ সুবিধার্থে চলমান একটি প্রক্রিয়া দেওয়ার মঞ্জুরি দেয় যাতে সাধারণত রুট সুবিধার প্রয়োজন হয়। তবে উদাহরণস্বরূপ, pingনেটওয়ার্কটি চালিত করার সময় এটির ফাইলে অ্যাক্সেস থাকা দরকার না। আমি উত্তরাধিকার সূত্রে প্রাপ্ত কিনা তা নিশ্চিত নই।


2
আমার ধারণা করা /ust/bin/envউচিত /usr/bin/env
বব

4

আপনি স্ক্রিপ্টের নামের জন্য sudo + এর জন্য একটি নাম তৈরি করতে পারেন। অবশ্যই এটি সেটআপ করা আরও বেশি কাজ, যেহেতু আপনাকে তখন একটি উপাধিও সেটআপ করতে হবে তবে এটি আপনাকে sudo টাইপ করা থেকে বাঁচায়।

তবে যদি আপনি ভয়াবহ সুরক্ষা ঝুঁকিতে কিছু মনে করেন না, শেল স্ক্রিপ্টের দোভাষী হিসাবে একটি সেটুইড শেল ব্যবহার করুন। এটি আপনার পক্ষে কাজ করবে কিনা জানি না তবে আমার ধারণা এটি সম্ভবত।

যদিও আমাকে বলা যাক যে আমি আসলে এটি করার বিরুদ্ধে পরামর্শ দিই। আমি কেবল এটি শিক্ষাগত উদ্দেশ্যে উল্লেখ করছি ;-)


5
এটা কাজ করবে। মারাত্মকভাবে আপনি বলেছেন হিসাবে। সেটটি বিট ঠিকমতো মালিকের সাথে মৃত্যুদন্ড কার্যকর করতে দেয়। সেটুইড শেল (সেটআপের সাথে কাজ করার জন্য নকশাকৃত না হলে) যে কোনও ব্যবহারকারীর জন্য রুট হিসাবে চলবে। অর্থাৎ যে কেউ চালাতে পারে rm -rf /(এবং সিরিজ থেকে অন্যান্য কমান্ডগুলি ঘরে এটি করবেন না )।
ম্যাকিয়েজ পাইচোটকা

9
@ ম্যাসিজেপিচোটকা ঘরে বসে এটি করবেন না আপনি কী বোঝাতে চাইছেন যে কাজ করার জন্য নির্দ্বিধায়? :)
পিটারফ

4

সুপার [-r রিকপথ] কমান্ড [টি]

সুপার নির্দিষ্ট ব্যবহারকারীদের স্ক্রিপ্টগুলি (বা অন্যান্য কমান্ড) চালানোর জন্য অনুমতি দেয় যেমন তারা রুট; অথবা এটি কমান্ড কার্যকর করার আগে প্রতি কমান্ডের ভিত্তিতে uid, gid, এবং / অথবা পরিপূরক গোষ্ঠীগুলি সেট করতে পারে। এটি স্ক্রিপ্টগুলি সেটআপড রুট তৈরির একটি নিরাপদ বিকল্প হতে পারে। সুপার সাধারণ ব্যবহারকারীদের অন্যদের দ্বারা মৃত্যুদন্ড কার্যকর করার আদেশও সরবরাহ করতে দেয়; এগুলি ইউআইডি, জিড এবং কমান্ডটি সরবরাহকারী ব্যবহারকারীদের গোষ্ঠীর সাথে সম্পাদন করে।

সুপারার একটি requested `সুপার.ট্যাব '' ফাইলটি ব্যবহারকারীকে অনুরোধ করা আদেশটি কার্যকর করার অনুমতি দেয় কিনা তা দেখার জন্য পরামর্শ করে। যদি অনুমতি দেওয়া হয়, সুপার পিজিএম [আরগস] সম্পাদন করবে, যেখানে পিজিএম হ'ল এই কমান্ডের সাথে যুক্ত প্রোগ্রাম। (ডিফল্টরূপে রুটকে মৃত্যুদন্ড কার্যকর করার অনুমতি দেওয়া হয় তবে কোনও নিয়ম রুটকে বাদ দিলে এখনও অস্বীকার করা যায় inary সাধারণ ব্যবহারকারীরা ডিফল্টরূপে মৃত্যুদন্ড কার্যকর করতে পারেন না))

যদি কমান্ডটি সুপার প্রোগ্রামের একটি প্রতীকী লিঙ্ক (বা হার্ড লিঙ্কও হয়), তবে% কমান্ড আরগগুলি টাইপ করা% সুপার কমান্ড আরোগুলি টাইপের সমান (কমান্ডটি অবশ্যই সুপার হতে হবে না, বা সুপার বুঝতে পারবে না যে এটি একটি মাধ্যমে প্রেরণ করা হচ্ছে) লিংক।)

http://www.ucolick.org/~will/RUE/super/README

http://manpages.ubuntu.com/manpages/utopic/en/man1/super.1.html


হাই এবং সাইটে আপনাকে স্বাগতম! আমরা আশা করি উত্তরগুলি এখানে আরও বিস্তারিত হবে। আপনি কি নিজের উত্তরটি সম্পাদনা করতে পারবেন এবং ব্যাখ্যা করতে পারবেন যে এই প্রোগ্রামটি কী এবং এটি কীভাবে ওপিটির সমস্যা সমাধানে সহায়তা করতে পারে?
টেরডন

আপনাকে নিজামকে ধন্যবাদ, কয়েক ঘন্টা ধরে অ্যাকাউন্টের জন্য সুপারের মতো কিছু খুঁজে পাওয়ার চেষ্টা করার জন্য, অন্য কোনও ব্যবহারকারী এই ফাইলটির ব্যবহারকারী হিসাবে মৃত্যুদণ্ড কার্যকর করার অনুমতি দেয়।
চাদ

2

যদি কোনও কারণে sudoউপলব্ধ না হয় তবে আপনি সি তে একটি পাতলা মোড়ক স্ক্রিপ্ট লিখতে পারেন:

#include <unistd.h>
int main() {
    setuid(0);
    execle("/bin/bash","bash","/full/path/to/script",(char*) NULL,(char*) NULL);
}

এবং একবার আপনি কম্পাইল এটা হিসাবে সেট setuidসঙ্গে chmod 4511 wrapper_script

এটি অন্য পোস্ট করা উত্তরের মতো, তবে একটি পরিষ্কার পরিবেশের সাথে স্ক্রিপ্টটি চালায় এবং /bin/bashডাকা শেলের পরিবর্তে স্পষ্টতই ব্যবহার করে system()এবং তাই কিছু সম্ভাব্য সুরক্ষা গর্ত বন্ধ করে দেয়।

নোট করুন যে এটি পরিবেশকে পুরোপুরি ছাড়ছে। দুর্বলতা না খুলে আপনি যদি কিছু পরিবেশগত পরিবর্তনশীল ব্যবহার করতে চান তবে আপনার সত্যিকারের ব্যবহার প্রয়োজন sudo

স্পষ্টতই, আপনি নিশ্চিত করতে চান যে স্ক্রিপ্টটি নিজেই কেবল রুট দ্বারা লিখনযোগ্য।


-3

আমি এই প্রশ্নটি প্রথম খুঁজে পেয়েছি, সমস্ত উত্তর দ্বারা স্বীকৃত, এখানে একটি আরও ভাল একটি উত্তর দেওয়া হয়েছে, যদি আপনি এত ঝোঁক থাকেন তবে আপনাকে আপনার বাশ স্ক্রিপ্টটি পুরোপুরি অস্পষ্ট করতে দেয়!

এটি স্ব-ব্যাখ্যামূলক হওয়া উচিত।

#include <string>
#include <unistd.h>

template <typename T, typename U>
T &replace (
          T &str, 
    const U &from, 
    const U &to)
{
    size_t pos;
    size_t offset = 0;
    const size_t increment = to.size();

    while ((pos = str.find(from, offset)) != T::npos)
    {
        str.replace(pos, from.size(), to);
        offset = pos + increment;
    }

    return str;
}

int main(int argc, char* argv[])
{
    // Set UUID to root
    setuid(0);

    std::string script = 
R"(#!/bin/bash
whoami
echo $1
)";

    // Escape single quotes.
    replace(script, std::string("'"), std::string("'\"'\"'"));

    std::string command;
    command = command + "bash -c '" + script + "'"; 

    // Append the command line arguments.
    for (int a = 0; a < argc; ++a)
    {
        command = command + " " + argv[a];
    }

    return system(command.c_str());
}

তারপরে আপনি দৌড়ান

g++ embedded.cpp -o embedded
sudo chown root embedded
sudo chmod u+s embedded

ডাউনভোটস কেন ???
থিওডোর আর স্মিথ

2
সম্ভবত কারণ এটি একটি অত্যধিক জটিল সমাধান যা স্ট্রিং ম্যানিপুলেশন করে এবং শেম কোড এম্বেড করে। হয় আপনি একটি সাধারণ লঞ্চার তৈরি করেন, বা আপনি sudo ব্যবহার করেন। এটি সমস্ত বিকল্পের মধ্যে সবচেয়ে খারাপ।
স্যারাইড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.