লিনাক্স সমস্ত ব্যাখ্যাযুক্ত এক্সিকিউটেবলের (যেমন #!
লাইন দিয়ে শুরু করা এক্সিকিউটেবল ) উপর সেটুইড বিট উপেক্ষা করে । Comp.unix.questions প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী setuid শেল স্ক্রিপ্ট সাথে নিরাপত্তা সমস্যা ব্যাখ্যা করে। এই সমস্যাগুলি দুটি ধরণের: শেবাং-সম্পর্কিত এবং শেল-সম্পর্কিত; আমি নীচে আরও বিশদ যেতে।
আপনি যদি সুরক্ষার বিষয়ে চিন্তা না করেন এবং লিনাক্সের অধীনে সেটুয়েড স্ক্রিপ্টগুলি মঞ্জুরি দিতে চান তবে আপনাকে কার্নেলটি প্যাচ করতে হবে। 3.x কার্নেলের এর হিসাবে, আমি আপনাকে একটি কল যোগ করতে হবে মনে install_exec_creds
মধ্যে load_script
ফাংশন, কল করার আগে open_exec
, কিন্তু আমি পরীক্ষিত নি।
সেতুয়েড শেবাং
শেবাং ( #!
) সাধারণত যেভাবে প্রয়োগ করা হয় তার অন্তর্নিহিত একটি জাতি শর্ত রয়েছে :
- কার্নেল এক্সিকিউটেবলকে খোলে এবং এটি দিয়েই এটি শুরু হয়
#!
।
- কার্নেল এক্সিকিউটেবলটি বন্ধ করে দেয় এবং পরিবর্তে দোভাষীকে খোলে।
- কার্নেলটি স্ক্রিপ্টের পথটি আর্গুমেন্ট তালিকার (যেমন
argv[1]
) interোকায় এবং অনুবাদককে কার্যকর করে।
যদি এই প্রয়োগের সাথে সেটুইড স্ক্রিপ্টগুলি অনুমোদিত হয় তবে আক্রমণকারী একটি বিদ্যমান সেটুইড স্ক্রিপ্টের প্রতীকী লিঙ্ক তৈরি করে, এটি সম্পাদন করে এবং কার্নেলটি ধাপ 1 সম্পাদন করার পরে লিঙ্কটি পরিবর্তন করার ব্যবস্থা করে এবং দোভাষীর কাছাকাছি পৌঁছানোর আগেই আক্রমণকারী একটি স্বেচ্ছাসেবী স্ক্রিপ্ট শুরু করতে পারে can তার প্রথম যুক্তি খোলার। এই কারণে, বেশিরভাগ ইউনিটস যখন শেবাং সনাক্ত করে তখন সেটুইড বিটটিকে উপেক্ষা করে ।
এই প্রয়োগটি সুরক্ষিত করার একটি উপায় হ'ল কর্নেলের পক্ষে স্ক্রিপ্ট ফাইলটি লক করা পর্যন্ত ততক্ষণ পর্যন্ত দোভাষী এটি খুলবেন না (লক্ষ্য করুন এটি অবশ্যই ফাইলটিকে লিঙ্কযুক্ত বা ওভাররাইটিং প্রতিরোধ করতে পারে না, তবে কোনও ডিরেক্টরিকে ডিরেক্টরিতে নতুন নামকরণও করতে হবে)। তবে ইউনিক্স সিস্টেমগুলি বাধ্যতামূলক লকগুলি থেকে দূরে সরে যায় এবং প্রতীকী লিঙ্কগুলি একটি সঠিক লক বৈশিষ্ট্যটিকে বিশেষত কঠিন এবং আক্রমণাত্মক করে তোলে। আমি মনে করি না কেউ এইভাবে এটি করে।
কয়েকটি ইউনিক্স সিস্টেম (মূলত ওপেনবিএসডি, নেটবিএসডি এবং ম্যাক ওএস এক্স, যার মধ্যে একটি কার্নেল সেটিং সক্ষম করার প্রয়োজন রয়েছে) একটি অতিরিক্ত বৈশিষ্ট্য ব্যবহার করে সুরক্ষিত সেতুয়েড শেবাং প্রয়োগ করে: পথটি ইতিমধ্যে ফাইল বর্ণনাকারী এনটিতে খোলা ফাইলটিকে বোঝায় (তাই খোলা আছে মোটামুটি সমতুল্য )। অনেকগুলি ইউনিক্স সিস্টেমে (লিনাক্স সহ) সেটআপ স্ক্রিপ্ট নেই তবে but/dev/fd/N
/dev/fd/N
dup(N)
/dev/fd
- কার্নেল এক্সিকিউটেবলকে খোলে এবং এটি দিয়েই এটি শুরু হয়
#!
। ধরা যাক এক্সিকিউটেবলের জন্য ফাইল বর্ণনাকারী 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 এই আলোচনা সমানভাবে প্রযোজ্য যদি আপনি "সেটগিড" এর জন্য "সেটগিড" রাখেন; এগুলি উভয়ই স্ক্রিপ্টে লিনাক্স কার্নেল দ্বারা উপেক্ষা করা হয়