اکثر چیزها در مورد باگ نافرم جی لیب سی

glibc-exploit

یک باگ جدید و جدی توی glibc دیده شده. یک باگ خیلی جدی. کتابخونه سی گنو یا همون glibc یکی از بخش‌های بسیار مهم اکثر توزیع های لینوکس است. حالا یک باگ توی این کتابخونه هزاران برنامه لینوکس رو تهدید می کنه. این باگ نسبتا شبیه باگ سال گذشته GHOST است (CVE-2015-0235) که اجازه می داد از راه دور کدهایی روی ماشین اجرا بشه.

باگ فعلی (CVE-2015-7547) یک باگ سرریز استک (stack based buffer overflow)‌ است در بخش کلاینت دی ان اس glibc که وظیفه تبدیل کردن آدرس های قابل فهم برای آدم ها (مثلا jadi.net) به آی پی رو داره.

کلیت ماجرا

این مشکل وقتی دیده می شه که یک دستگاه دارای باگ سعی کنه به یک DNS سرور بدطینت ریکوئست بزنه و نتایج رو توی حافظه بذاره (تابع getaddrinfo). چیزی که دی ان اس سرور بدخواه بدجنس بر می گردونه ممکنه حاوی کدی باشه که کار مخربی می کنه و نشستنش توی حافظه – در سطرح تئوری – باعث اجراش خواهد شد. البته در عمل این اتفاق تقریبا غیر ممکنه چون انواع مکانیزمهای امنیتی جلوی اونو خواهند گرفت (شامل ASLR). حالت بعدی اینه که حمله کننده به شکل مرد میانی درخواست های دی ان اس رو خودش بر می گردونه و بینشون کدهای نامناسب درج می کنه.

چه کسانی مبتلا هستن

تقریبا هر سیستم لینوکس جدید با این مشکل مواجه خواهد بود. این باگ از جی لیب سی ۲.۹ به بعد ظاهر شده و در نتیجه هر برنامه ای که با استفاده از توابع glibc به شبکه دسترسی پیدا می کنه ریسک داره. نمونه ها؟ اس اس اچ،‌ سودو و کرل. لیست کامل می خواین؟ تقریبا غیر ممکنه. بهتره تصور کنین اکثر برنامه های مرتبط با شبکه و حتی زبون های پایتون، پی اچ پی، روبی، … و البته برنامه‌های بیت کوین.

مشکل دقیقا کجاست

محققین گوگل می گن که بخشی از glibc که به دی ان اس ریکوئست می زنه مشکل داره. این مساله به جی لیب سی تذکر داده شده و اصلاح شده و همه باید آپدیت کنیم… حداقل در طول هفته آینده دائما آپدیت کنیم. مهندسین گوگل می گن:

جی لیب سی ۲۰۴۸ بایت برای استک الوک می کنه تا جواب دی ان اس از _nss_dns_gethostbyname4_r رو توش ذخیره کنه. جلوتر در تابع send_dg و send_vc اگر جواب بزرگتر از ۲۰۴۸ بایت باشه، بافر جدیدی درست می شه و پوینترها آپدیت می‌شن. در شرایط خاص ناهماهنگی بین بافر استک و تخصیص دهی جدید هیپ پیش می یاد و نتیجه این می شه که بافر استک برای ذخیره کردن جواب دی ان اس استفاده می شه، حتی در مواقعی که جواب بزرگتر از اندازه این بافر باشه. این مساله موجب اورفلوی بافر استک می شه.

(فارسی گفتن اینها عجیب می شه. متن اصلی اینجاست).

اثبات شده

سه شنبه مهندس گوگل فرمین سرنا یک اکسپلویت برای اثبات این مساله منتشر کرد. با استفاده از این اثبات مفهوم می شه چک کرد که آیا برنامه های ما در مقابل این مشکل صدمه پذیر هستن یا نه (هستن!).

اصلاح

مهندسین گوگل با همراهی ردهت یک پچ برای حل مشکل ارائه کردن. اما مساله اینه که حالا تک تک توزیع‌ها باید glibc خودشون رو آپدیت کنن و هر برنامه ای که استاتیک این کتابخونه رو لینک کرده، باید خودش رو آپدیت کنه. مثل همیشه در دنیای لینوکس وقتی مشکلات دیده بشن سریعا حل می شن و من و شما فقط کافیه آپدیت کنیم. پس در روزهای آینده حواستون به آپدیت ها باشه منتظر آپدیت های زیاد باشین. همچنین اگر از سروری محافظت می کنین که به اینترنت وصل نیست، دردسرهای نسبتا زیادی منتظر شما خواهد بود چون آپدیت کردن این سیستم‌ها معمولا دردسره و در مواردی شاید نتونین به سادگی فقط glibc رو آپدیت کنین.

آیا من و شما در خطریم؟

در حالت معقول نه. کامپیوترهای ما به دی ان اس سرورهای بدجنس وصل نمی شن و اگر از لینوکس هایی به روز استفاده کنیم مشکل همین الان هم تا حدی برطرف شده و فقط در روزهای آینده باید آپدیت‌ها رو جدی بگیریم همچنین اندرویدها به جای glibc از بیونیک استفاده می کنن که این مشکل رو نداره و اکثر لینوکس های درونکار( امبدد؟ )‌ هم مشکلی نداره چون اکثرا uclibc هستن.

نکته باقیمانده

به سادگی در کامنت ها مطرح کنین و سعی می کنم در سطح سواد و وقت جواب بدم و بقیه رو هم می سپریم به دوستان باسوادتر در کامنت ها (:

  • محمد صالح

    تشکر.

  • Vahid

    “در حالت معقول نه. کامپیوترهای ما به دی ان اس سرورهای بدجنس وصل نمی شن”
    الزامی نداره که حتما به یه DNS server بدجنس درخواست بدی، DNS میتونه به راحتی
    man in the middle بخوره. البته طبیعتا مستلزم این هست که attacker یه
    جایی به DNS request شما دسترسی داشته باشه که بتونه جواب بده.

    • jadijadi

      بله بله این رو گفته ام در متن هم.

  • alighafoori

    این باگ هایی که هی داره داخل برنامه های متن باز پیدا میشه اکثرا سر اینه که مدیریت حافظه داخل زبان سی و فرزندش سی پلاس پلاس قدیمی و بدرد نخوره باید یک فکر اساسی بشه این زبان ها را با زبان های جدید درست و حسابی عوض کنند

    • Mehran

      مشکل اینجا هست که تا جایی که من اطلاع دارم سی و دسترسی بی‌قید به حافظه بهترین بازدهی رو در بین زبان‌های برنامه‌نویسی داره. برای برنامه‌های کاربردی می‌شه (واکثرا باید) بازدهی رو فدای کد بهتر در یک زبان بهتر کرد. ولی برای برنامه‌های ساختاری مثل کرنل لینوکس و یا پیاده‌سازی پرتکل‌های شبکه یا در این مورد glibc لازمه که پربازده‌ترین برنامه باشه.

      • alighafoori

        ما که 20 سال پیش زندگی نمی کنیم الان با این قانون مور ان قدر سرعت زیاد شده که همین چند روز پیش یکی از مسئول اینتل گفت فرکانس نسل جدید پردازنده ها را برای افزایش طول عمر باتری دستگاهها کاهش می دهیم برای همین دیگه بجز برای سرور سایت های پر بازدید سرعت دیگه اهمیتی نداره

        • پت

          کاملا مخالفم. هنوز که هنوزه هزینه‌ی انرژی (که متناسب است با سرعت اجرای کد) هزینه‌ی اصلی شرکت‌های اینترنتی (مثل گوگل و فیسبوک) است.

        • Mohammad S. Babaei

          مشکل اینجاست که قانون مور محدودیت های خودش رو داره، شما فکر می کنی چرا سرعت سی پی یو ها روی 4 گیگاهرتز قفل شده و هی دارن تعداد هسته رو زیاد می کنن؟ الان نسل بعدی CPU ها 14 و 10 نانو خواهد بود؟ بسیار عالی! سیلیکون ورای 7 نانو با مشکل مواجه میشه چون وارد قلمرو فیزیک کوانتوم میشیم و پایداری دیگه وجود نداره. در ضمن تمامی برنامه ها از مالتایتردینگ بهره نمی برن. https://www.reddit.com/r/askscience/comments/19p7f7/is_moores_law_really_still_in_effect/
          آیا زبان های برنامه نویسی با حافظه مدیریت شده امن تر هستن؟ این جدول ها چیز دیگه ای میگن https://en.wikipedia.org/wiki/Java_version_history#Java_6_updates
          مثلا فقط یک آپدیت برای جاوا 6 و یا جاوا 7 در عرض 2 ماه 50 تا Security Fix عرضه کرده؟ (آپدیت های 39 و 13)
          آیا میدونستید بیشتر هک ها و آسیب پذیری های کاربران از طریق Java و Flash (ActionScript) که هر دو مدیریت شده هستن اتفاق میافتن؟
          در ضمن از این اتفاقات مسخره هم برای .NET 4.6.0 و Visual Studio هم میافته (حتما هر سه لینک رو ببینید)
          https://github.com/dotnet/coreclr/issues/1296
          http://nickcraver.com/blog/2015/07/27/why-you-should-wait-on-dotnet-46/
          https://www.humankode.com/security/how-a-bug-in-visual-studio-2015-exposed-my-source-code-on-github-and-cost-me-6500-in-a-few-hours
          حتی عیجب تر از نرم افزارها، سخت افزار ها هستن که باعث ایجاد باگ های امنیتی میشن مثل CPU های اینتل http://danluu.com/cpu-bugs/
          هنوز یکی از معضلات اصلی در موبایل کامپیوتینگ باتری هست و همگی ما میدونیم حتی یک سیکل از CPU مهمه که زبان های Garbage Collected بیشترین فشار رو به باتری میارن
          واقعا اگر بخوام این لیست رو ادامه بدم دلایل بیشتری وجود داره که چرا زبان های Native مثله C و C++؟ اما فکر میکنم همین ها کافی باشه

          خب همانطور که میبینی دوست عزیز همچین باگ هائی چیزهای عجیب و غریبی نیستن و دنیائی که توش زندگی می کنیم هم پرفکت نیست

          • alighafoori

            جاوا و فلش دارای تعداد زیادی الحاقات غیر مرتبط با برنامه نویسی دارند که موجب میشه این قدر باگ داشته باشند مثلا داخل دات نت این الحاقات بسیار کمه ،باگ ها هم بسیار کمتره ، صحبت من این است که زبان های سی و سی پلاس پلاس به طور زاتی دارای نقصی هستند که باعث میشه فقط کمی سهل انگاری باعث ایجاد مشکلات بسیار خطرناک بشه شما این صفحه را ببین
            http://www.memorymanagement.org/mmref/lang.html
            مدیریت حافظه زبان های مختلف با هم بررسی کرده به محض اینکه می رسه به سی و سی پلاس پلاس شروع می کنه لیستی از ضعف ها را ردیف بکنه

            • Mohammad S. Babaei

              به هر حال کد شما روی ران تایم جاوا و فلش اجرا میشه. یک سوال چرا جاوا و فلش رو یا دات نت، سلف هاست نیستن؟ یعنی چرا خودشون رو با خودشون نمی نویسن؟

              منظورم رو واضح تر میگم:

              منظور من این نیست که زبان های فوق بدرد نخور هستن، منظور من اینه که هر ابزاری را بهر کاری ساختند. من به شما قول میدم سال 2050 هم تمامی این محدودیت های تکنولوژیک وجود خواهد داشت و C و C++ هنوز هم زبان های شماره یک برنامه نویسی سیستمی خواهند بود. قدرت کامپیوترها هرچقدر هم که میخواد باشه. حداقل در آینده نزدیک، ابزار پرفکتی وجود نخواهد داشت! هرجائی که دست انسان در کار باشه باگ وجود داره، چه C باشه چه جاوا چه PHP.

              درمورد C++ هم اطلاعات صفحه ای که گذاشتدید بسیار قدیمی هست. کدی که ما در C++ مدرن می نویسیم نیازمند مدیریت دستی حافظه نیست. من یادم نمیاد آخرین باری که از new و delete استفاده کردم کی بوده. میتونید راجع به Smart Pointer ها که اتفاقا کارائی بسیار بهتری نسبت به Garbage Collector دارند بیشتر تحقیق کنید.

              • alighafoori

                کامپایلر جدید دات نت roslyn سلف هاست هست می توانی سورش را از این لینک ببینی
                http://source.roslyn.io/

                همان طور که الان کسی سراغ اسمبلی نمی ره 2050 هم کسی سراغ سی نخواهد رفت هر ابزاری زمان خودش را داره

                این Smart Pointer چیز جالبی بود تا حالا در موردش نمی دونستم خوب زبان ها پیشرفت می کنند الان vb.net دیگه ان بیسیک ضعیف دهه 70 میلادی نیست با اینکه پیشرفت کرده اما دیگه محبوبیت قبلش را نداره و زبان سی شارپ جایش را گرفت زبان های برنامه نویسی جدید جایگزین سی پلاس پلاس می شوند الان داخل اندروید نصف کار انجام شده و نصف سیستم عامل با زبان جدید نوشته شده و بیشتر کتابخانه هاش هم با زبان جدید است سیستم عامل بعدی کلا با زبان جدید خواهد بود

                • Mohammad S. Babaei

                  اون فقط کامپایلر هست اما VM دات نت به دلایلی که همگی میدونیم هنوز Native هست.

                  • alighafoori

                    مایکروسافت نسخه های بعدی اینکار را هم می کنه همانطور که قبلا کامپایلرهاش با سی پلاس پلاس بودن و جایگزین شدند اما مثالی بهتر هم هست سیستم عامل کاسموس که با سی شارپ نوشته شده
                    https://github.com/CosmosOS/Cosmos
                    تو این پروژه فقط کد سی شارپ خالص استفاده شده از کامپایلرگرفته تا سیستم فایلی و مدیریت حافظه و …. نمونه ای موفق از اینکه می شود زبان های قدیمی را کنار گذاشت

      • میلاد

        خب عزیز من وقتی بعضی دستورا قراره توو کمتر از یک دقیقه چند میلیارد بار اجرا شن تفاوت استفاده از کتابخونه ها c رو با زبون های دیگه میبینی (:
        درسته که قدرت محاسباتی سیستم ها زیاد شده ولی به همون اندازه حجم‌ و محاسبات برنامه ها زیاد شده.
        قبلا اگه یه کامپیوتر‌ داشتیم‌ که ۳۲ مگابایت رم داشت و نهایت کاری که باهاش میکردیم بازی ماریو بود، الان یه بازی‌ مثل modern war داریم….

    • jadijadi

      یک جور تحلیل پسینی اینه که فکر کنیم آیا توروالدز و دیگران به نظرشون سی مناسب بوده و هست یا نه (: سی مطمئنا «قدیمی و به درد نخور» نیست (: ابزاری که به شما قدرت بیشتری بده، امکان اشتباه بیشتر هم می ده. به همین سادگیه به نظرم.

      • alighafoori

        ان موقع که توروالدز شروع کرد مگر انتخاب دیگه ای غیر از سی بود. نظر من این است که با ابزارهای قدیمی نمیشه اینده را ساخت برای دوره جدید احتیاج به ابزارهای جدید هست

  • optic

    خیلی ممنون میشم جادی یا یکی از دوستان لینوکس کار جواب این سوال من رو بده از بس دنبال راه حل گشتم خسته شدم :-(
    برنامه های نوشته شده در پایتون رو بخوایم تو ویندوز اجرا کنیم به .exe تبدیل میکنیم حالا برای لینوکس به چی تبدیل کنیم ؟ چطور یه فایل نصبی ایجاد کنیم. حالا از لینک توضیح تکمیلی بدین یا خلاصه مفهوم رو برسونین خیلی ممنون میشم.

    • پت

      ‌Buck یا Blaze
      احتمالا به کارت می‌آیند

      • optic

        یه چیزی مثل py2exe , pyinstaller ,cx_Freeze لازم دارم منتها اینا همه خروجی exe میدن اون بنده خدایی که بخواد رو لینوکس برنامه رو اجرا کنه چی ؟

        • دوست

          توي لينوكس من از cx_Freeze استفاده ميكنم

  • kolo

    عبور از کپچایی که به خاطر استفاده از تور هنگام ورود به سایتتون خواسته میشه تقریبا محاله! مگه کجا سایت میزبانی می شه؟
    ۲. روزی ۱۵ ساعت به IRC اوبونتو ubuntu-ir لاگین کنید، هیچ کاری هم نکنید، جوابی به سوالی هم که ندید: الف) بقیه روحیه میگرند ب) می پیچه و بقیه هم میان استفاده می کنند. یا اگر سرور دارید کافیه بذارید با znc یوزرتون لاگین بمونه
    ۲.۱. استفاده از IRC کمک میکنه به شکل گیری مفهوم کامیونیتی
    ۳. من هفتگی سیستم رو آپدیت میکنم (۲شنبه ها). لزومی داره به خاطر اینکه یک کاربر معمول دسکتاپ هستم آپدیتی تا قبل ار ۲شنبه انجام بدم؟

  • هدایت

    تا جایی که من میدونم. برای اکثر برنامه‌ها نیازی نیست که خود برنامه هم از اول کامپایل بشه. همین که glibc آپدیت بشه حله. مگه این که برنامه‌ای به صورت استاتیک لینک شده باشه. برای همین هم احتمالا شاهد سیلی از آپدیت نخواهیم بود. خود glibc هم احتمالا همین حالا توی توزیع‌ها آپدیت شده (مثلا توی فدورا که آپدیت شده).

    • jadijadi

      واقعا ها. این چه حرف ضایعی بود که زدم… الان کمی اصلاح می کنم.