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

NixOS چگونه با کدنویسی بیانیه‌های VEX سیل CVEها را مهار می‌کند؟

·۲۰ مهر ۱۴۰۵۶ دقیقه مطالعه
لوگوی VEX روی پس‌زمینه‌ای از نماد NixOS، نماد هم‌افزایی ابزار تحلیل باینری در اکوسیستم NixOS.
لوگوی VEX روی پس‌زمینه‌ای از نماد NixOS، نماد هم‌افزایی ابزار تحلیل باینری در اکوسیستم NixOS.
اشتراک‌گذاری
واقعاً چه چیز جدید است؟

تبدیل بیانیه‌های VEX از اسناد متنی ایستا به توابع پویا در NixOS؛ به گونه‌ای که وضعیت آسیب‌پذیری یک CVE مستقیماً و به‌طور خودکار از روی پیکربندی واقعی سیستم استخراج می‌شود.

تصور کنید هر روز با صدها هشدار امنیتی مواجه شوید که نیمی از آن‌ها اصلاً در سیستم شما فعال نیستند. این کابوسِ روزمره برای تیم‌های امنیت و SREهاست که در سیل گزارش‌های آسیب‌پذیری غرق شده‌اند.

به نقل از فابیان کامِل (Fabian Kammel)، فرآیند فعلی شناسایی و اولویت‌بندی (Triage) آسیب‌پذیری‌ها به‌شدت ناکارآمد است؛ زیرا بر اساس اسکن‌های ایستا از لیست مواد نرم‌افزاری (SBOM) — شبیه به فهرست مواد تشکیل‌دهنده روی بسته‌بندی غذا که لزوماً نمی‌گوید کدام ماده در لحظه اثر می‌کند — انجام می‌شود. این یعنی حتی اگر کدی آسیب‌پذیر باشد اما هرگز در زمان اجرا فراخوانی نشود، باز هم هشدار صادر می‌شود. این شکست سیستماتیک باعث شده تا تیم‌های امنیتی در سیل گزارش‌های آسیب‌پذیری تولید شده توسط LLMها غرق شوند؛ گزارش‌هایی که اغلب فاقد قابلیت بهره‌برداری (Exploitability) در دنیای واقعی هستند.

این مشکل برای مدیران سیستم (SysAdmins)، مهندسان قابلیت اطمینان سایت (SREs) و تیم‌های AppSec به نقطه بحرانی رسیده است، چرا که آن‌ها مجبورند هر روز تک‌تک CVEهای جدیدی که ظاهر می‌شوند را به‌صورت دستی ارزیابی کنند. طبق گزارش‌های فنی، اکثر سازمان‌ها از یک خط لوله ساده استفاده می‌کنند: ابتدا یک SBOM تولید می‌کنند، آن را با ابزارهایی مثل Grype اسکن می‌کنند و سپس ساعت‌ها وقت صرف می‌کنند تا بفهمند آیا یک هشدار با شدت «بالا» (High) واقعاً در محیط خاص آن‌ها خطرناک است یا خیر. این فشار روانی و کاری حتی متصوب‌کنندگان پروژه‌های متن‌باز را نیز درگیر کرده است؛ بسیاری از آن‌ها سرعت توسعه ویژگی‌های جدید را کاهش داده‌اند تا صرفاً بر روی شناسایی و اولویت‌بندی آسیب‌پذیری‌ها تمرکز کنند.

برای حل این معضل، صنعت به سمت تبادل قابلیت بهره‌برداری از آسیب‌پذیری (VEX - Vulnerability Exploitability eXchange) حرکت کرده است. یک سند VEX در واقع یک اطلاعیه امنیتی ماشین‌خوان است که صراحتاً به کاربر می‌گوید آیا یک محصول نرم‌افزاری خاص واقعاً در برابر یک آسیب‌پذیری شناخته‌شده در معرض خطر است یا خیر. اما چالش اصلی این است: آیا می‌توان این بیانیه‌ها را به‌صورت خودکار تولید کرد تا از یک فرآیند شناسایی مقیاس‌پذیر پشتیبانی شود؟

برای درک بهتر، یک برنامه Go را در نظر بگیرید که از کتابخانه golang.org/x/text نسخه ۰.۳۸.۰ استفاده می‌کند. یک اسکن استاندارد با استفاده از Syft برای تولید SBOM در قالب JSON (استاندارد CycloneDX) و سپس اسکن آن با Grype، دو آسیب‌پذیری با شدت بالا را گزارش می‌دهد: مورد GO-2026-5970 با امتیاز EPSS 0.5% و مورد GO-2026-6629 با امتیاز EPSS 0.3%. اما یک تحلیل دسترسی (Reachability Analysis) فاش می‌کند که آسیب‌پذیری اول فقط در بسته golang.org/x/text/unicode/norm و آسیب‌پذیری دوم فقط در بسته golang.org/x/text/secure/precis وجود دارد. از آنجایی که برنامه شما اصلاً از این بسته‌ها استفاده نمی‌کند، در عمل آسیب‌پذیر نیست.

در حالی که ابزارهایی مثل govulncheck این کار را برای زبان Go خودکار می‌کنند — از طریق تحلیل ایستا و استفاده از پایگاه داده آسیب‌پذیری‌های Go برای بررسی مسیرهای Import و نمادهای (Symbols) متأثر — اما این فرآیند وقتی در سطح کل سیستم‌عامل اعمال شود، به‌طور کامل شکست می‌خورد.

شکست شناسایی در سطح سیستم‌عامل

وقتی یک کانتینر داکر مبتنی بر دبیان (به‌طور خاص نسخه debian:trixie) اسکن می‌شود، یک اسکن واحد می‌تواند صدها مورد تطابق برگرداند. بر اساس مستندات کامِل در ۱۱ اکتبر ۲۰۲۶، اسکن یک سرور OpenSSH منجر به شناسایی ۲۸۴ مورد آسیب‌پذیری شد. تفکیک این موارد بر اساس شدت به این صورت بود: ۳ مورد بحرانی (Critical)، ۶۵ مورد بالا (High)، ۸۰ مورد متوسط (Medium)، ۳۹ مورد پایین (Low) و ۹۷ مورد ناچیز (Negligible). نکته قابل توجه این بود که هر ۲۸۴ مورد در وضعیت «اصلاح‌نشده» (not-fixed) لیست شده بودند.

به‌عنوان مثال، آسیب‌پذیری CVE-2007-2768 از سال ۲۰۰۷ در منبع اصلی (Upstream) اصلاح نشده است. این آسیب‌پذیری به مهاجم اجازه می‌دهد اگر sshd از رمزهای یک‌بار مصرف OPIE از طریق PAM استفاده کند، متوجه شود که آیا یک نام کاربری در سیستم وجود دارد یا خیر. برای اینکه یک مهندس بفهمد آیا این مورد واقعاً یک ریسک است، باید یک ممیزی دستی دقیق انجام دهد:

  • بررسی تنظیمات SSHD: اجرای دستور sshd -T برای تایید اینکه usepam روی yes است، اما kbdinteractiveauthentication روی no تنظیم شده باشد (زیرا این تنها راهی است که sshd درخواست را به PAM می‌سپارد).
  • بازرسی قوانین PAM: جست‌وجو (Grep) در فایل‌های /etc/pam.d/sshd و /etc/pam.d/common-auth برای اطمینان از اینکه هیچ ماژول opie پیکربندی نشده است.
  • تایید باینری‌ها: استفاده از دستورات find و dpkg -l برای تایید اینکه هیچ فایلی با الگوی pam_opie* روی سیستم وجود ندارد.

انجام این تاییدات دستی برای ۲۸۳ مورد دیگر، هر بار که یک پیکربندی تغییر می‌کند، برای یک تیم انسانی از نظر ریاضی غیرممکن است. این وضعیت منجر به ایجاد «بدهی شناسایی» (Triage Debt) می‌شود؛ جایی که وصله‌های حیاتی به دلیل دفن شدن زیر کوهی از هشدارهای بی‌ربط، نادیده گرفته می‌شوند. در حالی که این روش بر مدیریت گزارش‌ها تمرکز دارد، برخی راهکارهای پیشرفته‌تر تلاش می‌کنند حفره‌های امنیتی هسته لینوکس را بدون نیاز به بازراه‌اندازی سیستم خنثی کنند تا تداوم سرویس حفظ شود.

مکانیزم NixOS

سیستم‌عامل NixOS با تبدیل کل پیکربندی سیستم به کد، این بازی را تغییر می‌دهد. چون وضعیت سیستم در NixOS توصیفی (Declarative) است — یعنی در یک فایل پیکربندی .nix و یک Flake تعریف می‌شود — شرایط امنیتی را می‌توان مستقیماً در تعریف سیستم کدنویسی کرد.

کامِل ابزار nixos-vex را معرفی کرده است که اجازه می‌دهد بیانیه‌های VEX شرطی ایجاد کنید. در اینجا VEX دیگر یک فایل متنی ایستا نیست، بلکه تابعی از پیکربندی سیستم است. منطق این ابزار در زبان Nix نوشته شده و سیستم به‌طور پویا وضعیت یک CVE را بر اساس بیلد (Build) واقعی تعیین می‌کند:

  • حضور بسته: سیستم بررسی می‌کند آیا بسته opie در Nix store وجود دارد یا خیر (!(pkgs ? opie)).
  • پرچم‌های پیکربندی: بررسی می‌کند که آیا services.openssh.settings.KbdInteractiveAuthentication روی false تنظیم شده است.
  • تحلیل قوانین PAM: از تابع lib.any استفاده می‌کند تا تمام قوانین PAM را برای سرویس sshd اسکن کند و مطمئن شود هیچ modulePathای شامل رشته «opie» نیست.

اگر این شرایط برقرار باشد، سیستم به‌طور خودکار یک فایل VEX JSON (مطابق با استاندارد openvex.dev/ns/v0.2.0) تولید می‌کند و آن CVE را با دلیل «عدم حضور کد آسیب‌پذیر» (vulnerable_code_not_present) به عنوان not_affected علامت‌گذاری می‌کند.

اثرگذاری غیرمنطقی VEX در NixOS

یکپارچه‌سازی شناسایی خودکار

این فرآیند، خط لوله امنیتی را از یک ممیزی دستی به یک بررسی CI/CD تبدیل می‌کند. با استفاده از sbomnix برای تولید SBOM و اتصال آن به فید VEX خودکار، نویزها فوراً فیلتر می‌شوند.

در مثال OpenSSH، روند یکپارچه‌سازی به این شکل است:
۱. فایل VEX با استفاده از دستور nix build ساخته می‌شود.
۲. مسیر خروجی حاصل از طریق پرچم --vex به ابزار Grype پاس داده می‌شود.
۳. ابزار Grype به‌طور هم‌زمان SBOM و فایل VEX را پردازش می‌کند.

در این مورد خاص، تعداد آسیب‌پذیری‌ها از ۲۷۲ مورد به ۲۷۱ کاهش یافت، زیرا CVE شناسایی‌شده با موفقیت نادیده گرفته شد. هزینه بررسی مجدد آسیب‌پذیری پس از هر تغییر در پیکربندی تقریباً به صفر می‌رسد، زیرا منطق بررسی در فرآیند بیلد Nix تعبیه شده و توسط زیرساخت CI مدیریت می‌شود.

تغییر پارادایم امنیتی

این رویکرد، بار اثبات را از دوش ممیز امنیتی به پیکربندی سیستم منتقل می‌کند. وقتی یک CVE شناسایی و منطق آن کدنویسی شد، این دانش برای تمام ماشین‌هایی که از آن پیکرباری استفاده می‌کنند، برای همیشه حفظ می‌شود.

برای کل صنعت، این به معنای حرکت از «وصله زدن کورکورانه» (Blind Patching) — که در آن تیم‌ها هر کتابخانه‌ای را بدون توجه به میزان استفاده به‌روز می‌کنند — به سمت «وصله زدن مبتنی بر دسترسی» (Reachability-based Patching) است. این کار باعث کاهش زمان توقف سیستم (Downtime) و جلوگیری از بروز خطاهای رگرسیون (Regressions) ناشی از به‌روزرسانی‌های غیرضروری می‌شود. همچنین به تیم‌ها اجازه می‌دهد ابزارهایی مثل Dependabot را برای برخی اجزا خاموش کنند و تنها زمانی وصله بزنند که یک آسیب‌پذیری واقعاً قابل دسترسی باشد.

با این حال، این روش نیازمند اعتماد بالا به منطق کدنویسی شده است. کامِل اشاره می‌کند که nixos-vex هنوز نباید به عنوان یک منبع داده با اعتماد بسیار بالا (High-trust) استفاده شود، بلکه بیشتر نقش یک نقشه راه (Blueprint) برای مدیریت مقیاس‌پذیر آسیب‌پذیری‌ها در اکوسیستم Nix را دارد. هدف او به اشتراک گذاشتن این فرآیند و در نهایت کمک به ادغام این قابلیت‌ها در اکوسیستم گسترده‌تر Nix است.

برای پیاده‌سازی این رویکرد، تیم‌ها باید با شناسایی متداول‌ترین CVEهای «مثبت کاذب» در زیرساخت خود شروع کنند و سپس تلاش کنند پرچم‌های پیکربندی خاصی که این آسیب‌پذیری‌ها را بی‌اثر می‌کند، نقشه‌برداری نمایند.

گام بعدی شما

  • شناسایی متداول‌ترین CVEهای «مثبت کاذب» در زیرساخت خود را شروع کنید.
  • پرچم‌های پیکربندی خاصی که این آسیب‌پذیری‌ها را بی‌اثر می‌کند، نقشه‌برداری کنید.
  • اگر از NixOS استفاده می‌کنید، ابزار nixos-vex را برای خودکارسازی این منطق در خط لوله CI/CD تست کنید.

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

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

این متد با حذف هزاران هشدار کاذب، از فرسودگی تیم‌های امنیت جلوگیری کرده و دقت وصله‌زنی را افزایش می‌دهد. اعتبار این رویکرد از قابلیت بازتولیدپذیری (Reproducibility) در NixOS می‌آید که اجازه می‌دهد وضعیت امنیتی را به صورت ریاضی اثبات کرد.

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

این رویکرد برای تیم‌های DevOps و SRE ایرانی که با محدودیت نیروی متخصص برای ممیزی دستی CVEها روبرو هستند، راهکاری رایگان و متن‌باز برای کاهش نویزهای امنیتی است.

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

انتقال مدیریت آسیب‌پذیری از اسکن‌های ایستا به توابع پویا در پیکربندی سیستم، پایان عصر «ترس از به‌روزرسانی» است. این رویکرد نشان می‌دهد که آینده امنیت در لایه‌ی زیرساخت، نه در ابزارهای خارجی، بلکه در ادغام منطق امنیتی با تعریف خودِ سیستم (Infrastructure as Code) نهفته است.

منابع

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

گفتگو

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

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

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

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

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

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

دات‌هوش

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

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