শেলশক বাগের জন্য আমার বাশ শেলটি পরীক্ষা করতে আমি যে কমান্ডটি ব্যবহার করেছি তা এখানে:
env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
কেউ দয়া করে বিশদে কমান্ডটি ব্যাখ্যা করতে পারেন?
শেলশক বাগের জন্য আমার বাশ শেলটি পরীক্ষা করতে আমি যে কমান্ডটি ব্যবহার করেছি তা এখানে:
env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
কেউ দয়া করে বিশদে কমান্ডটি ব্যাখ্যা করতে পারেন?
উত্তর:
এই উত্তরটি ম্যাথু মিলার দ্বারা ফেডোরা ম্যাগাজিনে একটি মূল নিবন্ধের উত্স, এটি ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন-শেয়ার অ্যালাইক 4.0 লাইসেন্সের আওতায় অনুমোদিত
আমাকে বিস্তারিত বলতে দাও:
env x='() { :;}; echo OOPS' bash -c :
এটি একটি ঝুঁকিপূর্ণ সিস্টেমে "OOPS" মুদ্রণ করবে, তবে বাশ প্যাচ করা থাকলে নিঃশব্দে প্রস্থান করবে।
env x='() { :;}; echo OOPS' bash -c "echo this is a test"
এটি একটি ঝুঁকিপূর্ণ সিস্টেমে "OOPS" মুদ্রণ করবে, তবে “this is a test”
বাশ প্যাচ করা থাকলে মুদ্রণ করা হবে।
এবং আপনি সম্ভবত শুনেছেন এটির পরিবেশের ভেরিয়েবলগুলির সাথে কিছু করার আছে। তবে, এনভায়রনমেন্ট ভেরিয়েবলের কোডটি কার্যকর করা হচ্ছে কেন? ঠিক আছে, এটি হওয়ার কথা নয় - তবে, এমন কোনও বৈশিষ্ট্যের কারণে যা আমি নিজের ভালোর জন্য কিছুটা চালাক বলতে প্ররোচিত হই, ত্রুটির জন্য কিছু জায়গা আছে। টার্মিনাল প্রম্পট হিসাবে আপনি যা দেখছেন তা হ'ল বাশ, তবে এটি একটি স্ক্রিপ্টিং ভাষাও রয়েছে এবং এতে ফাংশনগুলি সংজ্ঞায়িত করার ক্ষমতাও রয়েছে। আপনি এটি এরকম করুন:
$ Ubuntu() { echo "Ubuntu is awesome."; }
এবং তারপরে আপনার একটি নতুন আদেশ রয়েছে have মনে রাখবেন যে এখানটি echo
আসলে চালানো হয়নি; এটি আমাদের সংরক্ষিত হয়েছে যখন আমরা আমাদের নতুন কমান্ডটি চালাব তখন কী হবে। এটি এক মিনিটের মধ্যে গুরুত্বপূর্ণ হবে!
$ Ubuntu
Ubuntu is awesome.
দরকারী! তবে, আসুন, যাক, কোনও কারণে, আমাদের সাবপ্রসেস হিসাবে ব্যাশের একটি নতুন উদাহরণ কার্যকর করতে হবে এবং এর অধীনে আমার দুর্দান্ত কমান্ডটি চালাতে চাই। বিবৃতি bash -c somecommand
হুবহু এটি করে: একটি নতুন শেলের মধ্যে প্রদত্ত কমান্ডটি চালায়:
$ bash -c Ubuntu
bash: Ubuntu: command not found
বিস্ময়। দু: খিত। শিশুটি ফাংশন সংজ্ঞার উত্তরাধিকার সূত্রে পায় নি। তবে, এটি অন্তর্নিহিত পরিবেশটি করে - কী-মান সংযোজনগুলির একটি সংগ্রহ যা শেল থেকে রফতানি করা হয়েছে। (এটি একটি সম্পূর্ণ 'পুষ্টি ধারণা; যদি আপনি এটির সাথে পরিচিত না হন তবে আপাতত আমার উপর বিশ্বাস করুন)) এবং দেখা যাচ্ছে, বাশও ফাংশনগুলি রফতানি করতে পারে। তাই:
$ export -f Ubuntu
$ bash -c Ubuntu
Ubuntu is awesome.
কোনটি সব ভাল এবং ভাল হয় - যে যে পদ্ধতিতে এই সম্পন্ন করা হয় ব্যতীত sorta চতুর । মূলত, যেহেতু পরিবেশ পরিবর্তনশীলগুলিতে ফাংশন করার জন্য লিনাক্স / ইউনিক্স যাদু নেই, তাই রফতানি ফাংশনটি কেবলমাত্র ফাংশন সংজ্ঞাযুক্ত একটি নিয়মিত পরিবেশ পরিবর্তনশীল তৈরি করে। তারপরে, যখন দ্বিতীয় শেলটি "আগত" পরিবেশটি পড়ে এবং কোনও ফাংশনের মতো দেখতে সামগ্রীগুলির সাথে একটি ভেরিয়েবলের মুখোমুখি হয়, তখন এটি তার মূল্যায়ন করে।
তত্ত্ব অনুসারে, এটি পুরোপুরি নিরাপদ , কারণ মনে রাখবেন যে কোনও ফাংশন সংজ্ঞায়িত করা আসলে এটি কার্যকর করে না । ব্যতীত - এবং এই কারণেই আমরা এখানে আছি - কোডটিতে একটি বাগ ছিল যেখানে ফাংশন সংজ্ঞা শেষ হওয়ার পরে মূল্যায়ন থামেনি। এটি কেবল যাচ্ছে কিপস।
যে যখন ফাংশন একটি পরিবেশ পরিবর্তনশীল সঞ্চিত সঙ্গে বৈধভাবে তৈরি হয়, ঘটতে না হবে export -f
। তবে, বৈধ হবে কেন? একটি আক্রমণকারী কেবল কোনও পুরানো পরিবেশের পরিবর্তনশীল তৈরি করতে পারে এবং যদি এটি কোনও ফাংশনের মতো মনে হয় তবে নতুন বাশ শেলগুলি এটি ভাববে!
সুতরাং, আমাদের প্রথম উদাহরণে:
env x='() { :;}; echo OOPS' bash -c "echo this is a test"
env
কমান্ড একটি প্রদত্ত পরিবর্তনশীল সেট দিয়ে কমান্ড রান। এই ক্ষেত্রে, আমরা x
কোনও ফাংশনের মতো দেখতে এমন কিছুতে সেট করছি looks ফাংশনটি কেবল একটি একক :
, যা আসলে একটি সাধারণ কমান্ড যা কিছুই না করে সংজ্ঞায়িত করা হয়। তবে তারপরে, semi-colon
যা ফাংশন সংজ্ঞাটির শেষের ইঙ্গিত দেয়, সেখানে একটি echo
আদেশ আছে। এটি সেখানে থাকার কথা নয়, তবে আমাদের এটি করা থেকে বিরত করার কিছুই নেই।
তারপরে, এই নতুন পরিবেশের সাথে চালানোর জন্য প্রদত্ত আদেশটি হ'ল নতুন বাশ শেল, আবার একটি " echo this is a test
" বা "কিছুই করবেন না :
" কমান্ড সহ, এটি সম্পূর্ণ নিরীহভাবে প্রস্থান করবে।
কিন্তু - উফ! যখন নতুন শেলটি শুরু হয় এবং পরিবেশটি পড়ে, এটি x
পরিবর্তনশীলটিতে পৌঁছে যায় এবং যেহেতু এটি কোনও ফাংশনের মতো লাগে তাই এটি এটিকে মূল্যায়ন করে। ফাংশন সংজ্ঞাটি নিরীহভাবে লোড করা হয় - এবং তারপরে আমাদের দূষিত পেওলডটিও ট্রিগার করা হয়। সুতরাং, যদি আপনি উপরেরটি একটি দুর্বল সিস্টেমে চালনা করেন তবে আপনি “OOPS”
আবার মুদ্রিত হবেন । অথবা, কোনও আক্রমণকারী কেবল কিছু মুদ্রণের চেয়ে আরও খারাপ কিছু করতে পারে।
env
প্রয়োজনীয় নয়। আপনি একই ফলাফলের এটা ছাড়া কমান্ড ব্যবহার করে (পাস / কিনা ব্যাশ আপডেট করা হয়েছে তার উপর নির্ভর করে ব্যর্থ) পেতে পারেন: x='() { :;}; echo OOPS' bash -c "echo this is a test"
। এর কারণ কারণ একটি ভেরিয়েবল অ্যাসাইনমেন্ট সহ একটি কমান্ডের পূর্বে সেই পরিবর্তনশীল এবং এর মান কমান্ডের ( bash -c "..."
এই ক্ষেত্রে) পরিবেশে চলে যায়।
env
প্রয়োজনীয় কিনা তা শেল দ্বারা পরীক্ষা করা হচ্ছে না, যেটি থেকে পরীক্ষা চালানো হয় তা নির্ধারিত হয়। (এগুলি একই হতে পারে Even তারপরেও, আমরা পরীক্ষা করছি কীভাবে বাশ তার নিজস্ব পরিবেশকে প্রক্রিয়াজাত করে )) বোর্ন-স্টাইল শেলগুলি NAME=value command
সিনট্যাক্স গ্রহণ করে; সি স্টাইলের শাঁস (যেমন csh
,, tcsh
) করবেন না। সুতরাং পরীক্ষাটি আরও কিছুটা বহনযোগ্য env
(এটি কীভাবে কাজ করে তা সম্পর্কে কখনও কখনও বিভ্রান্তি তৈরির ব্যয়ে)।
এর অপরিবর্তিত সংস্করণেbash
পরিবেশের ভেরিয়েবল হিসাবে রফতানি ফাংশন সংজ্ঞা সঞ্চয় করে।
একটি ফাংশন x
হিসাবে সংরক্ষণ করুন,
$ x() { bar; }
$ export -f x
এবং এর সংজ্ঞা হিসাবে পরীক্ষা করুন,
$ env | grep -A1 x
x=() { bar
}
সুতরাং কেউ তার নিজস্ব পরিবেশের ভেরিয়েবলগুলি সংজ্ঞায়িত করে ফাংশন সংজ্ঞা হিসাবে ব্যাখ্যা করতে পারে। উদাহরণস্বরূপ env x='() { :;}'
হিসাবে বিবেচিত হবে
x() { :;
}
env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
থেকে man env
,
env
- পরিবর্তিত পরিবেশে একটি প্রোগ্রাম চালান।
:
প্রস্থান স্থিতি সঙ্গে প্রস্থান ছাড়া কিছুই করবেন না 0
। আরও দেখুন
আনপ্যাচড ব্যাশের একটি নতুন উদাহরণটি যখন চালু করা হয় bash -c "echo this is a test"
, তত্ক্ষণাতিত পরিবেশগত পরিবর্তনশীল একটি ফাংশন হিসাবে বিবেচিত হবে এবং লোড হবে। তদনুসারে এক আউটপুট পায়
জেয় এটা একটা পরীক্ষা
দ্রষ্টব্য: ফাংশন সংজ্ঞার বাইরে প্রতিধ্বনি অপ্রত্যাশিতভাবে বাশ শুরুর সময় কার্যকর করা হয়েছে। ফাংশন সংজ্ঞাটি মূল্যায়ণ পাওয়ার জন্য এবং পদক্ষেপ গ্রহণের মাত্র এক ধাপ, ফাংশন সংজ্ঞা নিজে এবং পরিবেশগত পরিবর্তনশীলগুলি স্বেচ্ছাসেবী হয়। শেলটি পরিবেশের পরিবর্তনশীলগুলির দিকে নজর রাখে, এক্স দেখায়, এটির মতো দেখে মনে হয় যে এটি কোনও ফাংশন সংজ্ঞা দেখতে কেমন তা সীমাবদ্ধতার সাথে মিলিত হয় এবং এটি লাইনটি মূল্যায়ন করে, অনিচ্ছাকৃতভাবে প্রতিধ্বনিও সম্পাদন করে (যা কোনও আদেশ, দূষিত বা নাও হতে পারে) । এছাড়াও দেখুন এই
env test='() { echo "anything"; }' bash -c "echo otherthing"
আউটপুট দেখতে পাবেন otherthing
। প্যাচেই তা সংশোধন করা হয়েছে। আমি এখনও পরিষ্কার না হলে নির্দ্বিধায়।
unpatched bash
একটিতে আপনি এটি ফাংশনটিকে সংজ্ঞায়িত হিসাবে কল করতে পারেন, তবে একটি প্যাচে bash
সংজ্ঞা নিজেই নেই।
echo vulnerable
) অনুসরণ করে এমন কোড কার্যকর করা হয় না। নোট করুন যে সর্বশেষ প্যাচগুলিতে, পাস করা ফাংশনটির একটি নির্দিষ্ট উপসর্গ ( env 'BASH_FUNC_x()'='() { :;}; echo vulnerable' bash -c "echo this is a test"
) থাকতে হবে। %%
প্রথমটির পরিবর্তে আরও কয়েকটি সাম্প্রতিক প্যাচ ব্যবহার করা যেতে পারে ()
।