نویسنده کتابخانه استاندارد Cosmopolitan C و پلتفرم Redbean از اجرای مکانیسم جداسازی pledge() برای لینوکس خبر داد. این تعهد در ابتدا توسط پروژه OpenBSD توسعه داده شد و به شما امکان می دهد به طور انتخابی برنامه های کاربردی را از دسترسی به تماس های سیستمی استفاده نشده منع کنید (نوعی لیست سفید از تماس های سیستمی برای برنامه تشکیل شده است و تماس های دیگر ممنوع هستند). برخلاف مکانیسمهای کنترل دسترسی syscall موجود در لینوکس، مانند seccomp، مکانیسم تعهد از ابتدا به گونهای طراحی شده است که تا حد امکان استفاده از آن آسان باشد.
ابتکار شکست خورده برای جداسازی برنامهها در محیط پایه OpenBSD با استفاده از مکانیسم systrace نشان داد که جداسازی در سطح تماسهای سیستمی فردی بسیار پیچیده و زمانبر است. به عنوان جایگزین، تعهدی پیشنهاد شد که اجازه ایجاد قوانین جداسازی را بدون ورود به جزئیات و دستکاری کلاس های دسترسی آماده می داد. به عنوان مثال، کلاس های ارائه شده عبارتند از stdio (ورودی / خروجی)، rpath (فقط خواندن فایل ها)، wpath (نوشتن فایل ها)، cpath (ایجاد فایل ها)، tmppath (کار با فایل های موقت)، inet (سوکت های شبکه)، یونیکس (یونیکس). سوکت ها)، dns (رزولوشن DNS)، getpw (دسترسی خواندن به پایگاه داده کاربر)، ioctl (تماس با ioctl)، proc (کنترل فرآیند)، exec (شروع فرآیندها) و id (کنترل مجوز).
قوانین کار با فراخوانی های سیستمی به شکل حاشیه نویسی مشخص می شود که شامل لیستی از کلاس های تماس سیستمی مجاز و آرایه ای از مسیرهای فایل است که در آن دسترسی مجاز است. پس از ساخت و اجرای برنامه اصلاح شده، هسته وظیفه نظارت بر رعایت قوانین مشخص شده را بر عهده می گیرد.
به طور جداگانه، پیاده سازی تعهد برای FreeBSD در حال توسعه است که با توانایی جداسازی برنامه ها بدون ایجاد تغییر در کد آنها متمایز می شود، در حالی که در OpenBSD تماس تعهد با هدف یکپارچگی دقیق با محیط پایه و اضافه کردن حاشیه نویسی به کد هر کدام است. کاربرد.
توسعه دهندگان پورت تعهد لینوکس از FreeBSD را مثال زدند و به جای ایجاد تغییرات در کد، یک ابزار افزودنی pledge.com را تهیه کردند که به شما امکان می دهد بدون تغییر کد برنامه، محدودیت هایی اعمال کنید. به عنوان مثال، برای اجرای ابزار curl با دسترسی فقط به کلاسهای فراخوانی سیستم stdio، rpath، inet و threadstdio، فقط "./pledge.com -p 'stdio rpath inet thread' curl http://example.com" را اجرا کنید. .
ابزار تعهد بر روی تمام توزیعهای لینوکس از RHEL6 کار میکند و نیازی به دسترسی روت ندارد. علاوه بر این، بر اساس کتابخانه جهان وطنی، یک API برای مدیریت محدودیتها در کد برنامهها به زبان C ارائه شده است که از جمله موارد دیگر، امکان ایجاد محصورهایی را برای محدود کردن انتخابی دسترسی در رابطه با عملکردهای برنامه خاص فراهم میکند.
پیاده سازی نیازی به تغییرات در هسته ندارد - محدودیت های تعهد به قوانین SECCOMP BPF ترجمه شده و با استفاده از مکانیزم جداسازی فراخوانی سیستم لینوکس بومی پردازش می شوند. برای مثال، فراخوانی pledge("stdio rpath", 0) به یک فیلتر BPF static const struct sock_filter kFilter[] = { /* L0*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K، syscall، 0، 14 - 1) تبدیل می شود. , / * L1*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS، OFF(args[0]))، /* L2*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K، 2، 4 - 3، 0)، /* L3*/ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K، 10، 0، 13 - 4)، /* L4*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS، OFF(args[1]))، /* L5*/ BPF_STMT | BPF_K، ~0x80800)، /* L6*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K، 1، 8 - 7، 0)، /* L7*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_2، 0، -13، ) /* L8*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS، OFF(args[8]))، /* L2*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K، 9، 0 - 12، 10)، /*L0*P (bpf_jmp | bpf_jeq | bpf_k ، 10 ، 6 - 12 ، 11) ، /*l0* / bpf_jump (bpf_jmp | bpf_jeq | bpf_k ، 11 ، 17 ، 0 - 13) ، /*l11* / bpf_stmt (bpf_ret | bpf_ret )، /*L12*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS، OFF(nr))، /*L13*/ /* فیلتر بعدی */ };
منبع: opennet.ru