لینک کوتاه مطلب : https://hsgar.com/?p=3905

ایمنی حافظه برای بزرگترین پروژه نرم افزاری جهان

Rust برای لینوکس و Prossimo

هدف پروژه Rust for Linux آوردن یک زبان برنامه نویسی سیستم جدید به هسته لینوکس است. Rust یک ویژگی کلیدی دارد که در نظر گرفتن آن به عنوان زبان دوم در هسته بسیار جالب است: این تضمین می کند که هیچ رفتار تعریف نشده ای (تا زمانی که کد ناامن سالم باشد) انجام نمی شود، به ویژه از نظر مدیریت حافظه. این شامل هیچ مشکل پس از استفاده رایگان، بدون رایگان شدن مضاعف، بدون مسابقه داده و غیره است.

Prossimo یک است گروه تحقیقات امنیت اینترنت پروژه (ISRG). هدف آن بهبود زیرساخت نرم افزار حساس به امنیت اینترنت با پرداختن به مسائل ایمنی حافظه در کدهای C و C++ از طریق استفاده از زبان های ایمن حافظه است. یکی از نمونه های حیاتی چنین زیرساختی، هسته لینوکس است که در اکثر سرورهای جهان و همچنین در میلیاردها دستگاه استفاده می شود.

منشا Rust و هسته

تمایل به نوشتن کد هسته لینوکس در Rust مدت زیادی است که وجود داشته است و افراد مختلف در طول سال ها ماژول های خارج از درخت را با Rust ایجاد کرده اند. اولین تلاشی که من از آن مطلع هستم مربوط به سال 2013 است تاسو کیم، که حتی قبل از انتشار Rust 1.0 بود.

در پروژه Rust برای لینوکس با یک هدف رویایی فراتر از ماژول های خارج از درخت ایجاد شد: ارائه پشتیبانی Rust در خود هسته. اگر لاگ های GitHub را باور کنیم، من این سازمان را در تابستان 2019 ایجاد کردم، اگرچه تا تابستان بعد که چندین اتفاق متوالی اتفاق افتاد واقعاً فعالیتی نداشت.

در ژوئیه 2020، Nick Desaulniers ایمیلی به لیست پستی هسته لینوکس (LKML) در مورد گردآوری یک جلسه “in-tree Rust” برای کنفرانس لوله کشان لینوکس (LPC) 2020 ارسال کرد. آن ایمیل منجر به ارائه آن توسط چند نفر از ما شد “موانع زنگ زدگی درون درخت” صحبت در آگوست 2020، که باعث ایجاد بحث‌ها و بازخوردهای زیادی در هک‌روم‌های LPC شد. در حالی که هنوز یک مهتاب بود، به نظر می رسید که افراد زیادی به Rust در اطراف هسته علاقه دارند. بنابراین فکر کردم زمان خوبی است که همه را در یک مکان واحد کار کنم.

برای این منظور، چند روز بعد، اولین درخواست کشش پروژه Rust for Linux را ارسال کردم که اضافه شد پشتیبانی اولیه Rustاز جمله ادغام Kbuild، پشتیبانی از ماژول های داخلی اولیه و شروع kernel جعبه (که حاوی الکس گینور و جفری توماس بود انتزاعات).

افراد دیگری مانند Wedson Almeida Filho از Google، که نگهدارنده پروژه و مشارکت کننده اصلی در انتزاعات و محرک ها است، طی چند ماه آینده به این تلاش پیوستند. بلافاصله پس از آن، گروه تحقیقاتی امنیت اینترنت با من تماس گرفت تا از کار بر روی Rust برای لینوکس به مدت یک سال با بودجه Google پشتیبانی کند.

امسال پیشرفت کرد

از زمانی که درخواست نظرات به لیست پستی کرنل لینوکس ارسال شد، پیشرفت زیادی داشته ایم. در بخش زیرساخت، برخی تغییرات مرتبط عبارتند از:

  • با ادغام زیرمجموعه ای از تخصیص های وحشت زده حذف شد alloc کتابخانه استاندارد
  • به نسخه 2021 زبان Rust منتقل شد.
  • به نسخه های پایدار کامپایلر Rust منتقل شد (ویژگی های ناپایدار هنوز استفاده می شود) و شروع به پیگیری آخرین نسخه کرد.
  • اضافه arm (32 بیتی) و riscv پشتیبانی از معماری پایه
  • پشتیبانی از آزمایش، از جمله اجرای آزمایش‌های مستندسازی در داخل هسته به عنوان آزمایش‌های KUnit.
  • اضافه شدن پشتیبانی از hostprogs (برنامه های فضای کاربری مورد استفاده در حین ساخت) نوشته شده در Rust.
  • تولید فوری فایل های مشخصات هدف بر اساس پیکربندی هسته.
  • اسناد را گسترش داد، از جمله یک مخزن نمونه جدید که یک ماژول Rust خارج از درخت را بر اساس پشتیبانی داخل درخت Rust نشان می دهد.

در انتزاعات و سمت راننده، برخی تغییرات مهم عبارتند از:

  • درایور نمونه PrimeCell PL061 GPIO.
  • عملکرد برای درایورهای پلتفرم و AMBA، درختان قرمز-سیاه، توصیفگرهای فایل، تکرارکننده‌های بیت کارآمد، وظایف، فایل‌ها، بردارهای IO، تماس‌های مدیریت انرژی، حافظه IO، تراشه‌های IRQ، اعتبارنامه‌ها، VMA، مولد اعداد تصادفی سخت‌افزار، شبکه‌سازی…
  • ویژگی های همگام سازی مانند سمافورهای RW، mutexes قابل برگشت، قفل های چرخشی خام، قفل بدون انتظار، قفل های توالی…
  • جایگزین شد Arc و Rc از alloc جعبه با هسته ساده شده Ref.
  • تشخیص هراس بهتر و نشانگرهای ساده شده.
  • آغاز رست async پشتیبانی.

پروژه های مرتبط نیز پیشرفت زیادی داشته اند:

  • زنگ چند نفر را تثبیت کرد ویژگی های ناپایداری که استفاده کردیم.
  • بهبودهایی در کامپایلر Rust، کتابخانه استاندارد و ابزار، مانند ساختن rustc_parse_format کامپایل در پایدار یا اضافه کردن no_global_oom_handling و no_fp_fmt_parse دروازه ها
  • binutils/gdb/libiberty از Rust v0 dengling پشتیبانی کرد.
  • pahole برای حذف واحدهای کامپایل Rust پشتیبانی می‌شود.
  • ربات آزمایش هسته 0Day/LKP اینتل شروع به آزمایش ساختی با پشتیبانی از Rust فعال کرد.
  • KernelCI همچنین مشتاق است تا Rust را در اجراهای خود فعال کند.
  • TuxSuite Linaro پشتیبانی Rust را اضافه کرد.
  • rustc_codegen_gcc ( rustc باطن برای GCC) در مخزن Rust ادغام شد.
  • GCC Rust (یک پیش‌فرض Rust برای GCC) در حال کامپایل کردن است core، که می تواند یک نقطه عطف باشد.
  • Compiler Explorer کامپایلرهای جایگزین Rust را اضافه کرد (GCC Rust, rustc_codegen_gcc و mrustc) و همچنین ویژگی های دیگری مانند نماهای توسعه ماکرو و MIR.

علاوه بر این، چندین نهاد از این صنعت در مورد علاقه آنها به این پروژه مانند Google، Arm، Microsoft و Red Hat با ما تماس گرفتند. شرکت های دیگر نیز به طور خصوصی از این پروژه حمایت کرده اند و/یا به مهندسان خود زمان می دهند تا کاربرد آن را بررسی کنند.

ما همچنین با چندین دانشگاه از جمله محققان دانشگاه واشنگتن در تماس بوده‌ایم: «Rust برای لینوکس گامی کلیدی در جهت کاهش باگ‌های هسته حیاتی امنیتی، و در مسیر رسیدن به هدف نهایی ما، یعنی آزادسازی لینوکس از موارد حیاتی است. اشکالات. ما از Rust در تحقیقات سیستم عامل خود استفاده می کنیم، و پذیرش با Rust موجود در چارچوب هسته لینوکس آسان تر است. اخیرا منتشر کردند یک مسیر افزایشی به سمت هسته سیستم عامل ایمن تر.

به همین ترتیب، اعضای LSE (آزمایشگاه تحقیقات سیستم) در EPITA (École pour l’informatique et les tekniks avancées) از Rust برای لینوکس استفاده کرد زیرا آنها «متقاعد شده اند که Rust با به کارگیری تحقیقات انجام شده بر روی زبان های برنامه نویسی در دهه های گذشته چشم انداز برنامه نویسی سیستم را تغییر می دهد. ما می‌خواستیم ببینیم که چگونه این زبان به ما کمک می‌کند تا کدی بنویسیم که به لطف بررسی استاتیک گسترده، با آن راحت هستیم.»

علاوه بر این، Rust را برای لینوکس (و Rust به طور کلی) در چند راه ارائه کردیم: Linaro Virtual Connect Fall، Clang ساخته شده لینوکس Meetup، کنفرانس لوله کش لینوکس (LPC) (به عنوان مثال در زنگ زدگی در اکوسیستم لینوکس، بر Rust برای لینوکس و در درایورهای اندروید در Rust) اجلاس مهندسی سامسونگ، اجلاس سران منبع باز ژاپن، زمان های سرگرم کننده همکاری تیم Rust Cross (CTCFT) و Rust Linz. به عنوان یک واقعیت سرگرم کننده، با توجه به سخنرانی اصلی نظرسنجی غیر رسمی در LPC 2021، Rust همان چیزی بود که شرکت کنندگان در فناوری نوظهور بیش از همه از آن هیجان زده بودند.

ما همچنین چند جلسه Live Foundation Live Series را در آن برگزار کردیم مقدمه ای بر ایمنی Rust و انتزاعات و در مستندات کد و آزمایشات.

بالاخره سازماندهی کردیم کانگرخوس، کارگاه Rust for Linux (با استفاده از زیرساخت LPC – با تشکر!)، به عنوان مکانی برای ملاقات با همه علاقمندان در یک مکان درست قبل از LPC.

سال گذشته چه حسی داشت

هسته یک پروژه بزرگ با سهامداران زیادی است. از همان ابتدا، واضح بود که افزودن یک زبان «اصلی» دوم به هسته، هم چالش‌های فنی و هم مدیریتی خواهد داشت.

به عنوان مثال، ما گفتگوها و بازخوردهایی از نگهبانان سیستم ساخت هسته، مستندات، آزمایش، CI، معماری، ابزارها (مثلا paholeما همچنین با چندین تیم Rust برای بحث در مورد ویژگی های مورد نیاز هسته و موضوعات دیگر تماس داشتیم. ما با سازمان هایی مانند بنیاد لینوکس و همچنین با سازمان های خبری مانند اخبار هفتگی لینوکس (LWN) صحبت کردیم که چندین مورد را پوشش داد. موضوعات مرتبط با زنگ زدگی و کانگرخوس.

در مجموع، بیشتر کار من در سال گذشته روی کار با همه ذینفعان بوده است تا سعی کنم همه را در جریان کار قرار دهم. وجود داشته است زیاد افرادی که به طرق مختلف در پروژه مشارکت داشته اند: مشارکت کد، بررسی، مستندات، پشتیبانی ابزار، ویژگی های Rust… تا جایی که فهرست کردن همه آنها دشوار است. لطفاً به بخش “قدردانی” هر یک نگاهی بیندازید جلد نامه
در طول ماه ها برخی از مشارکت کنندگان مکرر بوده اند بیورن روی بارون و گری گو (به عنوان متخصص در کامپایلر Rust)، ماسیج فالکوفسکی، آدام براتشی-کایه، سون ون آسبروک، بوکون فنگ، فین برنز

به طور کلی، کار کردن با همه تیم ها و افراد مختلف بسیار خوب بوده است، و من امیدوارم که به جمع آوری همه افراد برای تحقق این امر ادامه دهیم. تعهد Prossimo به این پروژه به من این امکان را داد که تمام وقت روی آن کار کنم که بسیار سپاسگزارم – از شما متشکرم!

سال آینده

در این دومین سال از RFC، ما مشتاقانه منتظر چندین نقطه عطف هستیم که امیدواریم به آنها برسیم:

  • کاربران بیشتر یا موارد استفاده در داخل هسته، از جمله درایورهای مثال – این بسیار مهم است که در هسته ادغام شود.
  • تقسیم کردن kernel جعبه و مدیریت وابستگی ها برای امکان توسعه بهتر.
  • گسترش ادغام فعلی اسناد هسته، آزمایش و سایر ابزارها.
  • درگیر کردن بیشتر نگهبانان، شرکت ها و محققان زیرسیستم.
  • مشاهده اکثر ویژگی های Rust باقی مانده تثبیت شده است.
  • احتمالاً قادر به کامپایل کردن کد Rust در هسته با GCC هستید.
  • و، البته، ادغام شدن در هسته اصلی، که باید همه چیز را آسان تر کند!

از نظر رویدادها، ما مشتاقانه منتظریم:

  • اجلاس سران منبع باز آمریکای شمالی – کوک کردن و سوال بپرسید!
  • ویرایش دوم از کانگرخوس، کارگاه Rust for Linux، این بار رو در رو.
  • کنفرانس لوله کشان لینوکس 2022. امسال برگزار خواهد شد Rust MC (میکرو کنفرانس)، و ما قصد داریم تا گفتگوها و بحث ها را در مورد Rust برای لینوکس و همچنین سایر موضوعات Rust غیر هسته ای پوشش دهیم. فراخوان پیشنهادات باز است!
  • سه سری دیگر از Live Foundation Live Mentorship در راه است.
  • شرکت در چند مکان دیگر برنامه ریزی شده است، که اعلام خواهد شد.

اگر همه اینها اتفاق بیفتد، ممکن است سالی هیجان انگیزتر از سال اول باشد!

درباره Prossimo

ISRG سازمان غیرانتفاعی 501(c)(3) پشت Prossimo و بیایید رمزگذاری کنیم. ما 100% از طریق سخاوتمندی کسانی که دیدگاه ما را برای امنیت اینترنت باز و فراگیر به اشتراک می گذارند، پشتیبانی می شویم. اگر می‌خواهید از کار ما حمایت کنید، لطفاً مشارکت کنید، اهدا می کند، یا تشویق شرکت خود برای تبدیل شدن به یک حامی.

لینک منبع

ارسال یک پاسخ

آدرس ایمیل شما منتشر نخواهد شد.