ওপেন সোর্স অপারেটিং সিস্টেম ডিস্ট্রিবিউশন ওপেনবিএসডি সিস্যাডমিনদের মধ্যে সুপরিচিত, বিশেষ করে যারা সার্ভার পরিচালনা করেন, গতি, বৈশিষ্ট্য এবং অভিনব ফ্রন্ট-এন্ডের উপর নিরাপত্তার উপর ফোকাস করার জন্য।
উপযুক্তভাবে, সম্ভবত, এর লোগোটি একটি পাফার ফিশ - স্ফীত, এর স্পাইকগুলি যে কোনও কৌশলী হ্যাকারদের প্রতিহত করার জন্য প্রস্তুত যা সাথে আসতে পারে।
কিন্তু ওপেনবিএসডি টিম সম্ভবত তার সম্পূর্ণ ডিস্ট্রোর জন্য নয়, রিমোট অ্যাক্সেস টুলকিটের জন্য সবচেয়ে বেশি পরিচিত OpenSSH- র যেটি 1990 এর দশকের শেষের দিকে অপারেটিং সিস্টেমে অন্তর্ভুক্ত করার জন্য লেখা হয়েছিল।
SSH, এর জন্য সংক্ষিপ্ত নিরাপদ শেল, মূলত ফিনিশ কম্পিউটার বিজ্ঞানী দ্বারা তৈরি করা হয়েছিল তাতু ইলোনেন 1990-এর দশকের মাঝামাঝি সময়ে টেলনেট প্রোটোকল ব্যবহার করার ঝুঁকিপূর্ণ অভ্যাস থেকে সিসাডমিনদের দুধ ছাড়ানোর আশায়।
টেলনেট নিয়ে ঝামেলা
টেলনেট উল্লেখযোগ্যভাবে সহজ এবং কার্যকর ছিল: দূরবর্তী সার্ভারে একটি টেলিটাইপ সংযোগ করতে শারীরিক তারের (বা টেলিফোন লাইনে একটি মডেম ব্যবহার করে) সংযোগ করার পরিবর্তে, আপনি পরিবর্তে একটি টেলিটাইপ নেটওয়ার্ক সংযোগ ব্যবহার করেছেন।
মূলত, সার্কিট-সুইচড পয়েন্ট-টু-পয়েন্ট লিঙ্কের পরিবর্তে প্যাকেট-সুইচড টিসিপি নেটওয়ার্ক সংযোগ ব্যবহার করে একটি ডেডিকেটেড সিরিয়াল সংযোগ বা ডায়াল-আপ ফোন লাইনের মাধ্যমে যে ডেটা সাধারণত প্রবাহিত হয় তা ইন্টারনেটের মাধ্যমে পাঠানো এবং গ্রহণ করা হত। .
একই পরিচিত লগইন সিস্টেম, সস্তা সংযোগ, ডেডিকেটেড ডেটা লাইনের প্রয়োজন নেই!
টেলনেটের বিশাল ত্রুটি অবশ্যই ছিল, এটির এনক্রিপশনের সম্পূর্ণ অভাব ছিল, যাতে আপনার সঠিক টার্মিনাল সেশনটি শুঁকানো তুচ্ছ ছিল, ক্র্যাকারগুলিকে আপনার টাইপ করা প্রতিটি কমান্ড দেখতে দেয় (এমনকি আপনি যে ভুলগুলি করেছেন এবং যতবার আপনি আঘাত করেছেন [Backspace]
), এবং উত্পাদিত আউটপুটের প্রতিটি বাইট...
…এবং, অবশ্যই, সেশনের শুরুতে আপনার ব্যবহারকারীর নাম এবং পাসওয়ার্ড।
আপনার নেটওয়ার্ক পাথে যে কেউ কেবল তাদের নিজস্ব স্ক্রিনে রিয়েল টাইমে আপনার সিস্যাডমিন সেশনগুলিকে সহজে পুনর্গঠন করতে পারে না, তবে রিমোট সার্ভারে আপনার পাঠানো কমান্ডগুলি সংশোধন করে এবং উত্তরগুলিকে জাল করে যাতে আপনি লক্ষ্য না করেন সেজন্য সম্ভবত আপনার সেশনের সাথে হস্তক্ষেপ করতে পারে। সাবটারফিউজ
এমনকি তারা একটি প্রতারণাকারী সার্ভার সেট আপ করতে পারে, আপনাকে এতে প্রলুব্ধ করতে পারে এবং আপনার জন্য প্রতারণা সনাক্ত করা আশ্চর্যজনকভাবে কঠিন করে তুলতে পারে।
শক্তিশালী এনক্রিপশন FTW
Ylönen এর SSH লক্ষ্য একটি টেলনেট-সদৃশ সেশনের প্রতিটি প্রান্তে শক্তিশালী এনক্রিপশন এবং প্রমাণীকরণের একটি স্তর যুক্ত করা, একটি তৈরি করা নিরাপদ শেল (এই নামটির অর্থ কি, যদি আপনি কখনও ভেবে থাকেন, যদিও প্রায় সবাই এটিকে ডাকে ess-ess-aitch এই দিনগুলি).
এটি একটি তাত্ক্ষণিক আঘাত ছিল, এবং প্রোটোকলটি দ্রুত সর্বত্র সিসাডমিনদের দ্বারা গৃহীত হয়েছিল।
OpenSSH শীঘ্রই অনুসরণ করে, যেমন আমরা উপরে উল্লেখ করেছি, প্রথম 1999 সালের শেষের দিকে এর অংশ হিসাবে উপস্থিত হয়েছিল ওপেনবিএসডি 2.6 মুক্তি.
OpenBSD টিম প্রোটোকলের একটি বিনামূল্যে, নির্ভরযোগ্য, ওপেন-সোর্স বাস্তবায়ন তৈরি করতে চেয়েছিল যা তারা এবং অন্য কেউ ব্যবহার করতে পারে, কোনো লাইসেন্সিং বা বাণিজ্যিক জটিলতা ছাড়াই যা মুক্তির পরপরই ইলনেনের আসল বাস্তবায়নকে বাধাগ্রস্ত করেছিল।
প্রকৃতপক্ষে, আপনি যদি উইন্ডোজ এসএসএইচ সার্ভার চালান এবং এখনই একটি লিনাক্স কম্পিউটার থেকে এটির সাথে সংযুক্ত হন, আপনি প্রায় নিশ্চিতভাবেই উভয় প্রান্তে ওপেনএসএইচ বাস্তবায়নের উপর নির্ভর করবেন।
SSH প্রোটোকল SCP এবং SFTP সহ অন্যান্য জনপ্রিয় ক্লায়েন্ট-সার্ভার পরিষেবাগুলিতেও ব্যবহৃত হয়, সংক্ষেপে নিরাপদ কপি এবং নিরাপদ FTP যথাক্রমে SSH এর ঢিলেঢালা অর্থ হল, "নিরাপদভাবে সংযোগ করুন এবং অন্য প্রান্তে একটি কমান্ড SHell চালান", সাধারণত ইন্টারেক্টিভ লগইনগুলির জন্য, কারণ একটি কমান্ড শেল এর জন্য ইউনিক্স প্রোগ্রাম সাধারণত /bin/sh
. SCP অনুরূপ, কিন্তু ফাইল কপি করার জন্য, কারণ সাধারণত ইউনিক্স ফাইল-কপি কমান্ড বলা হয় /bin/cp
, এবং SFTP-এর নামকরণ করা হয়েছে অনেকটা একইভাবে।
OpenSSH শহরে একমাত্র SSH টুলকিট নয়।
অন্যান্য সুপরিচিত বাস্তবায়ন অন্তর্ভুক্ত: libssh2, ডেভেলপারদের জন্য যারা সরাসরি তাদের নিজস্ব অ্যাপ্লিকেশনে SSH সমর্থন তৈরি করতে চান; ড্রপবার, অস্ট্রেলিয়ান কোডার থেকে একটি স্ট্রাইপ-ডাউন SSH সার্ভার ম্যাট জনস্টন যা তথাকথিত IoT (ইন্টারনেট অফ থিংস) ডিভাইসে যেমন হোম রাউটার এবং প্রিন্টারে ব্যাপকভাবে পাওয়া যায়; এবং পুটিং, ইন্ডি ওপেন-সোর্স ডেভেলপার থেকে উইন্ডোজের জন্য SSH-সম্পর্কিত সরঞ্জামগুলির একটি জনপ্রিয়, বিনামূল্যের সংগ্রহ৷ সাইমন তাথাম ইংল্যান্ডে.
কিন্তু আপনি যদি একজন নিয়মিত SSH ব্যবহারকারী হন, তাহলে আপনি আজকে অন্তত একটি OpenSSH সার্ভারের সাথে প্রায় অবশ্যই সংযুক্ত হয়েছেন, অন্ততপক্ষে এমন নয় যে বেশিরভাগ সমসাময়িক লিনাক্স ডিস্ট্রিবিউশন এটিকে তাদের স্ট্যান্ডার্ড রিমোট অ্যাক্সেস টুল হিসাবে অন্তর্ভুক্ত করে এবং মাইক্রোসফ্ট একটি OpenSSH ক্লায়েন্ট এবং একটি OpenSSH উভয়ই অফার করে। এই দিন অফিসিয়াল উইন্ডোজ উপাদান হিসাবে সার্ভার.
ডবল-ফ্রি বাগ ফিক্স
OpenSSH সংস্করণ 9.2 এইমাত্র বেরিয়ে এসেছে, এবং অব্যাহতি পত্র নিম্নরূপ রিপোর্ট:
এই রিলিজে […] একটি মেমরি নিরাপত্তা সমস্যার সমাধান রয়েছে। [এই বাগ] শোষণযোগ্য বলে বিশ্বাস করা হয় না, তবে আমরা নিরাপত্তা বাগ হিসাবে বেশিরভাগ নেটওয়ার্ক-পৌঁছানো মেমরি ত্রুটিগুলি রিপোর্ট করি।
বাগ প্রভাবিত করে sshd
, OpenSSH সার্ভার ( -d
প্রত্যয় মানে অপদেবতা, পটভূমি প্রক্রিয়ার সাজানোর জন্য ইউনিক্স নাম যাকে উইন্ডোজ বলে a সেবা):
sshd(8): OpenSSH 9.1-এ প্রবর্তিত একটি প্রাক-প্রমাণকরণ ডাবল-ফ্রি মেমরি ত্রুটি ঠিক করুন। এটি শোষণযোগ্য বলে বিশ্বাস করা হয় না, এবং এটি অপ্রয়োজনীয় প্রাক-প্রমাণ প্রক্রিয়ায় ঘটে যা chroot(2) এর সাপেক্ষে এবং বেশিরভাগ প্রধান প্ল্যাটফর্মে আরও স্যান্ডবক্স করা হয়।
একটি ডাবল-ফ্রি বাগ মানে একটি মেমরি ব্লক যা আপনি ইতিমধ্যেই আপনার প্রোগ্রামের অন্যান্য অংশে পুনরায় ব্যবহার করার জন্য অপারেটিং সিস্টেমে ফিরে এসেছেন...
…পরবর্তীতে প্রোগ্রামের একটি অংশ দ্বারা আবার হস্তান্তর করা হবে যেটি আসলে আর সেই মেমরিটির "মালিক" নয়, কিন্তু জানে না যে এটি নেই।
(অথবা ইচ্ছাকৃতভাবে কোডের অনুরোধে ফিরিয়ে দেওয়া হয়েছে যা উদ্দেশ্যমূলকভাবে বাগটিকে উস্কে দেওয়ার চেষ্টা করছে দুর্বলতা মধ্যে একটি কাজে লাগান.)
এটি সূক্ষ্ম এবং কঠিন-টু-উন্মোচন বাগগুলির দিকে পরিচালিত করতে পারে, বিশেষ করে যদি সিস্টেমটি মুক্ত-অবরোধকে উপলব্ধ হিসাবে চিহ্নিত করে যখন প্রথম free()
ঘটে, পরে এটি আপনার কোডের অন্য অংশে বরাদ্দ করে যখন এটি এর মাধ্যমে মেমরির জন্য জিজ্ঞাসা করে malloc(
), এবং তারপর আবার ব্লক ফ্রি চিহ্নিত করে যখন অতিরিক্ত কল করা হয় free()
মনে হচ্ছে।
এটি আপনাকে এমন পরিস্থিতির মধ্যে ফেলে দেয় যখন আপনি একটি হোটেলে চেক-ইন করেন যেটি বলে, "ওহ, ভাল খবর! আমরা ভেবেছিলাম আমরা পূর্ণ হয়ে গেছি, কিন্তু অন্য একজন অতিথি তাড়াতাড়ি চেক আউট করার সিদ্ধান্ত নিয়েছে, যাতে আপনি তাদের রুম পেতে পারেন।"
এমনকি যদি আপনি যখন ভিতরে যান তখন ঘরটি সুন্দরভাবে পরিষ্কার করা হয় এবং নতুন বাসিন্দাদের জন্য প্রস্তুত করা হয়, এবং এইভাবে মনে হয় যে এটি আপনার একচেটিয়া ব্যবহারের জন্য সঠিকভাবে বরাদ্দ করা হয়েছে, আপনাকে এখনও বিশ্বাস করতে হবে যে আগের অতিথির কীকার্ডটি সত্যই সঠিকভাবে বাতিল হয়ে গেছে এবং তাদের “ প্রারম্ভিক চেকআউট” একই দিন পরে ফিরে লুকিয়ে আপনার ল্যাপটপ চুরি করা একটি ধূর্ত কৌশল ছিল না।
বাগ ফিক্সের জন্য বাগ ফিক্স
হাস্যকরভাবে, আপনি যদি সাম্প্রতিক OpenSSH কোড ইতিহাস দেখেন, আপনি দেখতে পাবেন যে OpenSSH নামক একটি ফাংশনে একটি পরিমিত বাগ ছিল compat_kex_proposal()
, একটি সংযোগ স্থাপন করার সময় কী-এক্সচেঞ্জ অ্যালগরিদম ব্যবহার করতে হবে তা পরীক্ষা করতে ব্যবহৃত হয়।
কিন্তু সেই পরিমিত বাগ ফিক্স করা এর পরিবর্তে আরও গুরুতর দুর্বলতা প্রবর্তন করেছে।
যাইহোক, সংযোগ স্থাপনের সময় ব্যবহৃত সফ্টওয়্যারের একটি অংশে বাগের উপস্থিতি এটিকে তথাকথিত করে তোলে নেটওয়ার্ক-পৌঁছানো প্রাক প্রমাণীকরণ দুর্বলতা (বা প্রাক-প্রমাণ বাগ অল্পের জন্য).
ডবল-ফ্রি বাগ কোডে ঘটে যা চালানো দরকার পরে একটি ক্লায়েন্ট একটি দূরবর্তী অধিবেশন শুরু করেছে, কিন্তু আগে কোনো কী-চুক্তি বা প্রমাণীকরণ হয়েছে, তাই তত্ত্বগতভাবে, কোনো পাসওয়ার্ড বা ক্রিপ্টোগ্রাফিক কী যাচাইকরণের জন্য উপস্থাপন করার আগে দুর্বলতা ট্রিগার হতে পারে।
OpenSSH 9.0 এ, compat_kex_proposal
এইরকম কিছু লাগছিল (এখানে খুব সরলীকৃত):
char* compat_kex_proposal(char* suggestion) { if (condition1) { return suggestion; } if (condition2) { suggestion = allocatenewstring1(); } if (condition3) { suggestion = allocatenewstring2(); } if (isblank(suggestion)) { error(); } return suggestion; }
ধারণাটি হল যে কলার মেমরির নিজস্ব ব্লকে একটি টেক্সট স্ট্রিং রয়েছে যা একটি কী-এক্সচেঞ্জ সেটিংসের পরামর্শ দেয় এবং তারা যে পরামর্শটি পাঠিয়েছে সেটি ব্যবহার করার জন্য একটি অনুমোদন বা একটি আপডেট করা পরামর্শ সহ একটি নতুন বরাদ্দকৃত পাঠ্য স্ট্রিং ফিরে পায়। .
বাগ হল যদি শর্ত 1 মিথ্যা হয় কিন্তু শর্ত 2 এবং 3 উভয়ই সত্য হয়, কোডটি বরাদ্দ করে দুই নতুন টেক্সট স্ট্রিং, কিন্তু শুধুমাত্র রিটার্ন এক.
মেমরি ব্লক দ্বারা বরাদ্দ allocatenewstring1()
কখনই মুক্ত হয় না, এবং যখন ফাংশনটি ফিরে আসে, তখন এর মেমরির ঠিকানা চিরতরে হারিয়ে যায়, তাই কোনও কোডের জন্য কোনও উপায় নেই free()
এটা ভবিষ্যতে।
এই ব্লকটি মূলত পরিত্যক্ত, যার ফলে একটি হিসাবে পরিচিত মেমরি লিক.
সময়ের সাথে সাথে, এটি সমস্যার কারণ হতে পারে, এমনকি মেমরি ওভারলোড থেকে পুনরুদ্ধার করতে সার্ভারকে বন্ধ করতে বাধ্য করে।
OpenSSH 9.1-এ, দুটি স্ট্রিং বরাদ্দ না করার জন্য কোডটি আপডেট করা হয়েছিল কিন্তু তাদের মধ্যে একটি ত্যাগ করা হয়েছে:
/* Always returns pointer to allocated memory, caller must free. */ char* compat_kex_proposal(char* suggestion){ char* previousone = NULL; if (condition1) { return newcopyof(suggestion); } if (condition2) { suggestion = allocatenewstring1(); } if (condition3) { previousone = suggestion; suggestion = allocatenewstring2(); } free(previousone); } if (isblank(suggestion()) { error(); } return suggestion; }
এতে ডাবল-ফ্রি বাগ রয়েছে, কারণ শর্ত 1 এবং শর্ত 2 উভয়ই যদি মিথ্যা হয়, কিন্তু শর্ত 3 সত্য হয়, তাহলে কোডটি তার উত্তর হিসাবে ফেরত পাঠানোর জন্য একটি নতুন স্ট্রিং বরাদ্দ করে…
…কিন্তু ভুলভাবে স্ট্রিংটি মুক্ত করে যেটি কলকারী মূলত পাস করেছিল, কারণ ফাংশনটি allocatenewstring1()
ভেরিয়েবল আপডেট করার জন্য কখনই ডাকা হয় না suggestion
.
পাস-ইন সাজেশন স্ট্রিং মেমরি যা কলারের অন্তর্গত, এবং যে কলকারী তাই পরবর্তীতে থিমগুলিকে মুক্ত করবে, যা দ্বিগুণ-মুক্ত বিপদের দিকে পরিচালিত করবে।
OpenSSH 9.2-এ, কোডটি আরও সতর্ক হয়ে উঠেছে, ব্যবহৃত তিনটি সম্ভাব্য মেমরি ব্লকের উপর নজর রাখে: আসল suggestion
(অন্য কারো মালিকানাধীন মেমরি), এবং দুটি সম্ভাব্য নতুন স্ট্রিং যা পথে বরাদ্দ করা যেতে পারে:
/* Always returns pointer to allocated memory, caller must free. */ char* compat_kex_proposal(char* suggestion) { char* newone = NULL; char* newtwo = NULL; if (condition1) { return newcopyof(suggestion); } if (condition2) { newone = allocatenewstring1(); } if (condition3) { newtwo = allocatenewstring2(); } free(newone); newone = newtwo; } if (isblank(newone)) { error(); } return newone; }
শর্ত 1 সত্য হলে, পাস-ইন স্ট্রিংয়ের একটি নতুন অনুলিপি ব্যবহার করা হয়, যাতে কলকারী পরে করতে পারেন free()
তাদের পাস-ইন স্ট্রিং এর মেমরি যখনই তারা পছন্দ করে।
যদি আমরা অতীত শর্ত 1 পাই, এবং শর্ত 2 সত্য হয় কিন্তু শর্ত 3 মিথ্যা হয়, তাহলে বিকল্প পরামর্শ দ্বারা তৈরি করা হয়েছে allocatenewstring1()
ফিরে আসে, এবং পাস ইন suggestion
স্ট্রিং একা বাকি আছে.
যদি শর্ত 2 মিথ্যা হয় এবং শর্ত 3 সত্য হয়, তাহলে একটি নতুন স্ট্রিং তৈরি হয় এবং ফিরে আসে এবং পাস-ইন suggestion
স্ট্রিং একা বাকি আছে.
যদি শর্ত 2 এবং শর্ত 3 উভয়ই সত্য হয়, তাহলে পথ বরাবর দুটি নতুন স্ট্রিং বরাদ্দ করা হবে; প্রথমটি মুক্তি পায় কারণ এটির প্রয়োজন নেই; দ্বিতীয়টি ফিরিয়ে দেওয়া হয়; এবং পাস-ইন suggestion
স্ট্রিং একা বাকি আছে.
আপনি RTxM আপনি কল করলে তা নিশ্চিত করতে free(newone)
কখন newone
is NULL
, তারপর "কোন অপারেশন সঞ্চালিত হয় না", কারণ এটি সবসময় নিরাপদ free(NULL)
. তা সত্ত্বেও, অনেক প্রোগ্রামার এখনও দৃঢ়ভাবে কোড সহ এর বিরুদ্ধে রক্ষা করে if (ptr != NULL) { free(ptr); }
.
কি করো?
OpenSSH টিম যেমন পরামর্শ দিয়েছে, এই বাগটি কাজে লাগানো কঠিন হবে, অন্তত সীমিত সুযোগ-সুবিধার কারণে নয় sshd
এটি ব্যবহারের জন্য সংযোগ সেট আপ করার সময় প্রোগ্রাম আছে।
তবুও, তারা এটিকে একটি নিরাপত্তা গর্ত হিসাবে রিপোর্ট করেছে কারণ এটিই তাই, তাই নিশ্চিত করুন যে আপনি এতে আপডেট করেছেন OpenSSH 9.2.
এবং আপনি যদি সি-তে কোড লিখছেন, মনে রাখবেন যে আপনি যতই অভিজ্ঞ হন না কেন, মেমরি পরিচালনায় ভুল হওয়া সহজ…
…তাই সেখানে যত্ন নিন।
(হ্যাঁ, মরিচা এবং এর আধুনিক বন্ধুরা করবে আপনাকে সঠিক কোড লিখতে সাহায্য করে, কিন্তু কখনও কখনও আপনাকে এখনও C ব্যবহার করতে হবে, এবং এমনকি মরিচাও গ্যারান্টি দিতে পারে না আপনি ভুল কোড লেখা বন্ধ করুন আপনি যদি অন্যায়ভাবে প্রোগ্রাম করেন!)
- এসইও চালিত বিষয়বস্তু এবং পিআর বিতরণ। আজই পরিবর্ধিত পান।
- প্লেটোব্লকচেন। Web3 মেটাভার্স ইন্টেলিজেন্স। জ্ঞান প্রসারিত. এখানে প্রবেশ করুন.
- উত্স: https://nakedsecurity.sophos.com/2023/02/03/openssh-fixes-double-free-memory-bug-thats-pokable-over-the-network/