اوپن سورس آپریٹنگ سسٹم ڈسٹری بیوشن اوپن بی ایس ڈی سیسڈمینز، خاص طور پر وہ لوگ جو سرورز کا انتظام کرتے ہیں، اس کی رفتار، فیچرز اور فینسی فرنٹ اینڈز سے زیادہ سیکیورٹی پر توجہ دینے کے لیے مشہور ہے۔
مناسب طور پر، شاید، اس کا لوگو ایک پفر فش ہے - فلایا ہوا ہے، جس کے اسپائکس کسی بھی چالاک ہیکرز کو پیچھے ہٹانے کے لیے تیار ہیں جو ساتھ آ سکتے ہیں۔
لیکن اوپن بی ایس ڈی ٹیم شاید اپنی پوری ڈسٹرو کے لیے نہیں بلکہ ریموٹ ایکسیس ٹول کٹ کے لیے مشہور ہے۔ اوپنسو ایچ جو کہ 1990 کی دہائی کے آخر میں آپریٹنگ سسٹم میں شامل کرنے کے لیے لکھا گیا تھا۔
SSH، مختصر کے لیے محفوظ شیل، اصل میں فن لینڈ کے کمپیوٹر سائنس دان نے تخلیق کیا تھا۔ Tatu Ylönen 1990 کی دہائی کے وسط میں سیسڈمین کو ٹیل نیٹ پروٹوکول کے استعمال کی خطرناک عادت سے چھٹکارا دلانے کی امید میں۔
ٹیل نیٹ کے ساتھ پریشانی
ٹیل نیٹ قابل ذکر حد تک آسان اور موثر تھا: ریموٹ سرورز سے ٹیلی ٹائپ کنکشن بنانے کے لیے فزیکل تاروں (یا ٹیلی فون لائن پر موڈیم کا استعمال کرتے ہوئے) جوڑنے کے بجائے، آپ نے ٹیلی ٹائپ نیٹ ورک کنکشن استعمال کیا۔
بنیادی طور پر، وہ ڈیٹا جو عام طور پر ایک وقف شدہ سیریل کنکشن یا ڈائل اپ فون لائن پر آگے پیچھے بہہ جاتا ہے، انٹرنیٹ پر بھیجا اور وصول کیا جاتا ہے، سرکٹ سوئچ شدہ پوائنٹ ٹو پوائنٹ لنک کے بجائے پیکٹ سوئچڈ TCP نیٹ ورک کنکشن کا استعمال کرتے ہوئے .
وہی مانوس لاگ ان سسٹم، سستے کنکشن، سرشار ڈیٹا لائنوں کی ضرورت نہیں!
ٹیل نیٹ میں بڑی خامی، بلاشبہ، اس کی خفیہ کاری کی مکمل کمی تھی، تاکہ آپ کے درست ٹرمینل سیشن کو سونگھنا معمولی بات تھی، جس سے کریکرز آپ کے ٹائپ کردہ ہر کمانڈ کو دیکھ سکتے ہیں (یہاں تک کہ وہ غلطیاں جو آپ نے کی ہیں، اور ہر بار آپ نے جو بھی مارا ہے۔ [Backspace]
)، اور پیداوار کا ہر بائٹ…
…اور یقیناً، سیشن کے آغاز میں آپ کا صارف نام اور پاس ورڈ۔
آپ کے نیٹ ورک کے راستے پر موجود کوئی بھی شخص نہ صرف آپ کے سیسڈمین سیشنز کو حقیقی وقت میں اپنی اسکرین پر آسانی سے دوبارہ تشکیل دے سکتا ہے، بلکہ آپ کے ریموٹ سرور پر بھیجے گئے کمانڈز میں ترمیم کرکے اور واپس آنے والے جوابات کو جعلی بنا کر آپ کے سیشن کے ساتھ چھیڑ چھاڑ بھی کر سکتا ہے تاکہ آپ کو محسوس نہ ہو۔ سبٹرفیوج
یہاں تک کہ وہ ایک جعلی سرور قائم کر سکتے ہیں، آپ کو اس کی طرف راغب کر سکتے ہیں، اور آپ کے لیے دھوکہ دہی کا پتہ لگانا حیرت انگیز طور پر مشکل بنا سکتے ہیں۔
مضبوط خفیہ کاری FTW
Ylönen کے SSH کا مقصد ٹیل نیٹ جیسے سیشن کے ہر سرے پر مضبوط انکرپشن اور تصدیق کی ایک تہہ شامل کرنا ہے، محفوظ شیل (یہ وہی ہے جو نام کے لئے کھڑا ہے، اگر آپ نے کبھی سوچا ہے، اگرچہ تقریبا ہر کوئی اسے صرف پکارتا ہے ess-ess-aitch ان دنوں).
یہ ایک فوری ہٹ تھا، اور پروٹوکول کو فوری طور پر ہر جگہ sysadmins نے اپنایا۔
OpenSSH نے جلد ہی اس کی پیروی کی، جیسا کہ ہم نے اوپر ذکر کیا، پہلی بار 1999 کے آخر میں اس کے حصے کے طور پر ظاہر ہوا۔ اوپن بی ایس ڈی 2.6 رہائی.
اوپن بی ایس ڈی ٹیم پروٹوکول کا ایک مفت، قابل اعتماد، اوپن سورس نفاذ بنانا چاہتی تھی کہ وہ اور کوئی اور استعمال کر سکتا ہے، بغیر کسی لائسنسنگ یا تجارتی پیچیدگیوں کے جس نے یلونن کی رہائی کے فوراً بعد کے سالوں میں اس کے اصل نفاذ کو متاثر کیا تھا۔
درحقیقت، اگر آپ ونڈوز ایس ایس ایچ سرور چلاتے ہیں اور ابھی لینکس کمپیوٹر سے اس سے جڑتے ہیں، تو آپ تقریباً یقینی طور پر دونوں سروں پر اوپن ایس ایس ایچ کے نفاذ پر انحصار کر رہے ہوں گے۔
SSH پروٹوکول دیگر مقبول کلائنٹ سرور سروسز بشمول SCP اور SFTP میں بھی استعمال ہوتا ہے۔ محفوظ کاپی اور محفوظ ایف ٹی پی بالترتیب SSH کا ڈھیلا مطلب ہے، "محفوظ طریقے سے جڑیں اور دوسرے سرے پر کمانڈ شیل چلائیں"، عام طور پر انٹرایکٹو لاگ ان کے لیے، کیونکہ یونکس پروگرام عام طور پر کمانڈ شیل کے لیے ہوتا ہے۔ /bin/sh
. ایس سی پی اسی طرح کی ہے، لیکن کاپی کرنے والی فائلوں کے لیے، کیونکہ یونکس فائل کاپی کمانڈ کو عام طور پر کہا جاتا ہے۔ /bin/cp
، اور SFTP کا نام اسی طرح رکھا گیا ہے۔
OpenSSH شہر میں واحد SSH ٹول کٹ نہیں ہے۔
دیگر معروف نفاذ میں شامل ہیں: libssh2, ان ڈویلپرز کے لیے جو SSH سپورٹ کو اپنی اپنی ایپلی کیشنز میں بنانا چاہتے ہیں۔ ڈراپ بیئر، آسٹریلیائی کوڈر سے ایک سٹرپڈ ڈاؤن SSH سرور میٹ جانسٹن۔ جو بڑے پیمانے پر نام نہاد IoT (انٹرنیٹ آف تھنگز) آلات جیسے کہ ہوم راؤٹرز اور پرنٹرز پر پایا جاتا ہے۔ اور پٹیانڈی اوپن سورس ڈویلپر سے ونڈوز کے لیے SSH سے متعلقہ ٹولز کا ایک مقبول، مفت مجموعہ سائمن ٹیتھم انگلینڈ میں.
لیکن اگر آپ ایک باقاعدہ SSH صارف ہیں، تو آپ آج کم از کم ایک OpenSSH سرور سے تقریباً یقینی طور پر جڑ گئے ہیں، کم از کم اس لیے نہیں کہ زیادہ تر عصری لینکس ڈسٹری بیوشنز اسے اپنے معیاری ریموٹ ایکسیس ٹول کے طور پر شامل کرتے ہیں، اور مائیکروسافٹ ایک OpenSSH کلائنٹ اور ایک OpenSSH دونوں پیش کرتا ہے۔ سرور ان دنوں باضابطہ ونڈوز اجزاء کے طور پر۔
ڈبل فری بگ فکس
اوپن ایس ایس ایچ ورژن 9.2 ابھی باہر آیا، اور رہائشی نوٹ درج ذیل رپورٹ:
اس ریلیز میں […] میموری کی حفاظت کے مسئلے کے لیے اصلاحات شامل ہیں۔ [یہ بگ] قابل استعمال نہیں سمجھا جاتا ہے، لیکن ہم زیادہ تر نیٹ ورک تک رسائی کے قابل میموری کی خرابیوں کو سیکیورٹی کیڑے کے طور پر رپورٹ کرتے ہیں۔
بگ متاثر کرتا ہے۔ sshd
، OpenSSH سرور (دی -d
لاحقہ کا مطلب ہے۔ ڈیمان، پس منظر کے عمل کی ترتیب کے لیے یونکس کا نام جسے ونڈوز کہتے ہیں a سروس):
sshd(8): OpenSSH 9.1 میں متعارف کرائے گئے پہلے سے تصدیق شدہ ڈبل فری میموری فالٹ کو ٹھیک کریں۔ یہ قابل استعمال نہیں سمجھا جاتا ہے، اور یہ غیر مراعات یافتہ پری تصنیف کے عمل میں ہوتا ہے جو chroot(2) سے مشروط ہے اور زیادہ تر بڑے پلیٹ فارمز پر مزید سینڈ باکس کیا جاتا ہے۔
ڈبل فری بگ کا مطلب یہ ہے کہ ایک میموری بلاک جو آپ پہلے ہی آپریٹنگ سسٹم پر واپس آچکے ہیں تاکہ آپ کے پروگرام کے دوسرے حصوں میں دوبارہ استعمال کیا جاسکے…
…بعد میں پروگرام کے ایک حصے کے ذریعے دوبارہ واپس کر دیا جائے گا جو اب حقیقت میں اس میموری کا "مالک" نہیں ہے، لیکن نہیں جانتا کہ یہ نہیں ہے۔
(یا کوڈ کے اشارے پر جان بوجھ کر واپس کر دیا گیا ہے جو ایک کو تبدیل کرنے کے لئے جان بوجھ کر بگ کو اکسانے کی کوشش کر رہا ہے خطرے کا سامنا میں ایک استحصال.)
یہ ٹھیک ٹھیک اور مشکل سے کھولے جانے والے کیڑے کا باعث بن سکتا ہے، خاص طور پر اگر سسٹم فریڈ اپ بلاک کو دستیاب کے طور پر نشان زد کرتا ہے جب پہلی بار free()
ہوتا ہے، بعد میں اسے آپ کے کوڈ کے کسی اور حصے کے لیے مختص کرتا ہے جب یہ اس کے ذریعے میموری طلب کرتا ہے۔ malloc(
)، اور پھر ضرورت سے زیادہ کال کرنے پر ایک بار پھر بلاک کو مفت نشان زد کرتا ہے۔ free()
ظاہر ہوتا ہے.
اس سے آپ کو اس طرح کی صورتحال کا سامنا کرنا پڑتا ہے جب آپ کسی ہوٹل میں جاتے ہیں جس میں کہا جاتا ہے، "اوہ، اچھی خبر! ہم نے سوچا کہ ہم بھر چکے ہیں، لیکن ایک اور مہمان نے ابھی جلد چیک آؤٹ کرنے کا فیصلہ کیا، تاکہ آپ ان کا کمرہ لے سکیں۔
یہاں تک کہ اگر کمرے کو صاف ستھرا اور نئے مکینوں کے لیے تیار کیا جاتا ہے جب آپ اندر جاتے ہیں، اور اس طرح ایسا لگتا ہے جیسے یہ آپ کے خصوصی استعمال کے لیے مناسب طریقے سے مختص کیا گیا تھا، آپ کو پھر بھی یقین کرنا ہوگا کہ پچھلے مہمان کا کی کارڈ واقعی صحیح طریقے سے منسوخ ہوا تھا، اور یہ کہ ان کا " ابتدائی چیک آؤٹ” اسی دن بعد میں چپکے سے واپس لوٹنا اور آپ کا لیپ ٹاپ چوری کرنا کوئی چالاکانہ چال نہیں تھی۔
بگ فکس کے لیے بگ فکس
ستم ظریفی یہ ہے کہ اگر آپ اوپن ایس ایس ایچ کوڈ کی حالیہ تاریخ کو دیکھیں گے تو آپ دیکھیں گے کہ اوپن ایس ایس ایچ نامی فنکشن میں ایک معمولی بگ تھا۔ 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()
یہ مستقبل میں.
وہ بلاک بنیادی طور پر ترک کر دیا گیا ہے، جس کی وجہ سے a کے نام سے جانا جاتا ہے۔ یاداشت کا ضیاء.
وقت گزرنے کے ساتھ، یہ پریشانی کا باعث بن سکتا ہے، شاید میموری اوورلوڈ سے بازیافت کرنے کے لیے سرور کو بند کرنے پر بھی مجبور کر سکتا ہے۔
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
پروگرام کے پاس اس وقت ہوتا ہے جب وہ استعمال کے لیے کنکشن ترتیب دے رہا ہو۔
اس کے باوجود، انہوں نے اسے ایک حفاظتی سوراخ کے طور پر رپورٹ کیا کیونکہ یہ وہی ہے، لہذا یقینی بنائیں کہ آپ نے اپ ڈیٹ کیا ہے اوپن ایس ایچ ایکس این ایم ایکس.
اور اگر آپ C میں کوڈ لکھ رہے ہیں تو یاد رکھیں کہ چاہے آپ کتنے ہی تجربہ کار کیوں نہ ہوں، میموری کا انتظام غلط ہونا آسان ہے…
…تو وہاں کا خیال رکھنا۔
(ہاں، زنگ اور اس کے جدید دوست کریں گے۔ صحیح کوڈ لکھنے میں آپ کی مدد کریں۔، لیکن بعض اوقات آپ کو پھر بھی C استعمال کرنے کی ضرورت ہوگی، اور یہاں تک کہ Rust اس کی ضمانت نہیں دے سکتا آپ کو غلط کوڈ لکھنے سے روکیں۔ اگر آپ غیر منصفانہ پروگرام کرتے ہیں!)
- SEO سے چلنے والا مواد اور PR کی تقسیم۔ آج ہی بڑھا دیں۔
- پلیٹو بلاک چین۔ Web3 Metaverse Intelligence. علم میں اضافہ۔ یہاں تک رسائی حاصل کریں۔
- ماخذ: https://nakedsecurity.sophos.com/2023/02/03/openssh-fixes-double-free-memory-bug-thats-pokable-over-the-network/