শেলশক পরীক্ষা করার জন্য কমান্ডের ব্যাখ্যা


32

শেলশক বাগের জন্য আমার বাশ শেলটি পরীক্ষা করতে আমি যে কমান্ডটি ব্যবহার করেছি তা এখানে:

env x='() { :;}; echo vulnerable' bash -c "echo this is a test"

কেউ দয়া করে বিশদে কমান্ডটি ব্যাখ্যা করতে পারেন?


4
আরও দেখুন: unix.stackexchange.com/q/157329/70524 - ফিক্সির উত্তরটি সহায়ক হতে পারে।
মুরু

উত্তর:


45

এই উত্তরটি ম্যাথু মিলার দ্বারা ফেডোরা ম্যাগাজিনে একটি মূল নিবন্ধের উত্স, এটি ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন-শেয়ার অ্যালাইক 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”আবার মুদ্রিত হবেন । অথবা, কোনও আক্রমণকারী কেবল কিছু মুদ্রণের চেয়ে আরও খারাপ কিছু করতে পারে।


1
এটি কেন কাজ করে তার একটি দুর্দান্ত ব্যাখ্যার জন্য মুচাস গ্রাসিয়াস।
ডগ আর।

2
নোট যে envপ্রয়োজনীয় নয়। আপনি একই ফলাফলের এটা ছাড়া কমান্ড ব্যবহার করে (পাস / কিনা ব্যাশ আপডেট করা হয়েছে তার উপর নির্ভর করে ব্যর্থ) পেতে পারেন: x='() { :;}; echo OOPS' bash -c "echo this is a test"। এর কারণ কারণ একটি ভেরিয়েবল অ্যাসাইনমেন্ট সহ একটি কমান্ডের পূর্বে সেই পরিবর্তনশীল এবং এর মান কমান্ডের ( bash -c "..."এই ক্ষেত্রে) পরিবেশে চলে যায়।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

1
... তবে এটি সাম্প্রতিক কয়েকটি প্যাচগুলিতে প্রয়োজনীয় হতে পারে। জিনিসগুলি প্রবাহিত হয়।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

4
@ ডেনিসউইলিইমসন envপ্রয়োজনীয় কিনা তা শেল দ্বারা পরীক্ষা করা হচ্ছে না, যেটি থেকে পরীক্ষা চালানো হয় তা নির্ধারিত হয়। (এগুলি একই হতে পারে Even তারপরেও, আমরা পরীক্ষা করছি কীভাবে বাশ তার নিজস্ব পরিবেশকে প্রক্রিয়াজাত করে )) বোর্ন-স্টাইল শেলগুলি NAME=value commandসিনট্যাক্স গ্রহণ করে; সি স্টাইলের শাঁস (যেমন csh,, tcsh) করবেন না। সুতরাং পরীক্ষাটি আরও কিছুটা বহনযোগ্য env(এটি কীভাবে কাজ করে তা সম্পর্কে কখনও কখনও বিভ্রান্তি তৈরির ব্যয়ে)।
এলিয়াহ কাগন

2

এর অপরিবর্তিত সংস্করণে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,

  1. env - পরিবর্তিত পরিবেশে একটি প্রোগ্রাম চালান।

  2. :প্রস্থান স্থিতি সঙ্গে প্রস্থান ছাড়া কিছুই করবেন না 0। আরও দেখুন

  3. আনপ্যাচড ব্যাশের একটি নতুন উদাহরণটি যখন চালু করা হয় bash -c "echo this is a test", তত্ক্ষণাতিত পরিবেশগত পরিবর্তনশীল একটি ফাংশন হিসাবে বিবেচিত হবে এবং লোড হবে। তদনুসারে এক আউটপুট পায়

    জেয়
    এটা একটা পরীক্ষা

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


আমি এখনও খুঁজে পেয়েছি যে কোনও নির্ধারিত বাশ ফাংশন, বাশের প্যাচড সংস্করণে চাইল্ড শেলের মধ্যে মূল্যায়ন করা হলে রফতানি করা হয়। এটি দেখুন: ছায়ান @ ছায়ান: test / পরীক্ষক $ পরীক্ষা () {প্রতিধ্বনি "কিছু"; }; এক্সপোর্ট -f পরীক্ষা; বাশ-সি পরীক্ষা ওউপুট: যে কোনও কিছু তাই আপনার উত্তর কিছুটা সঠিকভাবে নির্দেশিত হয় না। ক্যাসিয়ায় ব্যাগটির ব্যাখ্যার ব্যাখ্যা হিসাবে তার সংজ্ঞাটি ছাড়িয়ে চলকটি প্রসারিত করা সঠিক বলে আমি মনে করি।
হিমাইল

@ হিমাইল এই আচরণটি স্বাভাবিক। তবে আপনি চেষ্টা করলে env test='() { echo "anything"; }' bash -c "echo otherthing"আউটপুট দেখতে পাবেন otherthing। প্যাচেই তা সংশোধন করা হয়েছে। আমি এখনও পরিষ্কার না হলে নির্দ্বিধায়।
সৌরভসি

আমাকে আবার পরিষ্কার করুন। আপনার শেষ মন্তব্যে আমরা মূলত ফাংশনটি সংজ্ঞায়িত করছি এবং তারপর প্রতিধ্বনিকে প্রতিধ্বনি করতে বলছি। এই উদাহরণে আমরা ব্যাশে ফাংশনটি কল করি নি। এটিতে প্যাচড এবং নন-প্যাচযুক্ত ব্যাশে একই আউটপুট থাকবে না? আমার ধারণাটি এই যে বাগটি মূলত ফাংশন সংজ্ঞা অনুসারে স্থাপন করা আদেশগুলি কার্যকর করছিল তাই এই ফাংশনটি পরে আর কোথাও ডাকা হয় নি উদাহরণস্বরূপ, যদি আমরা এই এনভির টেস্ট করি = '() - প্রতিধ্বনি "কিছু"; }; প্রতিধ্বনি "foo" 'বাশ -c "প্রতিধ্বনি অন্য কিছু"। এই প্রসঙ্গে আমাকে স্পষ্ট করুন।
হিমাইল

@ হেইমাইল আমি আমার উত্তর সম্পাদনা করেছি, আশা করি এখন এটি পরিষ্কার হয়ে গেছে। আপনি আমার শেষ মন্তব্যে উদাহরণটিতে সঠিক আছেন আমরা ফাংশনটি কল করি নি। তবে পার্থক্যটি হ'ল unpatched bashএকটিতে আপনি এটি ফাংশনটিকে সংজ্ঞায়িত হিসাবে কল করতে পারেন, তবে একটি প্যাচে bashসংজ্ঞা নিজেই নেই।
সৌরভসি

@ হেইমাইল: না, এটি ভুল। একটি প্যাচড বাশ এখনও শিশুর পরিবেশে ফাংশন সংজ্ঞাটি পাস করবে। প্যাচটি যে পার্থক্য করে তা হ'ল ফাংশন সংজ্ঞা ( echo vulnerable) অনুসরণ করে এমন কোড কার্যকর করা হয় না। নোট করুন যে সর্বশেষ প্যাচগুলিতে, পাস করা ফাংশনটির একটি নির্দিষ্ট উপসর্গ ( env 'BASH_FUNC_x()'='() { :;}; echo vulnerable' bash -c "echo this is a test") থাকতে হবে। %%প্রথমটির পরিবর্তে আরও কয়েকটি সাম্প্রতিক প্যাচ ব্যবহার করা যেতে পারে ()
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.