مایکروسافت پیادهسازی زیرسیستم eBPF را برای ویندوز منتشر کرده است که به شما امکان میدهد کنترلکنندههای دلخواه را در سطح هسته سیستمعامل اجرا کنید. eBPF یک مفسر بایت کد تعبیه شده در هسته را فراهم می کند که امکان ایجاد کنترل کننده های عملیات شبکه بارگیری شده از فضای کاربر، کنترل دسترسی و نظارت بر عملکرد سیستم ها را فراهم می کند. eBPF از زمان انتشار 3.18 در هسته لینوکس گنجانده شده است و به شما امکان می دهد بسته های شبکه ورودی/خروجی، ارسال بسته، مدیریت پهنای باند، رهگیری تماس های سیستم، کنترل دسترسی و ردیابی را مدیریت کنید. به لطف استفاده از کامپایل JIT، بایت کد به سرعت به دستورالعمل های ماشین ترجمه شده و با عملکرد کد کامپایل شده اجرا می شود. eBPF برای ویندوز تحت مجوز MIT منبع باز است.
eBPF برای ویندوز را می توان با ابزارهای موجود eBPF استفاده کرد و یک API عمومی برای برنامه های eBPF در لینوکس ارائه می دهد. در میان چیزهای دیگر، این پروژه به شما امکان می دهد کدهای نوشته شده به زبان C را در بایت کد eBPF با استفاده از کامپایلر استاندارد eBPF مبتنی بر Clang کامپایل کنید و کنترل کننده های eBPF را که قبلاً برای لینوکس ایجاد شده اند در بالای هسته ویندوز اجرا کنید، یک لایه سازگاری ویژه ارائه می دهد و از استاندارد Libbpf پشتیبانی می کند. API برای سازگاری با برنامه هایی که با برنامه های eBPF تعامل دارند. این شامل لایههایی است که قلابهای لینوکس مانند برای XDP (مسیر داده eXpress) و اتصال سوکت، دسترسی انتزاعی به پشته شبکه و درایورهای شبکه ویندوز را فراهم میکنند. برنامه ها شامل ارائه سازگاری کامل در سطح کد منبع با پردازنده های استاندارد eBPF لینوکس است.
تفاوت اصلی بین اجرای eBPF برای ویندوز، استفاده از یک تأییدکننده بایت کد جایگزین است که در اصل توسط کارمندان و محققان VMware از دانشگاه های کانادا و اسرائیل پیشنهاد شده است. تایید کننده در یک فرآیند مجزا و مجزا در فضای کاربر اجرا می شود و قبل از اجرای برنامه های BPF برای شناسایی خطاها و مسدود کردن فعالیت های مخرب احتمالی استفاده می شود.
برای تأیید، eBPF برای ویندوز از یک روش تجزیه و تحلیل استاتیک مبتنی بر تفسیر انتزاعی استفاده می کند، که در مقایسه با تأییدکننده eBPF برای لینوکس، نرخ مثبت کاذب کمتری را نشان می دهد، از تحلیل حلقه پشتیبانی می کند و مقیاس پذیری خوبی را ارائه می دهد. این روش بسیاری از الگوهای اجرای معمولی به دست آمده از تجزیه و تحلیل برنامه های eBPF موجود را در نظر می گیرد.
پس از تأیید، بایت کد به یک مفسر در حال اجرا در سطح هسته منتقل می شود، یا از طریق یک کامپایلر JIT منتقل می شود و سپس کد ماشین حاصل با حقوق هسته اجرا می شود. برای جداسازی کنترلکنندههای eBPF در سطح هسته، از مکانیسم HVCI (HyperVisor-enforced Code Integrity) استفاده میشود که از ابزار مجازیسازی برای محافظت از فرآیندهای موجود در هسته استفاده میکند و با استفاده از یک امضای دیجیتال، یکپارچگی کد اجرا را تأیید میکند. محدودیت HVCI این است که فقط میتواند برنامههای eBPF تفسیر شده را تأیید کند و نمیتواند همراه با JIT مورد استفاده قرار گیرد (شما یک انتخاب از بین عملکرد یا امنیت اضافی دارید).
منبع: opennet.ru