پرش به محتوای اصلی
پرش به محتوای مقاله

Z-Jail: محیط ایزوله‌ی ۱۳۰ کیلوبایتی با دفاع هفت‌لایه برای لینوکس

·۱۰ تیر ۱۴۰۵۸ دقیقه مطالعه۲ بازدید
GitHub - Z-Jail: سندباکس سبک چندلایه لینوکس با namespace، pivot_root، seccomp-bpf، حذف قابلیت‌ها و موتور رأی مبتنی‌بر شواهد ب
GitHub - Z-Jail: سندباکس سبک چندلایه لینوکس با namespace، pivot_root، seccomp-bpf، حذف قابلیت‌ها و موتور رأی مبتنی‌بر شواهد ب
اشتراک‌گذاری
واقعاً چه چیز جدید است؟

ارائه یک سندباکس با حجم ۱۳۰ کیلوبایت که بدون هیچ وابستگی خارجی، هفت لایه دفاعی سخت‌گیرانه (از جمله pivot_root و seccomp-BPF) را پیاده‌سازی کرده است.

اگر برای اجرای کدهای ناشناس در سرورهایتان از کانتینرهای سنگین استفاده می‌کنید، احتمالاً نیمی از منابع سیستم شما صرف مدیریت لایه‌های اضافی شده است. Z-Jail این معادله را تغییر می‌دهد و امنیت سطح بالا را در حجمی کمتر از ۱۳۰ کیلوبایت جای می‌دهد.

طبق مستندات منتشرشده توسط Division-36، این ابزار اجازه می‌دهد کدهای بومی (Native) غیرقابل‌اعتماد را از طریق هفت لایه‌ی دفاعی مستقل اجرا کنید. Z-Jail به صورت یک فایل باینری PIE عرضه شده که برای حذف وابستگی‌های خارجی، تنها بر زنجیره ابزارهای استاندارد C تکیه دارد و هیچ وابستگی خارجی ندارد.

بسیاری از ابزارهای ایزوله‌سازی، توسعه‌دهنده را بین امنیت و سربار سیستم مجبور به انتخاب می‌کنند. راهکارهای سنگین‌وزنی مانند Firecracker ایزولاسیون در سطح ماشین مجازی (VM) ارائه می‌دهند اما به منابع قابل‌توجهی نیاز دارند (حجم باینری بیش از ۲۰ مگابایت). در مقابل، ابزارهای مینیمالی مثل bwrap اغلب فاقد فیلترینگ پیش‌فرض برای فراخوان‌های سیستمی (syscall filtering) هستند. gVisor یک سندباکس ارائه می‌دهد اما برای اجرا به ران‌تایم Go و باینری با حجم بیش از ۴۰ مگابایت نیاز دارد. nsjail نیز با وجود قابلیت‌های زیاد، وابستگی‌های سنگینی دارد و حجم باینری آن حدود ۱ مگابایت است.

Z-Jail به عنوان یک راهکار میانی معرفی شده است. این ابزار به‌طور خاص برای محیط‌هایی مانند خطوط لوله‌ی CI (Continuous Integration)، چالش‌های امنیتی Jail در مسابقات CTF و ارزیابی‌های سبک کد طراحی شده است؛ جایی که نیاز به «دفاع در عمق» (Defense-in-Depth) وجود دارد اما نمی‌خواهند هزینه‌ی سنگین یک ران‌تایم کامل کانتینری را بپردازند.

مقایسه با استانداردهای صنعت

برای درک جایگاه Z-Jail، مقایسه‌ی آن با ابزارهای رایج صنعت ضروری است:

  • Z-Jail: صفر وابستگی خارجی، حجم ~۱۳۰ کیلوبایت، لیست سفید seccomp، حسابرسی JSON و هش محتوا.
  • Firecracker: ایزولاسیون MicroVM، حجم ۲۰+ مگابایت، بدون لیست سفید seccomp، بدون هش محتوا.
  • gVisor: ایزولاسیون سندباکس، حجم ۴۰+ مگابایت، بدون لیست سفید seccomp، دارای حسابرسی JSON.
  • bwrap: ساخت بسیار ساده، حجم ~۷۰ کیلوبایت، بدون seccomp پیش‌فرض، بدون هش محتوا.
  • nsjail: پیچیدگی ساخت متوسط، حجم ~۱ مگابایت، seccomp اختیاری، حسابرسی جزئی.

هفت لایه‌ی دفاعی

به نقل از مستندات گیت‌هاب، Z-Jail محیط اجرا را از طریق توالی دقیقی از عملیات‌ها ایمن می‌کند. ترتیب این لایه‌ها به‌گونه‌ای است که مراحل بعدی نمی‌توانند توسط مراحل قبلی خنثی یا بازگردانی شوند:

  • محدودیت منابع: پروسه با تنظیم setrlimit شروع می‌شود تا محدودیت‌های CPU، فضای آدرس، تعداد فایل‌های باز و محدودیت‌های پروسه را پیش از هر اقدام دیگری تعیین کند. این کار از حملات بمب فورک (Fork Bomb) و اتمام حافظه (Memory Exhaustion) جلوگیری می‌کند.
  • پاک‌سازی توصیف‌گرهای فایل: تمام File Descriptorهای ارث‌بری شده (به جز لوله‌ی گزارش یا fds >= 3) بسته می‌شوند تا از نشت داده‌ها در مرز execve جلوگیری شود.
  • قفل حافظه: پرچم PR_SET_DUMPABLE=0 فعال می‌شود تا ایجاد Core Dumpها غیرفعال شده و دسترسی به /proc/self/mem قفل شود.
  • ایزولاسیون سیستم‌فایل: این ابزار از pivot_root برای جدا شدن کامل از سیستم‌فایل میزبان استفاده می‌کند. پروسه ابتدا دایرکتوری ریشه را روی خودش Bind-mount می‌کند (MS_BIND|MS_REC)، سپس درخت مونت را از طریق pivot_root(new_root, put_old) جابجا می‌کند، با دستور chdir("/") به ریشه جدید می‌رود و در نهایت ریشه قدیمی را به صورت Lazy با دستور umount2("/.pivot_old", MNT_DETACH) جدا می‌کند. این روش اکیداً قدرتمندتر از chroot استاندارد است، زیرا هیچ راهی برای فرار پروسه سندباکس شده به ریشه میزبان وجود ندارد، حتی اگر از داخل سندباکس از CLONE_NEWNS استفاده شود (که البته توسط seccomp مسدود شده است).
  • محدودیت امتیازات: پرچم PR_SET_NO_NEW_PRIVS تضمین می‌کند که نه پروسه فعلی و نه فرزندانش نتوانند از طریق باینری‌های setuid، قابلیت‌های فایل (File Capabilities) یا انتقال‌های LSM امتیازات جدید کسب کنند. این عملیات غیرقابل بازگشت است.
  • حذف قابلیت‌ها (Capabilities): تمام قابلیت‌های لینوکس از طریق capset(hdr, data) (که در آن داده‌ها {0, 0, 0} هستند) صفر می‌شوند. پروسه پیش از capset شناسه‌های setuid/setgid را رها می‌کند تا تغییر UID در حالی که CAP_SETUID هنوز فعال است، اعمال شود. در نهایت، securebits از طریق prctl (شامل SECBIT_KEEP_CAPS_LOCKED و SECBIT_NO_SETUID_FIXUP) قفل می‌شوند تا هرگونه فعال‌سازی مجدد غیرممکن شود.
  • فیلترینگ فراخوان‌های سیستمی: یک لیست سفید seccomp-BPF پروسه را تنها به ۱۵ فراخوان مجاز محدود می‌کند. هرگونه تلاش برای فراخوانی توابع ممنوعه، منجر به مرگ فوری پروسه از طریق SECCOMP_RET_KILL می‌شود.

پیاده‌سازی فضای نام (Namespace)

Z-Jail برای تضمین ایزولاسیون کامل، از پنج فضای نام (Namespace) خاص استفاده می‌کند که از طریق clone() ایجاد می‌شوند. این عملیات نیازمند دسترسی CAP_SYS_ADMIN در فضای نام اولیه است:

  • Mount (CLONE_NEWNS): فراهم کردن یک درخت سیستم‌فایل ایزوله.
  • PID (CLONE_NEWPID): ایجاد فضای شناسه‌ی پروسه مجزا که در آن فرزند به PID 1 تبدیل می‌شود.
  • Net (CLONE_NEWNET): تضمین اینکه هیچ رابط شبکه‌ای در دسترس نباشد.
  • IPC (CLONE_NEWIPC): جلوگیری از دسترسی به حافظه مشترک یا سمافورها.
  • UTS (CLONE_NEWUTS): فراهم کردن یک نام میزبان (Hostname) مجزا.

جزئیات لیست سفید seccomp

فیلتر seccomp-BPF به‌صورت پویا تولید می‌شود و برای هر ورودی یک زنجیره پرش (jump chain) ایجاد می‌کند. این فیلتر ابتدا تایید می‌کند که معماری سیستم AUDIT_ARCH_X86_64 باشد. ۱۵ فراخوان مجاز عبارت‌اند از:

  • ورودی/خروجی پایه: read (0), write (1), close (3), lseek (8).
  • حافظه: brk (12), munmap (11) و mmap (9). فراخوان mmap به شدت محدود شده است: پرچم‌ها باید دقیقاً 0x22 (MAP_PRIVATE|MAP_ANONYMOUS) باشند و استفاده از MAP_SHARED (flags & 4) اکیداً ممنوع است.
  • کنترل پروسه: execve (59) برای شروع اولیه و exit_group (231) برای خروج تمیز.
  • سیستمی/زمان‌بندی: rt_sigaction (13), rt_sigprocmask (14), getrandom (318), clock_gettime (228) و fstat (5).

این فیلتر به‌طور مستقل توسط یک تست مجزا (tests/seccomp_filter_test.c) تایید شده است که ۸ مورد از ۸ سناریوی تست را با استفاده از prctl(PR_SET_SECCOMP) و بدون نیاز به دسترسی root با موفقیت پاس می‌کند.

موتور حکم و حسابرسی

علاوه بر ایزولاسیون، Z-Jail شامل موتور حکم Truthimatics Public Version است که یک موتور مبتنی بر شواهد است. این سیستم مشاهدات وزنی را درباره باینری اجرا شده جمع‌آوری می‌کند تا تعیین کند نتیجه DETERMINISTIC (قطعی)، REJECT (رد شده) یا UNCERTAIN (نامشخص) است. اگر هر یک از مشاهدات وزنی بیش از ۵۰٪ از کل وزن را داشته باشد، حکم نهایی بر اساس آن صادر می‌شود.

هر اجرا یک رکورد حسابرسی JSON مفصل تولید می‌کند که در مسیر build/audits/<binary-name>.audit.json ذخیره می‌شود. این رکورد شامل موارد زیر است:

  • متادیتا: نسخه طرحواره (z-jail.audit/v1)، شناسه ساخت (Z-Jail/v1+dev) و برچسب زمانی.
  • داده‌های اجرا: مدت زمان اجرا به نانوثانیه، کد خروج و مسیر فایل اجرایی.
  • وضعیت سندباکس: تایید فعال بودن no_new_privs و capabilities_dropped ، مسیر pivot_root و لیست پنج فضای نام استفاده شده (mount, pid, net, ipc, uts).
  • یکپارچگی: اثر انگشت محتوایی BLAKE2b-256 از باینری هدف که توسط پروسه والد پس از پایان کار فرزند محاسبه می‌شود.

مشخصات فنی و عملکرد

بر اساس تست‌های انجام شده روی WSL2 (کالی لینوکس، GCC 15.2.0، با بهینه‌سازی -O2 -g)، Z-Jail کارایی فوق‌العاده‌ای دارد. تأخیر میانگین سندباکس حدود ۸ میلی‌ثانیه و حداکثر مصرف حافظه (RSS) حدود ۴ مگابایت است. منطق اصلی این ابزار تنها در حدود ۹۰۰ خط کد گنجانده شده است.

تفکیک تقریبی تأخیر:

  • clone و فضای نام‌ها: ~۳ میلی‌ثانیه
  • pivot_root: ~۲ میلی‌ثانیه
  • seccomp و قابلیت‌ها: ~۱ میلی‌ثانیه
  • execve: ~۱ میلی‌ثانیه
  • waitpid و حسابرسی: ~۱ میلی‌ثانیه

این ابزار به صورت یک Position Independent Executable (PIE) و با استفاده از -fstack-protector-strong ، -D_FORTIFY_SOURCE=2 ، RELRO کامل و -z now ساخته شده است. برای پشتیبانی از فضای نام‌ها و ویژگی‌های seccomp-BPF، به هسته لینوکس نسخه ۵.۴ یا بالاتر نیاز دارد و با نسخه‌های GCC 11.4، 13.2 و 15.2 سازگار است.

مدل تهدید و محدوده حفاظتی

Z-Jail برای متوقف کردن کدهای بومی طراحی شده که سعی دارند از طریق chroot، mount، ptrace یا فراخوان‌های socket از محیط فرار کنند. همچنین با استفاده از RLIMIT_NPROC جلوی بمب‌های فورک و با RLIMIT_AS جلوی اتمام حافظه را می‌گیرد.

حفاظت‌های فعال (In-Scope):

  • فرار از طریق ptrace ، socket یا process_vm_writev.
  • نشت توصیف‌گرهای فایل در مرز execve.
  • ارتقای امتیازات از طریق setuid ، لینکرهای دینامیک یا LD_PRELOAD.
  • حذف فیلتر seccomp یا فعال‌سازی مجدد قابلیت‌ها.

خارج از محدوده (Out-of-Scope):

  • آسیب‌پذیری‌های Zero-day در هسته لینوکس که خارج از سطح ۱۵ فراخوان مجاز باشند.
  • کانال‌های جانبی سخت‌افزاری (مانند Spectre و Meltdown).
  • فرار از VMهای هم‌جوار از طریق مونت‌های مشترک /proc یا /sys.
  • ایجاد کمبود منابع برای سندباکس‌های هم‌سایه (که نیازمند پشتیبانی cgroup است).

نحوه استفاده و پیاده‌سازی

Z-Jail از طریق یک CLI مدیریت می‌شود که به یک دایرکتوری --root حاوی یک سیستم‌فایل مینیمال نیاز دارد. برای باینری‌های استاتیک، تنها حضور خود باینری در این دایرکتوری کافی است. پرچم‌های کلیدی شامل --seccomp-enforce برای فعال‌سازی لیست سفید و --self-hash=<hex> برای تایید هش BLAKE2b-256 باینری پیش از اجرا است.

کدهای خروج داده‌های دقیقی ارائه می‌دهند:

  • ۰: خروج عادی (DETERMINISTIC).
  • ۱: کشته شدن توسط سیگنال (REJECT).
  • ۲/۳: خطاهای مربوط به self-hash (فرمت اشتباه یا عدم تطابق).
  • ۱۰۱-۱۰۵: شکست در مراحل راه‌اندازی (به ترتیب: rlimit, seccomp, execve, pivot_root, یا capabilities).
  • ۱۲۵: شکست در ایجاد فضای نام (Namespace).

تحلیل: تغییر خط پایه سندباکس‌ها

برای جامعه برنامه‌نویسی سیستم‌ها، Z-Jail این فرض را تغییر می‌دهد که ایزولاسیون با امنیت بالا لزوماً نیازمند یک ران‌تایم سنگین است. با ترکیب pivot_root و یک لیست سفید سخت‌گیرانه ۱۵ فراخوانی، این ابزار ثابت می‌کند که یک باینری زیر ۲۰۰ کیلوبایت می‌تواند دفاع در عمق معناداری ارائه دهد.

این رویکرد برای توسعه‌دهندگانی که سیستم‌های تصحیح خودکار کد می‌سازند یا پژوهشگران امنیتی که نیاز به اجرای Payloadهای ناشناس دارند، بسیار مفید است. Z-Jail مسیر را از ایزولاسیون «همه یا هیچ» (ماشین مجازی در مقابل پروسه) به سمت یک رویکرد لایه‌بندی شده و دانه‌بندی شده می‌برد که به اندازه کافی سریع است تا در تریگرهای با فرکانس بالای CI استفاده شود.

گام‌های بعدی

کاربران می‌توانند با کلون کردن مخزن و اجرای مجموعه تست ۱۷ سناریویی، پیاده‌سازی را بررسی کنند. این مجموعه همه چیز را پوشش می‌دهد؛ از blake2b_regress و منطق seccomp_filter گرفته تا مسدود کردن mmap با PROT_EXEC یا MAP_SHARED و جلوگیری از فرارهای chroot. سناریوهای خاص عبارت‌اند از:

  • سناریو ۶ و ۸: مسدود کردن MAP_SHARED و PROT_EXEC در mmap.
  • سناریو ۱۰ تا ۱۴: مسدود کردن فراخوان‌های ptrace ، socket ، chroot و mount.
  • سناریو ۱۵: تست RLIMIT_NPROC در برابر بمب‌های فورک.

در نقشه راه نسخه ۲ (v2)، موارد زیر برنامه‌ریزی شده است:

  • فایل‌های پالیسی seccomp خارجی (در قالب JSON یا سورس BPF).
  • پرچم‌های فضای نام سفارشی برای هر نمونه سندباکس.
  • لیست‌های سفید فراخوان‌های سیستمی قابل تنظیم از طریق CLI.
  • قلاب‌های پروفایلینگ عملکرد برای ادغام در CI.
  • امضای نسخه‌ها با استفاده از minisign یا signify.

اما داستان سخت‌افزاری این تحول حتی شگفت‌انگیزتر است — به تحلیل ما درباره‌ی تراشه‌های Blackwell مراجعه کنید.

چرا این موضوع مهم است؟

این ابزار با کاهش شدید سربار حافظه و زمان راه‌اندازی، استقرار محیط‌های امن را برای توسعه‌دهندگان سیستم‌های توزیع‌شده تسهیل می‌کند. اعتبار این رویکرد در تکیه بر مکانیزم‌های بومی هسته لینوکس است که نیاز به لایه‌های انتزاعی سنگین را حذف می‌کند.

تأثیر برای ایران

این ابزار برای توسعه‌دهندگان ایرانی که سیستم‌های داوری کد یا پلتفرم‌های آموزشی می‌سازند، راهکاری رایگان و بسیار کم‌مصرف برای کاهش هزینه‌های سروری و افزایش امنیت است.

·نگاه ما
تحریریه دات‌هوش

Z-Jail این پیش‌فرض را که ایزولاسیون امن حتماً نیازمند ران‌تایم‌های سنگین است، به چالش می‌کشد. ترکیب pivot_root با لیست سفید بسیار محدود ۱۵ فراخوانی، ثابت می‌کند که یک باینری زیر ۲۰۰ کیلوبایت می‌تواند دفاع در عمق (Defense-in-Depth) واقعی ایجاد کند. این رویکرد، مدل ایزولاسیون را از حالت «همه یا هیچ» (ماشین مجازی در برابر پروسه) به سمت یک مدل لایه‌ای و سریع می‌برد که برای تریگرهای با فرکانس بالای CI ایده‌آل است.

منابع

این گزارش با خط‌لولهٔ خودکار دات‌هوش از منابع معتبر جهانی تدوین و زیر نظر تحریریه منتشر شده است. روش کار ما

گفتگو

پنج‌شنبه‌های هوش‌محور

بسته‌ی هفتگی دات‌هوش

۵ خبر، ۲ ابزار، ۱ پرامپت در هر شماره. به‌زودی راه‌اندازی می‌شود — هر پنج‌شنبه صبح.

خبر کلیدی
ابزار کاربردی
پرامپت حرفه‌ای
تحلیل پژوهش
به‌زودی
زاویه‌ی ایرانی
به‌زودی
تمرین این هفته
به‌زودی

راهنماهای دات‌هوش

راهنماهای کاربردیِ دات‌هوش برای کار با هوش مصنوعی — از همین‌جا شروع کنید:

دات‌هوش

راهنمای فارسی هوش مصنوعی — با نگاه به ایران

اخبار روزانه، معرفی ابزارها و مدل‌ها، و آموزشِ کار با هوش مصنوعی؛ همیشه با این پرسش که از ایران چه چیزی کار می‌کند و چه چیزی نه.