এনভিভি এক্স = '() {:;}; কমান্ড 'বাশ ডু এবং কেন এটি অনিরাপদ?


237

বাশে স্পষ্টতই একটি দুর্বলতা রয়েছে (সিভিই -২০১--627171১): বাশ বিশেষভাবে তৈরি করা পরিবেশের ভেরিয়েবল কোড ইঞ্জেকশন আক্রমণ

আমি কী ঘটছে তা বের করার চেষ্টা করছি, তবে আমি এটি নিশ্চিতভাবেই নিশ্চিত নই। echoএকক উদ্ধৃতিতে কীভাবে কার্যকর করা যায়?

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

সম্পাদনা 1 : একটি প্যাচড সিস্টেমটি দেখতে এরকম দেখাচ্ছে:

$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x'
this is a test

সম্পাদনা 2 : এখানে একটি সম্পর্কিত দুর্বলতা / প্যাচ রয়েছে: CVE-2014-7169 যা কিছুটা আলাদা পরীক্ষা ব্যবহার করে:

$ env 'x=() { :;}; echo vulnerable' 'BASH_FUNC_x()=() { :;}; echo vulnerable' bash -c "echo test"

আনপ্যাচড আউটপুট :

vulnerable
bash: BASH_FUNC_x(): line 0: syntax error near unexpected token `)'
bash: BASH_FUNC_x(): line 0: `BASH_FUNC_x() () { :;}; echo vulnerable'
bash: error importing function definition for `BASH_FUNC_x'
test

আংশিক (প্রাথমিক সংস্করণ) প্যাচ আউটপুট :

bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x'
bash: error importing function definition for `BASH_FUNC_x()'
test

প্যাচ আউটপুট আপ এবং সিভিই-2014-7169 সহ:

bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `BASH_FUNC_x'
test

সম্পাদনা 3 : গল্পটি এর সাথেই চলতে থাকবে:


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

26
eyoung100, কোন প্রতিধ্বনি হয় মৃত্যুদন্ড কার্যকর হচ্ছে। শব্দটি vulnerableআউটপুটে প্রদর্শিত হওয়ায় আপনি এটি কার্যকর করা দেখতে পাচ্ছেন । প্রধান সমস্যাটি হ'ল বাশ কোডটি পার্সিং করে এবং ক্রিয়াকলাপের সংজ্ঞার পরেও সম্পাদন করে । অন্য উদাহরণের জন্য Seclists.org/oss-sec/2014/q3/650 এর /bin/idঅংশটি দেখুন ।
মাইকেল

4
শুধু একটি দ্রুত পক্ষ মন্তব্য। রেড হ্যাট পরামর্শ দিয়েছে যে প্রকাশিত প্যাচটি কেবল একটি আংশিক প্যাচ এবং সিস্টেমগুলি এখনও ঝুঁকির মধ্যে রয়েছে।
পিটার

2
@ eyoung100 পার্থক্যটি হ'ল ফাংশনের অভ্যন্তরীণ কোডটি কেবল তখনই কার্যকর করা হয় যখন পরিবেশ পরিবর্তনশীল স্পষ্টভাবে বলা হয়। ফাংশন সংজ্ঞার পরে কোডটি প্রতিবার একটি নতুন বাশ প্রক্রিয়া শুরু হওয়ার পরে কার্যকর করে।
ডেভিড ফারেল

1
দেখুন stackoverflow.com/questions/26022248/... অতিরিক্ত বিবরণের জন্য
Barmar

উত্তর:


204

বাশ স্টোরগুলি পরিবেশের ভেরিয়েবল হিসাবে ফাংশন সংজ্ঞা রফতানি করে। রফতানি করা ফাংশনগুলি এর মতো দেখায়:

$ foo() { bar; }
$ export -f foo
$ env | grep -A1 foo
foo=() {  bar
}

এটি হল, পরিবেশের পরিবর্তনশীলটির fooআক্ষরিক বিষয়বস্তু রয়েছে:

() {  bar
}

যখন ব্যাশের একটি নতুন উদাহরণ চালু হয়, তখন এটি বিশেষভাবে তৈরি কারখানার পরিবেশ পরিবর্তনশীলগুলির সন্ধান করে এবং এগুলি ফাংশন সংজ্ঞা হিসাবে ব্যাখ্যা করে। এমনকি আপনি নিজে একটি লিখতে পারেন এবং দেখুন যে এটি এখনও কার্যকর হয়:

$ export foo='() { echo "Inside function"; }'
$ bash -c 'foo'
Inside function

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

$ export foo='() { echo "Inside function" ; }; echo "Executed echo"'
$ bash -c 'foo'
Executed echo
Inside function

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

এটিকে অনিরাপদ হিসাবে বিবেচনা করা হয় কারণ ভেরিয়েবলগুলি সাধারণত তাদের মধ্যে থাকা স্বেচ্ছাসেবীর কোডের ডাকে সরাসরি কারণ হিসাবে স্বীকৃত বা প্রত্যাশিত নয় or সম্ভবত আপনার প্রোগ্রামটি অবিশ্বস্ত ব্যবহারকারী ইনপুট থেকে পরিবেশের ভেরিয়েবল সেট করে। এটি অত্যন্ত অপ্রত্যাশিত হবে যে সেই পরিবেশের ভেরিয়েবলগুলি এমনভাবে ম্যানিপুলেট করা যেতে পারে যাতে কোডটি ঘোষিত এমন কারণে পরিবেশের পরিবর্তনশীলটি ব্যবহার করে আপনার সুস্পষ্ট অভিপ্রায় ছাড়াই ব্যবহারকারী নির্বিচারে কমান্ড চালাতে পারে।

এখানে একটি ব্যবহারযোগ্য আক্রমণ একটি উদাহরণ। আপনি একটি ওয়েব সার্ভার চালনা করেন যা তার জীবনকালের অংশ হিসাবে কোথাও কোথাও একটি ঝুঁকিপূর্ণ শেল চালায়। এই ওয়েব সার্ভারটি পরিবেশ স্ক্রিনটিকে ব্যাশ স্ক্রিপ্টে পাস করে, উদাহরণস্বরূপ, আপনি যদি সিজিআই ব্যবহার করে থাকেন তবে HTTP অনুরোধ সম্পর্কিত তথ্য প্রায়শই ওয়েব সার্ভার থেকে পরিবেশ ভেরিয়েবল হিসাবে অন্তর্ভুক্ত থাকে। উদাহরণস্বরূপ, HTTP_USER_AGENTআপনার ব্যবহারকারী এজেন্টের সামগ্রীতে সেট করা যেতে পারে। এর অর্থ হ'ল আপনি যদি নিজের ব্যবহারকারী এজেন্টকে '() {এর মতো কিছু হতে চান তবে:; }; ইকো ফু ', যখন সেই শেল স্ক্রিপ্টটি চলবে, echo fooকার্যকর হবে be আবার, echo fooদূষিত বা না কিছু হতে পারে।


3
এটি কি তখন জ্যাশের মতো বাশ-জাতীয় কোনও শেলকে প্রভাবিত করতে পারে?
অ্যামিলিও ওয়াজকেজ-রেইনা

3
@ user815423426 না, zsh এর এই বৈশিষ্ট্যটি নেই। Ksh এটি করেছে তবে ভিন্নভাবে প্রয়োগ করা হয়েছে, আমি মনে করি ফাংশনগুলি কেবল খুব সংকীর্ণ পরিস্থিতিতে সঞ্চারিত হতে পারে, কেবল তখনই যদি শেল কাঁটাচামচ হয়, পরিবেশের মাধ্যমে নয়।
গিলস

20
@ ব্যবহারকারী 815423426 আরসি হ'ল পরিবেশে ফাংশনগুলি পাস করে এমন অন্যান্য শেল, তবে এর সাথে "fn_" উপসর্গযুক্ত নামের সাথে ভেরিয়েবল রয়েছে এবং কেবলমাত্র অনুরোধ করা হলে সেগুলি ব্যাখ্যা করা হয়।
স্টাফেন চেজেলাস

18
@ স্টাফেনচাজেলাস - বাগটি রিপোর্ট করার জন্য ধন্যবাদ।
হরিণ হান্টার

13
@gnclmorais আপনার মানে আপনি চালাচ্ছেন export bar='() { echo "bar" ; }'; zsh -c barএবং এটির barপরিবর্তে এটি প্রদর্শিত হবে zsh:1: command not found: bar? আপনি কি নিশ্চিত যে আপনি যে শেলটি পরীক্ষা চালানোর জন্য ব্যবহার করছেন সেটির সাথে আপনি যে শেলটি ব্যবহার করছেন তা বিভ্রান্ত করছেন না?
গিলস

85

এটি যা চলছে তা আরও প্রদর্শন করতে সহায়তা করতে পারে:

$ export dummy='() { echo "hi"; }; echo "pwned"'
$ bash
pwned
$

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

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

আমরা নতুন শেলটিতে সংজ্ঞায়িত ফাংশনটি দেখতে পাচ্ছি (এবং এটি এটি রফতানি হিসাবে চিহ্নিত করা হয়েছে) এবং আমরা এটি সম্পাদন করতে পারি। তদুপরি, ডামি একটি পাঠ্য ভেরিয়েবল হিসাবে আমদানি করা হয়নি:

$ declare -f
dummy ()
{
    echo "hi"
}
declare -fx dummy
$ dummy
hi
$echo $dummy
$

এই ক্রিয়াকলাপটি তৈরি করা বা এটি চালানো কোনও কিছুই নয়, এটি শোষণের অংশ - এটি কেবলমাত্র যানবাহন যা দ্বারা শোষণ কার্যকর করা হয়। মুল বক্তব্যটি হ'ল যদি কোনও আক্রমণকারী রফতানির পরিবেশের পরিবর্তনশীল হিসাবে প্রণীত একটি পাঠ্য স্ট্রিংয়ে একটি ন্যূনতম এবং গুরুত্বহীন ফাংশন সংজ্ঞা দ্বারা পূর্ববর্তী দূষিত কোড সরবরাহ করতে পারে তবে সাবস্কেল শুরু করা হলে এটি কার্যকর করা হবে যা একটি সাধারণ ঘটনা is অনেক স্ক্রিপ্টে। তদ্ব্যতীত, এটি স্ক্রিপ্টের সুবিধার্থে কার্যকর করা হবে।


17
যদিও স্বীকৃত উত্তরটি যদি আপনি এটি মনোযোগ সহকারে পড়েন তবে এটি সত্যই বলেছে, আমি এই উত্তরটি আরও স্পষ্ট এবং এটি আরও বুঝতে পেরেছি যে এটি সংজ্ঞাটির মূল্যায়ন (এটি নিজেই কার্য সম্পাদন করার চেয়ে) সমস্যা that
নাতিভ

1
exportঅন্যদের মতো এই উদাহরণের কেন আদেশ রয়েছে env? আমি ভাবছিলাম envযে পরিবেশের ভেরিয়েবলগুলি সংজ্ঞায়িত করার জন্য ব্যবহার করা হচ্ছে যা অন্য বাশ শেল চালু হওয়ার পরে ডাকা হবে। তাহলে এটি কীভাবে কাজ করছেexport
হারিস

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

@ আরএলএফ - উভয় envএবং exportপরিবেশ সংজ্ঞা রফতানি করুন যাতে সেগুলি একটি সাব-শেইলে উপলব্ধ। সমস্যাটি আসলে কীভাবে এই রফতানি করা সংজ্ঞাগুলি একটি সাব-শেল পরিবেশে আমদানি করা হয় এবং বিশেষত যে পদ্ধতিতে ফাংশন সংজ্ঞা আমদানি করে তা।
sdenham

1
@ralph - envকিছু বিকল্প এবং পরিবেশ ভেরিয়েবল সেট সহ একটি কমান্ড চালায়। নোট করুন যে মূল প্রশ্নের উদাহরণগুলিতে, একটি স্ট্রিং envসেট xকরে এবং bash -cচালানোর জন্য একটি আদেশ দিয়ে কল করে। যদি আপনি এটি করেন env x='foo' vim, ভিম চালু হবে এবং সেখানে আপনি এটির সাথে থাকা শেল / পরিবেশের সাথে !echo $xএটি কল করতে পারবেন এবং এটি মুদ্রণ করবে foo, তবে আপনি যদি প্রস্থান করেন এবং echo $x, এটি সংজ্ঞায়িত হবে না, কারণ এটি কেবলমাত্র ভিএম চলার সময় উপস্থিত ছিল envকমান্ডের মাধ্যমে exportকমান্ড পরিবর্তে বর্তমান পরিবেশে ক্রমাগত মান সেট করে যাতে subshell চালানোর পরে তাদের ব্যবহার করবে।
গ্যারি ফিক্সার

72

আমি উপরে এটি ক্রিস ডাউন দ্বারা উত্তরের উত্তরের একটি টিউটোরিয়াল-শৈলী পুনঃনির্মাণ হিসাবে লিখেছি।


ব্যাশে আপনার শেল ভেরিয়েবল এর মতো থাকতে পারে

$ t="hi there"
$ echo $t
hi there
$

ডিফল্টরূপে, এই ভেরিয়েবলগুলি শিশু প্রক্রিয়াগুলির দ্বারা উত্তরাধিকার সূত্রে প্রাপ্ত হয় না।

$ bash
$ echo $t

$ exit

তবে আপনি যদি তাদের রফতানির জন্য চিহ্নিত করেন, বাশ একটি পতাকা নির্ধারণ করবে যার অর্থ তারা সাব-প্রসেসের পরিবেশে যাবে (যদিও envpপ্যারামিটারটি খুব বেশি দেখা যায় না, mainআপনার সি প্রোগ্রামে তিনটি প্যারামিটার রয়েছে: main(int argc, char *argv[], char *envp[])যেখানে পয়েন্টারের শেষ অ্যারেটি অ্যারে হয় তাদের সংজ্ঞা সহ শেল ভেরিয়েবলের)।

সুতরাং আসুন tনিম্নলিখিত হিসাবে রফতানি করা যাক :

$ echo $t
hi there
$ export t
$ bash
$ echo $t
hi there
$ exit

উপরের tসাব-শেলের মধ্যে পূর্বনির্ধারিত ছিল, এটি এখন আমরা রফতানি করার পরে এটি উপস্থিত হয় ( export -n tআপনি যদি এটি রফতানি বন্ধ করতে চান তবে ব্যবহার করুন )।

তবে ব্যাশে ফাংশনগুলি একটি ভিন্ন প্রাণী। আপনি তাদের এইভাবে ঘোষণা করুন:

$ fn() { echo "test"; }

এবং এখন আপনি কেবল এটি ফাংশনটি কল করে যেন এটি অন্য শেল কমান্ড হিসাবে কল করতে পারেন:

$ fn
test
$

আবার, আপনি যদি একটি সাবস্কেল স্পান করেন তবে আমাদের ফাংশনটি রফতানি হবে না:

$ bash
$ fn
fn: command not found
$ exit

আমরা এর সাথে একটি ফাংশন রফতানি করতে পারি export -f:

$ export -f fn
$ bash
$ fn
test
$ exit

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

$ echo $fn

$ # See, nothing was there
$ export fn=regular
$ echo $fn
regular
$ 

এখন আমরা envরফতানির জন্য চিহ্নিত সমস্ত শেল ভেরিয়েবলগুলি প্রদর্শন করতে fnএবং নিয়মিত এবং ফাংশন উভয়ই প্রদর্শন করতে ব্যবহার করতে পারি fn:

$ env
.
.
.
fn=regular
fn=() {  echo "test"
}
$

একটি সাব-শেল উভয় সংজ্ঞা সংক্রামিত করবে: একটি নিয়মিত পরিবর্তনশীল হিসাবে এবং একটি ফাংশন হিসাবে:

$ bash
$ echo $fn
regular
$ fn
test
$ exit

fnআমরা উপরের মতো বা সরাসরি নিয়মিত পরিবর্তনশীল কার্যভার হিসাবে সংজ্ঞায়িত করতে পারি :

$ fn='() { echo "direct" ; }'

নোট করুন এটি করা একটি উচ্চ অস্বাভাবিক জিনিস! সাধারণত আমরা ফাংশন নির্ধারণ হবে fnহিসাবে আমরা সাথে উপরে করেনি fn() {...}সিনট্যাক্স। তবে বাশ পরিবেশের মাধ্যমে এটি রফতানি করে, আমরা উপরের নিয়মিত সংজ্ঞায় সরাসরি "শর্ট কাট" করতে পারি। মনে রাখবেন যে, (আপনার অনুভূতি পাল্টা, সম্ভবত) এই নেই না একটি নতুন ফাংশন ফলে fnবর্তমান শেল পাওয়া যায়। তবে আপনি যদি একটি ** সাব ** শেল ফেলে থাকেন তবে তা হবে will

আসুন ফাংশনের রফতানি বাতিল করুন fnএবং নতুন নিয়মিত fn(উপরে দেখানো হয়েছে) অক্ষত রেখে দিন।

$ export -nf fn

এখন ফাংশনটি fnআর রফতানি হয় না, তবে নিয়মিত পরিবর্তনশীল fnহয় এবং এটি এতে থাকে () { echo "direct" ; }

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

এবং এখন "শেলশক" বাগ:

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

এগুলি আবার প্রয়োজনীয়তা:

  1. নতুন বাশ তৈরি হয়েছে
  2. একটি পরিবেশের পরিবর্তনশীল ইনজেক্ট করা হয়
  3. এই পরিবেশের পরিবর্তনশীলটি "()" দিয়ে শুরু হয় এবং তারপরে বন্ধনীগুলির ভিতরে একটি ফাংশন বডি থাকে এবং তারপরে কমান্ড থাকে

এই ক্ষেত্রে, একটি দুর্বল ব্যাশ পরবর্তী নির্দেশগুলি কার্যকর করবে।

উদাহরণ:

$ export ex='() { echo "function ex" ; }; echo "this is bad"; '
$ bash
this is bad
$ ex
function ex
$

নিয়মিত রফতানি ভেরিয়েবলটি exসাবশেলের কাছে প্রেরণ করা হয় যা একটি ফাংশন হিসাবে ব্যাখ্যা করা হয়েছিল তবে সাবিল শিট হওয়ার সাথে সাথে ট্রেলিং exকমান্ডগুলি কার্যকর করা হয়েছিল ( this is bad)।


চিকিত্সা এক-লাইন পরীক্ষা ব্যাখ্যা

শেলশক দুর্বলতার জন্য পরীক্ষার জন্য একটি জনপ্রিয় ওয়ান-লাইনার হ'ল @ জিপ্পির প্রশ্নে উদ্ধৃত এক:

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

এখানে একটি ব্রেক-ডাউন রয়েছে: প্রথমে :ইন ব্যাশটি কেবল একটি সংক্ষিপ্ত হাতের জন্য truetrueএবং :উভয়ই বাশে সত্য (আপনি এটি অনুমান করেছিলেন) মূল্যায়ন করেছেন:

$ if true; then echo yes; fi
yes
$ if :; then echo yes; fi
yes
$

দ্বিতীয়ত, envকমান্ড (এছাড়াও ব্যাশ পাতাটা) এনভায়রনমেন্ট ভেরিয়েবল ছাপে (যেমন আমরা উপরোক্ত দেখেছি) কিন্তু এছাড়াও একটি রপ্তানি পরিবর্তনশীল (অথবা ভেরিয়েবল) যে কমান্ড দেওয়া সঙ্গে একটি একক কমান্ড চালানোর জন্য ব্যবহার করা যেতে পারে, এবং bash -cথেকে একটি কমান্ডের চালায় তার কম্যান্ড-লাইন:

$ bash -c 'echo hi'
hi
$ bash -c 'echo $t'

$ env t=exported bash -c 'echo $t'
exported
$

সুতরাং এই সমস্ত জিনিস একসাথে সেলাই, আমরা কমান্ড হিসাবে ব্যাশ চালাতে পারি, এটি করার মতো কিছু ডামি জিনিস দিতে পারি (যেমন bash -c echo this is a test) এবং এমন একটি পরিবর্তনশীল রফতানি করি যা দিয়ে শুরু হয় ()যাতে সাবশেল এটি একটি ফাংশন হিসাবে ব্যাখ্যা করবে। শেলশক উপস্থিত থাকলে, এটি অবিলম্বে সাব-শেলটিতে কোনও চলমান কমান্ড কার্যকর করবে। যেহেতু আমরা পাস করি ফাংশনটি আমাদের কাছে অপ্রাসঙ্গিক (তবে অবশ্যই পার্স করতে হবে!) আমরা স্বল্পতম বৈধ ফাংশনটি কল্পনাযোগ্য ব্যবহার করি:

$ f() { :;}
$ f
$ 

ফাংশন fএখানে শুধু executes :কমান্ড যা সত্য করে প্রস্থান করে ফেরৎ। এখন কিছু "দুষ্ট" কমান্ডের সাথে যুক্ত করুন এবং একটি সাবশেলের নিয়মিত পরিবর্তনশীল রফতানি করুন এবং আপনি জিতবেন। এখানে আবার ওয়ান-লাইনার:

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

তাই শেষ পর্যন্ত টেপযুক্ত xএকটি সাধারণ বৈধ ফাংশন সহ একটি নিয়মিত পরিবর্তনশীল হিসাবে রফতানি করা হয় echo vulnerable। এটি বাশ-এ স্থানান্তরিত হয় , এবং ব্যাশ xএকটি ফাংশন হিসাবে ব্যাখ্যা করে (যা আমরা যত্ন করি না) তবে echo vulnerableশেলশক উপস্থিত থাকলে সম্ভবত সম্পাদন করে ।

this is a testবার্তাটি সরিয়ে আমরা ওয়ান-লাইনারটি কিছুটা ছোট করতে পারি :

$ env x='() { :;}; echo vulnerable' bash -c :

এটি বিরক্ত করে না this is a testকিন্তু :আবার সাইলেন্ট কমান্ড চালায় । (আপনি যদি তা ছেড়ে দেন -c :তবে আপনি সাবশেলে বসে ম্যানুয়ালি বেরিয়ে আসতে পারেন)) সম্ভবত সবচেয়ে ব্যবহারকারী-বান্ধব সংস্করণটি হ'ল:

$ env x='() { :;}; echo vulnerable' bash -c "echo If you see the word vulnerable above, you are vulnerable to shellshock"

12
সুন্দর ব্যাখ্যা। এই প্রশ্নটি প্রচুর মতামত পাচ্ছে (সম্ভবত সকলেই অন্যের মতো বাশে দক্ষ নয়) এবং আমি বিশ্বাস করি যে কেউ এখনও { :;};বাস্তবে যা বলে তাতে দুটি শব্দ ব্যয় করেনি । এটি আমার মতে আপনার উত্তরের একটি দুর্দান্ত সংযোজন হবে। আপনি কীভাবে আপনার উদাহরণ থেকে প্রশ্নটির মূল কমান্ডের কাছে পৌঁছবেন তা ব্যাখ্যা করতে পারেন?
জিপ্পি

20

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

তবে CVE-2014-6271 আলাদা 71

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

সিভিই -2014-6271 এর প্রসঙ্গে যে উদাহরণটি সামনে রাখা হয়েছে তা হ'ল লগ-ফাইলে পার্সিংয়ের জন্য ব্যবহৃত স্ক্রিপ্টগুলি। পরিবেশের ভেরিয়েবলগুলির আশেপাশে অবিশ্বস্ত ডেটা পাস করার জন্য তাদের খুব বৈধ প্রয়োজন হতে পারে। অবশ্যই এই জাতীয় পরিবেশের পরিবর্তনশীলটির জন্য নামটি এমনভাবে বেছে নেওয়া হয়েছে যা এর কোনও বিরূপ প্রভাব ফেলবে না।

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

লক্ষ্য করুন যে এর অর্থ এই নয় যে পরিবেশের ভেরিয়েবলের নামগুলি গোপন থাকবে। জড়িত পরিবেশের ভেরিয়েবলের নাম জানার ফলে আক্রমণ কোনও সহজ হয় না।

যদি program1কলগুলি program2পরিবর্তিত কলগুলি হয় program3, তবে পরিবেশের ভেরিয়েবলের মাধ্যমে program1ডেটা পাঠাতে পারে program3। প্রতিটি প্রোগ্রামে পরিবেশের পরিবর্তনশীলগুলির একটি নির্দিষ্ট তালিকা থাকে যা এটি সেট করে এবং একটি নির্দিষ্ট তালিকা যা এটিতে কাজ করে। আপনি যদি স্বীকৃত কোনও নামটি বেছে নিয়ে থাকেন তবে কোনও প্রতিকূল প্রতিক্রিয়া আছে তা নিয়ে চিন্তা না করেই আপনি program2ডেটা পাস করতে পারেন ।program1program3program2

কোনো আক্রমণকারী দ্বারা এক্সপোর্ট ভেরিয়েবল সঠিক নাম বুদ্ধিমান program1এবং ব্যাখ্যা ভেরিয়েবল নাম program2এই জ্ঞান 'program2` আচরণ পরিবর্তন করতে হলে নামের সেট মধ্যে কোন ওভারল্যাপ হল কাজে লাগান করতে পারবে না।

তবে program2এটি কোনও bashস্ক্রিপ্ট হলে ভেঙে যায় , কারণ এই বাগের কারণে bashপ্রতিটি পরিবেশের পরিবর্তনশীল কোড হিসাবে ব্যাখ্যা করা হবে।


1
"প্রতিটি একক পরিবেশের পরিবর্তনশীল একটি আক্রমণ ভেক্টর হয়ে ওঠে" - এটিই আমি অনুপস্থিত ছিল। ধন্যবাদ।
wrschneider

9

আপনি সংযুক্ত নিবন্ধে এটি ব্যাখ্যা করা হয়েছে ...

বাশ শেলটি কল করার আগে আপনি বিশেষভাবে তৈরির মান সহ পরিবেশের ভেরিয়েবল তৈরি করতে পারেন। এই ভেরিয়েবলগুলিতে কোড থাকতে পারে যা শেলটি চালিত হওয়ার সাথে সাথেই সম্পাদিত হয়।

যার অর্থ ব্যাশ যা ডাকা হয় -c "echo this is a test"যখন কোডটি চাওয়া হয় তখন একক উদ্ধৃতিতে কোডটি কার্যকর করে।

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

মানে আপনার পোস্ট করা কোড উদাহরণটি কার্যকারিতা সম্পাদনের পরে আমন্ত্রিত বাশ এই স্ট্রিংটির মূল্যায়ন বন্ধ করে না এমনটি কাজে লাগায়। এই ক্ষেত্রে একটি ফাংশন অ্যাসাইনমেন্ট।

আপনার পোস্ট করা কোড স্নিপেট সম্পর্কে আসলে বিশেষ বিষয়টি যেমনটি আমি বুঝতে পেরেছি তা হ'ল আমরা যে কোডটি কার্যকর করতে চাই তার আগে একটি ফাংশন সংজ্ঞা ব্যবহার করে কিছু সুরক্ষা ব্যবস্থা নষ্ট করা যায়।

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