পরিবেশগত পরিবর্তনশীলতে কার্যকারিতা সংজ্ঞায়িত করার ক্ষমতা কেন নিজের মধ্যে সুরক্ষা ঝুঁকি নয়?


9

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

আমার প্রশ্ন হ'ল কেন কোনও দূষিত ব্যবহারকারী সাধারণভাবে একটি কমান্ড হিসাবে তাদের দূষিত কোড ধারণ করে কোনও ফাংশন সংজ্ঞায়িত করতে পারে না lsএবং তারপরে আশা করি যে স্ক্রিপ্ট (বা যা চলছে) কোনও সময় এই কমান্ডটি ব্যবহার করবে?

আমার মনে যা আছে তার একটি উদাহরণ:

$ export ls='() { echo "doing bad things..."; }'
$ bash -c ls
doing bad things...

উত্তর:


10

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

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

এই কারণেই sudoসমস্ত ভেরিয়েবলের পরিবেশ ছড়িয়ে ফেলার মতো জিনিস । sudoশুধুমাত্র কয়েকটি নির্বাচনের মাধ্যমে চলককে অনুমতি দেয়। এবং এই ভেরিয়েবলগুলির মধ্যে এটি তাদের স্বাস্থ্যকর করে তোলে (এটি $TERMভেরিয়েবলের মধ্য দিয়ে যায় তবে এটিতে অস্বাভাবিক অক্ষর থাকে না তবে তা হবে না)।


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

3

আমি বলব এটি হ'ল, যখন বাশ আপনার / বিন / শ হয়। এটি বোর্ন শেলের একটি বৈশিষ্ট্য নয় এবং আমি বাজি ধরছি এটি পসিক্স শেলের কোনও বৈশিষ্ট্য নয়, বাস্তবে তারা এটিকে স্পষ্টভাবে নিষিদ্ধ করতে চাইবে।

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

আমি আপনাকে প্ররোচিত করার চেষ্টা করব যে এটি 2 টি কেস সহ রান্নাঘর-সিংকের বৈশিষ্ট্যযুক্ত: আপনি একটি এম্বেডড দেব, যিনি রাউটারের মতো ডিভাইস তৈরি করেন, নেটওয়ার্ক-সংযুক্ত-স্টোরেজ 1 ম বড় এনভি, মানে আরও বেশি, স্মৃতি, তাই, আরও ব্যয়, এত কম লাভ, সুতরাং, যদি এটি বাশের এই বৈশিষ্ট্যটি ব্যবহার করার বিষয়টি বিবেচনা করার কারণ ছিল, আপনি কি পরিবর্তে FPATH এবং অটোলোড, ksh88 বৈশিষ্ট্যগুলি ব্যবহার করবেন না? পরিবর্তে পরিবেশে বাইট জন্য পুরো ফাংশন বাইট পাস? এমনকি আপনি পার্সিং এবং পরিবেশকে ছাঁটাই করার বিষয়টি বিবেচনা করতে পারেন, এটি শেলসক্রিপ্টে পাওয়ার আগে এটি কেবলমাত্র filter $ (। *) Filter ফিল্টার আউট এবং এর মতো ...

এটি এ সম্পর্কে অনন্য কি তা আন্ডারস্কোর করে, ভেরিয়েবলটি কী তা বিবেচনা করে না, এবং স্ক্রিপ্টটিকে ভেরিয়েবলটি উল্লেখ করতে বা ব্যবহার করতে হয় না, এটি এখনও ঝুঁকিপূর্ণ হতে পারে।

#!/bin/sh
exec /usr/local/myapp/support/someperlscript.pl

সূর্যের নীচে অন্য যে কোনও কিছুর জন্য উপরেরটি পার্ল স্ক্রিপ্টের মতোই নিরাপদ হওয়া উচিত, আপনি কোনও ভেরিয়েবল ব্যবহার করছেন না কীভাবে আপনি কোনওটি ভুল করে দিতে পারবেন? পরিবর্তন করা হচ্ছে

#!/bin/bash -norc
exec /usr/local/myapp/support/someperlscript.pl

হয়ও সাহায্য করে না, এর ENV বা এর মতো কোনও কিছুর সাথে কিছুই ছিল না - সকলেই পুড়ে যায় কারণ বাশকে অনন্য হওয়া দরকার। আসলে ব্যাশ সংস্করণ 2 ইস্যু আছে যা আমার কাছে প্রমাণ করে যে কেউ কখনো এই বৈশিষ্ট্যটি ব্যবহার করে , তাদের অ্যাপ্লিকেশনের জন্য কারণ অন্যথায় এটি করা উচিত নয় প্রায় lurked আছে এই দীর্ঘ। এবং সবচেয়ে খারাপ এটি মূলত এই বৈশিষ্ট্যটিকে এড়ানো হচ্ছে না । এখানে এর সাথে একটি উদাহরণ রয়েছে: 'সু -' দিয়ে, যা আপনি যদি কাউকে জিজ্ঞাসা করেন তবে তার ব্যাখ্যাটি পরিবেশটি বাতিল করে দেয়, ম্যান পৃষ্ঠাটি পরীক্ষা করে দেখুন এবং আপনি কেবল 99.9% পেয়ে যাবেন। আমি যে সঠিক ভাবে পরীক্ষিত, উপর থেকে এই সিস্টেম / বিন / SH root এর লগ-ইন শেল, এবং / বিন / SH ব্যাশ হয় কিন্তু , এই উদাহরণে আমি চেষ্টাআমার .বাশ_ প্রোফাইলে শক্ত করতে। আমি আমার বিদ্যমানটিকে মূলের জন্য নামকরণ করলাম (যা সক্ষম) তবে আমার চিন্তা ছিল যদি su হয়, তবে সম্ভবত সুডো যাই হোক না কেন, আমি এটিতে পরিবর্তিত হয়েছি:

exec env -i TERM=vt102 LOGNAME=root USER=root HOME=/var/root /bin/ksh -i

সুতরাং, আমি প্রকৃতপক্ষে পরিবেশটিকে পুরোপুরি টস করছি, এবং একটি ন্যূনতম এনভির ব্যবহার করব এবং তারপরে বর্তমান প্রক্রিয়াটির স্থলে একটি শেল চালাচ্ছি যা সমস্যা হওয়া উচিত নয়। তারপরে আদর্শ উদাহরণের জায়গায় চেষ্টা করুন:

%dock='() { echo -e "\e[2t\c"; echo dockshock;} ; dock' su 

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

%TERM='() { echo -e "\e[2t\c"; echo dockshock;} ; TERM' su - 

এবং কি অনুমান? জানালাটি চুষতে থাকে ডকে into এটি পরে দেখতে কেমন লাগে তা এখানে ..

%TERM='() { echo -e "\e[2t\c"; echo dockshock;} ; TERM' su -
Password:
dockshock
# env
_=/usr/bin/env
HOME=/var/root
LOGNAME=root
TERM=vt102
USER=root
# echo $0
/bin/ksh
#

তো, তাই, তার জন্য অনেক কিছু! এক্সপোর্ট করা ফাংশনগুলির আসলে আরসি স্ক্রিপ্টগুলির চেয়ে অগ্রাধিকার থাকে। আপনি এটি ডজ করতে পারবেন না।


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