Sudo: bypass of Runas user restrictions
by CIRT Team
লিনাক্স কিংবা ইউনিক্স সিস্টেম নিয়ে যারা কাজ করেন তাদের কাছে sudo(super user do/substitute user do) অত্যন্ত পরিচিত একটা শব্দ। সিস্টেম আপডেট দিতে যাবেন আপনার sudo লাগবে। অ্যাপ ইন্সটল করবেন sudo লাগবে। বলতে গেলে sudo ছাড়া ইউনিক্স দুনিয়াতে আপনি প্রায় অচল হয়ে পরতে পারেন। ইউনিক্স কিংবা ইউনিক্সের মতন অপারেটিং সিস্টেমে, sudo প্রোগ্রামের মাধ্যমে মূলত একজন ইউজার অন্য ইউজারের সিকিউরিটি প্রিভিলেজ ব্যবহার(Runas) করে কোন কমান্ড এক্সিকিউট করার সুযোগ পেয়ে থাকে।
সফটওয়্যার প্রোগ্রামে bug কিংবা vulnerability খুব সাধারণ একটা বিষয়। কিন্তু সেটা কখনো কখনো ব্যবহারকারীদের জন্য বেশ কঠিন বিপদের কারণ হয়ে দাঁড়ায়। কারণ, কিছু ইউজার এসব দুর্বলতার সুযোগ কে কাজে লাগিয়ে সিস্টেমের ক্ষতি করতে পারে। sudo ১.৮.২৮ পূর্বের সকল ভার্সনে একটা vulnerability বিদ্যমান ছিল। যেটা আসলে বেশ মারাত্মক। কারন এর মাধ্যমে কোন হ্যাকার কিংবা ম্যালিশাস প্রোগ্রাম চাইলে ইচ্ছা মত রুট প্রিভিলেজ নিয়ে নিতে পারত। আর তা দিয়ে, যে কোন কমান্ড এক্সিকিউট করাতে সক্ষম হত।এর জন্য একমাত্র পূর্বশর্ত হচ্ছে sudoers ফাইলে কোন নির্দিষ্ট ইউজারের প্রিভিলেজ এন্ট্রিতে অবশ্যই ALL থাকতে হবে।
ধরা যাক, একটা ubuntu মেশিনে একজন ইউজার আছে, যার আইডি হল joker।
- নিচের পলিসি অনুসারে, joker চাইলে /bin/bash কমান্ডটি যে কোন ইউজারের প্রিভিলেজ দিয়ে চালাতে পারবে। কিন্তু root প্রিভিলেজ দিয়ে চালাতে পারবে না। যেহেতু পলিসিতে বলা আছে !root।
(ALL, !root) /bin/bash
- এখন যদি সেই, ubuntu মেশিনের /etc/sudoers ফাইলটি আরো ভালো করে দেখিঃ
#username hostname=(user, group) command
root ALL=(ALL:ALL) ALL
joker ALL=(ALL,!root) /bin/bash
- ফাইল অনুসারে, root ইউজার চাইলে সকল ইউজার কিংবা গ্রুপের হয়ে, সকল কমান্ড রান করতে পারে।
- আর joker ইউজার; root ব্যতিত যে কোন ইউজার প্রিভিলেজ দিয়ে /bin/bash রান করাতে পারবে।
কিন্ত sudo’র security bugব্যবহার করে কোন হ্যাকার চাইলে, যে কোন কমান্ড rootইউজার হিসেবে রান করাতে সক্ষম হত।
কিন্তু কিভাবে সম্ভব?
নিচের console এ দেখব -u এর সাথে প্যারামিটার হিসেবে -1 পাঠানো হচ্ছে , আমারা চাইলে যে কোন ইউজারের আইডি পাঠাতে পারি। কিন্তু যদি, -1 কিংবা 4294967295 পাঠাই তা একটা সমস্যা তৈরি করে, আমরা দেখব পলিসি তে নিষেধ থাকা শর্তেও আমরা root প্রিভিলেজ দিয়ে /bin/bash কে চালাতে পারছি:
joker@ubuntu:~$ sudo -u#-1 /bin/bash
root@ubuntu:/home/joker# id
uid=0(root) gid=1000(joker) groups=1000(joker)
root@ubuntu:/home/joker#
আসলে কেন এমন ঘটে?
-1 এবং 4294967295, দুই ইউজার আইডি যদি দেয়া হয়। সেক্ষেত্রে এই sudo ইউজার আদৌ আছে কিনা, সেটা সানাক্ত না করে, তার পরিবর্তে সরাসরি “0” রিটার্ন করে থাকে।আর 0 হচ্ছে root ইউজারের আইডি। ফলে পলিসি বাইপাস করে রুট এক্সেস নেয়া সম্ভব হয়।
মজার বিষয় হচ্ছে, এমন কমান্ড ব্যবহার করে root এক্সেস নিলেও, log ফাইলে root ইউজারের পরিবর্তে 4294967295 আইডি হিসেবে লগ জমা হতে থাকে।
আরও বিস্তারিত জানতে CVE-2019–14287 দিয়ে সার্চ করতে পারেন। অথবা sudo এর সাইট থেকে এ বিষয়ে পড়তে পারেন।
এখন বাঁচার উপায় কি?
- অতি সত্বর sudo ভার্সন আপডেট করে ফেলা ।
- আর যত্রতত্র ALL ব্যবহার পরিহার করা।
Reference :
WRITTEN BY
Kawser Habib
Incident Handler, BGD e-GOV CIRT