افزودن محدودیتها به io uring برای افزایش امنیت در اشتراک حلقهها
مقدمه[ویرایش]
io_uring
یک اینترفیس هسته لینوکس است که در ورژن 5.1، برای رفع مشکلات و محدودیتهای فریمورک Async IO (AIO) به هسته اضافه شد[۱]. این API برای ارسال و پایان عملیات ورودی/خروجی همگام[پاورقی ۱] صفهایی فراهم میآورد. این صفها برای جلوگیری از کپی، بین فضای هسته و کاربر مشترک هستند[۲]. مشکلات مذکور که توسط این فیچر رفع شد عبارت اند از:
- تنها از ورودی/خروجی مستقیم [پاورقی ۲] پشتیبانی میکرد، و از ورودی/خروجی بافر شده [پاورقی ۳] پشتیبانی نمیکرد.
- در برخی موارد رفتاری غیرقابل پیشبینی از خود نشان میداد.
- با توجه به زیر-بهینه [پاورقی ۴] بودن این فریمورک، حداقل به دو فراخوانی سیستمی نیاز داشت.
استفانو گارزارلا و استفان هاجنوچی از RedHat، گزارش دادند که در این واسط، به دلیل اشتراک صفها بین فضای هسته و کاربر، بطور کامل به کد هر میهمانی [پاورقی ۵] اعتماد شده است، در حالی که این فرض در مسائل واقعی نادرست است[۳]. بنابراین آنها پیشنهاد دادند که بتوان محدودیتهایی در عملیات مختلف بر روی io_uring
اعمال کرد.
جزئیات پیادهسازی[ویرایش]
طبق پیشنهاد مذکور، قرار شد تعدادی محدودیت به برخی عملیاتهایی که بر روی io_uring
اضافه شود تا به برنامههایی که قابل اعتماد نیستند، به صورت امن اجازه استفاده از صفهای io_uring
داده شود. این پیشنهاد توسط خود گارزارلا در قالب سه patch پیاده سازی شد که عبارت اند از:
تغییر Opcodeهای فراخوانی سیستمی
io_uring_register(2)
از عبارات#define
بهenum
. این تغییر این امکان را فراهم میکند که بتوان آخرین Opcode موجود را بدانیم [۴]. enum ساخته شده بصورت زیر میباشد و با استفاده ازIORING_REGISTER_LAST
میتوان به تعداد Opcodeها دسترسی یافت.اضافه کردن 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
مشخص میشود که حلقه داده شده مجاز به انجام عملیاتی است یا خیر.اضافه کردن پرچم
IORING_SETUP_R_DISABLED
برای این که به کاربر اجازه داده شود پیش از شروع پردازش sqeها، محدودیتها، بافرها و فایلها در حلقه ثبت شوند. این پرچم در ابتدا فعال است، و تا وقتی که فعال باشد، پردازش sqeها انجام نمیشود. ثبت محدودیتها تنها زمانی قابل انجام است که این پرچم فعال باشد. علت آن جلوگیری از رخ دادن مسئلهٔ همزمانی است. برای فعالسازی حلقهها نیز، کافیست فراخوانیio_uring_register
باIORING_REGISTER_ENABLE_RINGS
انجام شود [۷].
enum {
IORING_REGISTER_BUFFERS = 0,
...
IORING_UNREGISTER_PERSONALITY = 10,
/* this goes last */
IORING_REGISTER_LAST
};
در واقع، این محدودیتها، به نوعی مجوز هستند. چرا که مشخص میکنند چه عملیاتی در حلقهها «مجاز» است. وجود چنین لیست سفیدی باعث میشود عملیاتی که در آینده به
io_uring
اضافه میشوند، باعث وجود دسترسیهای غیرمنتظره نشوند و کاربر آگاهانه و درصورت نیاز دسترسی آن عملیات را فعال کند. این محدودیت ها تنها یک بار قابل اعمال هستند و تا زمانی که حلقه وجود دارد بدون تغییر باقی میمانند.
پاورقیها[ویرایش]
منابع[ویرایش]
- ↑ «An Introduction to the io_uring Asynchronous I/O Framework».صفحه پودمان:Citation/CS1/fa/styles.css محتوایی ندارد.
- ↑ «io_uring».صفحه پودمان:Citation/CS1/fa/styles.css محتوایی ندارد.
- ↑ «Adding restrictions to io_uring Proposal».صفحه پودمان:Citation/CS1/fa/styles.css محتوایی ندارد.
- ↑ «io_uring: use an enumeration for io_uring_register(2) opcodes».صفحه پودمان:Citation/CS1/fa/styles.css محتوایی ندارد.
- ↑ «io_uring: add IOURING_REGISTER_RESTRICTIONS opcode».صفحه پودمان:Citation/CS1/fa/styles.css محتوایی ندارد.
- ↑ «Operations restrictions for io_uring».صفحه پودمان:Citation/CS1/fa/styles.css محتوایی ندارد.
- ↑ «io_uring: allow disabling rings during the creation».صفحه پودمان:Citation/CS1/fa/styles.css محتوایی ندارد.
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.