You can edit almost every page by Creating an account. Otherwise, see the FAQ.

افزودن محدودیت‌ها به io uring برای افزایش امنیت در اشتراک حلقه‌ها

از EverybodyWiki Bios & Wiki
پرش به:ناوبری، جستجو

مقدمه[ویرایش]

io_uring یک اینترفیس هسته لینوکس است که در ورژن 5.1، برای رفع مشکلات و محدودیت‌های فریم‌ورک Async IO (AIO) به هسته اضافه شد[۱]. این API برای ارسال و پایان عملیات ورودی/خروجی همگام[پاورقی ۱] صف‌هایی فراهم می‌آورد. این صف‌ها برای جلوگیری از کپی، بین فضای هسته و کاربر مشترک هستند[۲]. مشکلات مذکور که توسط این فیچر رفع شد عبارت اند از:

  • تنها از ورودی/خروجی مستقیم [پاورقی ۲] پشتیبانی می‌کرد، و از ورودی/خروجی بافر شده [پاورقی ۳] پشتیبانی نمی‌کرد.
  • در برخی موارد رفتاری غیرقابل پیش‌بینی از خود نشان می‌داد.
  • با توجه به زیر-بهینه [پاورقی ۴] بودن این فریم‌ورک، حداقل به دو فراخوانی سیستمی نیاز داشت.

استفانو گارزارلا و استفان هاجنوچی از RedHat، گزارش دادند که در این واسط، به دلیل اشتراک صف‌ها بین فضای هسته و کاربر، بطور کامل به کد هر میهمانی [پاورقی ۵] اعتماد شده است، در حالی که این فرض در مسائل واقعی نادرست است[۳]. بنابراین آن‌ها پیشنهاد دادند که بتوان محدودیت‌هایی در عملیات مختلف بر روی io_uring اعمال کرد.

جزئیات پیاده‌سازی[ویرایش]

طبق پیشنهاد مذکور، قرار شد تعدادی محدودیت به برخی عملیات‌هایی که بر روی io_uring اضافه شود تا به برنامه‌هایی که قابل اعتماد نیستند، به صورت امن اجازه استفاده از صف‌های io_uring داده شود. این پیشنهاد توسط خود گارزارلا در قالب سه patch پیاده سازی شد که عبارت اند از:

  1. تغییر Opcodeهای فراخوانی سیستمی io_uring_register(2) از عبارات #define به enum. این تغییر این امکان را فراهم می‌کند که بتوان آخرین Opcode موجود را بدانیم [۴]. enum ساخته شده بصورت زیر می‌باشد و با استفاده از IORING_REGISTER_LAST می‌توان به تعداد Opcodeها دسترسی یافت.

  2. enum {
    	IORING_REGISTER_BUFFERS			= 0,
     	...
    	IORING_UNREGISTER_PERSONALITY	= 10,
    
    	/* this goes last */
    	IORING_REGISTER_LAST
    };
    
  3. اضافه کردن Opcode ای به نام IOURING_REGISTER_RESTRICTIONS برای مدیریت محدودیت‌ها. در صورتی که Opcode مذکور به فراخوانی سیستمی register داده شود، تابع io_register_restrictions که در این patch اضافه شده است فراخوانی می‌شود [۵]. خود این فراخوانی، دارای Opcodeهای منحصر به فرد خود است که در فایل io_uring.h تعریف شده‌اند. این فراخوانی شامل ۴ حالت محتلف است:

    • IORING_RESTRICTION_REGISTER_OP: اجازهٔ انجام عملیات ثبت را روی این حلقه می‌دهد. عملیات ثبت file descriptorها و bufferها را در حلقه قرار می‌دهد تا استفاده از آن‌ها در عملیات بعدی بصورت بهینه انجام شود. این بخش شامل عملیات ورودی/خروجی نمی‌باشد، صرفا یک سری تنظیمات است [۶].

    • IORING_RESTRICTION_SQE_OP: اجازهٔ انجام عملیاتی روی sqe [پاورقی ۶] را روی این حلقه می‌دهد. هر عملیاتی که در لیست سفید [پاورقی ۷] این حلقه نباشد، اجازه انجام نمی‌یابد.

    • IORING_RESTRICTION_SQE_FLAGS_ALLOWED: می‌توان پرچم‌هایی که در عملیات sqe قابل استفاده هستند را تعیین کرد.

    • IORING_RESTRICTION_SQE_FLAGS_REQUIRED: می‌توان پرچم‌هایی که در عملیات sqe الزامی هستند را تعیین کرد.

    همچنین توسط تابع io_check_restriction مشخص می‌شود که حلقه داده شده مجاز به انجام عملیاتی است یا خیر.

  4. اضافه کردن پرچم IORING_SETUP_R_DISABLED برای این که به کاربر اجازه داده شود پیش از شروع پردازش sqeها، محدودیت‌ها، بافرها و فایل‌ها در حلقه ثبت شوند. این پرچم در ابتدا فعال است، و تا وقتی که فعال باشد، پردازش sqeها انجام نمی‌شود. ثبت محدودیت‌ها تنها زمانی قابل انجام است که این پرچم فعال باشد. علت آن جلوگیری از رخ دادن مسئلهٔ همزمانی است. برای فعال‌سازی حلقه‌ها نیز، کافیست فراخوانی io_uring_register با IORING_REGISTER_ENABLE_RINGS انجام شود [۷].

در واقع، این محدودیت‌ها، به نوعی مجوز هستند. چرا که مشخص می‌کنند چه عملیاتی در حلقه‌ها «مجاز» است. وجود چنین لیست سفیدی باعث می‌شود عملیاتی که در آینده به io_uring اضافه می‌شوند، باعث وجود دسترسی‌های غیرمنتظره نشوند و کاربر آگاهانه و درصورت نیاز دسترسی آن عملیات را فعال کند. این محدودیت ها تنها یک بار قابل اعمال هستند و تا زمانی که حلقه وجود دارد بدون تغییر باقی می‌مانند.

پاورقی‌ها[ویرایش]

  1. Async I/O
  2. Direct I/O
  3. ‌Buffered I/O
  4. sub-optimal
  5. Guest
  6. Submission Queue Entry
  7. Whitelist

منابع[ویرایش]


This article "افزودن محدودیت‌ها به io uring برای افزایش امنیت در اشتراک حلقه‌ها" is from Wikipedia. The list of its authors can be seen in its historical and/or the page Edithistory:افزودن محدودیت‌ها به io uring برای افزایش امنیت در اشتراک حلقه‌ها. Articles copied from Draft Namespace on Wikipedia could be seen on the Draft Namespace of Wikipedia and not main one.