কয়েকজনকে আশ্বস্ত করার জন্য, শোষণগুলি পর্যবেক্ষণ করে আমি ত্রুটিটি খুঁজে পাইনি, এটি প্রকাশের আগে এটির শোষণ হয়েছে বলে বিশ্বাস করার কোনও যুক্তি আমার নেই (যদিও আমি এটি অস্বীকার করতে পারি না)। bash
কোডের কোড দেখে আমি এটি খুঁজে পেলাম না ।
আমি বলতে পারি না যে আমি ঠিক তখন আমার চিন্তাভাবনার ট্রেনটি মনে করি।
কম-বেশি এমন কিছু সফ্টওয়্যারের কিছু আচরণের প্রতিফলন থেকে পাওয়া গেছে যা আমি বিপজ্জনক বলে মনে করি (আচরণগুলি, সফ্টওয়্যারটি নয়) find যে ধরণের আচরণ আপনাকে ভাবতে বাধ্য করে: এটি কোনও ভাল ধারণা বলে মনে হয় না ।
এই ক্ষেত্রে, আমি SSH সাধারণ কনফিগারেশন ক্ষণস্থায়ী এনভায়রনমেন্ট ভেরিয়েবল ক্লায়েন্ট থেকে unsanitised করেন তারা তাদের নাম শুরু হয় প্রদান করা অনুমতি দেয় অনুধ্যায়ী ছিল LC_
। ধারণাটি যাতে ssh
অন্যান্য মেশিনে প্রবেশের সময় লোকেরা তাদের নিজস্ব ভাষা ব্যবহার করতে পারে । যতক্ষণ না আপনি ইউটিএফ -8 সমীকরণে আনা হয় (এবং এটি অনেক অ্যাপ্লিকেশন দ্বারা এটি কতটা খারাপভাবে পরিচালনা করা হয় তা দেখে) কীভাবে জটিল স্থানীয়করণ পরিচালনা করা কতটা জটিল তা বিবেচনা না করা অবধি ভাল ধারণা।
জুলাই 2014 সালে ফিরে যান, আমি ইতিমধ্যে জন্য glibc স্থানীয়করণ হ্যান্ডলিং একটি দুর্বলতার যা সঙ্গে মিলিত রিপোর্ট ছিল sshd
কনফিগ এবং অপর দুই বিপজ্জনক আচরণে এর bash
শেল
উপলব্ধ তারা সেখানে ফাইল আপলোড করতে সক্ষম হয়েছি (প্রামাণ) আক্রমণকারীদের Git সার্ভার মধ্যে হ্যাক করার অনুমতি দেওয়া এবং bash
ব্যবহার করা হয়েছিল গিট ইউনিক্স ব্যবহারকারীর লগইন শেল হিসাবে (CVE-2014-0475)।
আমি ভাবছিলাম যে এটি সম্ভবত একটি bash
জটিল শেল (যখন আপনার প্রয়োজন কেবল একটি খুব সাধারণ কমান্ড লাইনটি পার্স করার সময় প্রয়োজন হয়েছে) প্রদত্ত ব্যবহারকারীদের লগইন শেল হিসাবে এসএসএস-এর মাধ্যমে পরিষেবাগুলি সরবরাহ করার জন্য এটি ব্যবহার করা সম্ভবত খারাপ ধারণা and ksh এর যেহেতু আমি ইতিমধ্যে bash
সেই প্রসঙ্গে (ssh ForceCommand
গুলি ব্যাখ্যা করার জন্য ) কয়েকটি সমস্যা চিহ্নিত করেছি, তাই আমি ভাবছিলাম যে সেখানে সম্ভাব্য আরও কিছু আছে কিনা।
AcceptEnv LC_*
যার নাম দিয়ে শুরু হয় এমন কোনও পরিবর্তনশীলকে আমার অনুমতি দেয় LC_
এবং আমার কাছে অস্পষ্ট স্মৃতি ছিল যা bash
রফতানি ফাংশনগুলি (এক সময় বিপজ্জনক হলেও কার্যকর উপকারিতা) পরিবেশের ভেরিয়েবলগুলি ব্যবহার করছিল যার নামটি এমন কিছু
myfunction()
ছিল এবং সেদিকে নজর দেওয়ার জন্য আকর্ষণীয় কিছু নেই কিনা তা ভাবছিলেন।
আমি এই ভিত্তিতে এটি বরখাস্ত করতে যাচ্ছিলাম যে সবচেয়ে খারাপ কাজটি হ'ল একটি কমান্ডের নতুন সংজ্ঞা দেওয়া LC_something
যা আসলেই কোনও সমস্যা হতে পারে না কারণ সেগুলি বিদ্যমান কমান্ডের নাম নয়, তবে আমি ভাবতে শুরু করি যে কীভাবে এই পরিবেশের ভেরিয়েবলগুলি bash
আমদানি করা হয়েছে ।
LC_foo;echo test; f()
উদাহরণস্বরূপ যদি ভেরিয়েবলগুলি ডাকা হয় ? তাই আমি আরও কাছ থেকে দেখার সিদ্ধান্ত নিয়েছি।
উত্তর:
$ env -i bash -c 'zzz() { :;}; export -f zzz; env'
[...]
zzz=() { :
}
প্রকাশিত হয়েছিল যে আমার স্মৃতিচারণটি ভুল ছিল যে ভেরিয়েবলগুলি বলা হয় নি myfunction()
তবে myfunction
(এবং এটির
সাথে শুরু হওয়া মান()
)।
এবং একটি দ্রুত পরীক্ষা:
$ env 'true;echo test; f=() { :;}' bash -c :
test
bash: error importing function definition for `true;echo test; f'
ভেরিয়েবলের নামটি স্যানিটাইজ করা হয়নি বলে আমার সন্দেহের বিষয়টি নিশ্চিত করে এবং কোডটি শুরু হওয়ার পরে মূল্যায়ন করা হয়েছিল ।
খারাপ, অনেক খারাপ, মান পারেন sanitized করা হয় নি:
$ env 'foo=() { :;}; echo test' bash -c :
test
এর অর্থ হ'ল যে কোনও পরিবেশের পরিবর্তনশীল একটি ভেক্টর হতে পারে।
আমি যখন সমস্যার মাত্রা বুঝতে পেরেছি, এটি নিশ্চিত করেছিলাম যে এটি HTTP- তেও ( HTTP_xxx
/ QUERYSTRING
... env vars), মেল প্রসেসিং পরিষেবাদির মতো অন্যান্য, পরে ডিএইচসিপি (এবং সম্ভবত একটি দীর্ঘ তালিকা) ব্যবহার করে এটি রিপোর্ট করেছিল (সাবধানে) ।