عنوان:

‫بهبود امنیت در استفاده از بسته‌های NuGet در .NET 10


نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۹/۱۵ ۰۹:۳۸
آدرس: www.dntips.ir
با انتشار .NET 10، نه تنها شاهد نسخه‌های جدیدی از SDK (کیت توسعه نرم‌افزار) و runtime (زمان اجرا) هستیم، بلکه NuGet نیز با تغییرات قابل توجهی همراه شده‌است. مایکروسافت در این نسخه، تمرکز ویژه‌ای روی تقویت قابلیت‌های امنیتی NuGet گذاشته تا کمک کند برنامه‌های امن‌تری بسازیم. این بهبودها شامل تشخیص بهتر آسیب‌پذیری‌ها، مدیریت خودکار بسته‌ها و ابزارهای پیشرفته‌تر برای مدیریت درخت وابستگی‌ها می‌شود. در دنیای امروز که زنجیره تأمین نرم‌افزار (software supply chain) پر از تهدیدات است، این تغییرات می‌توانند نقش کلیدی در حفاظت از پروژه‌های شما ایفا کنند.

توضیح ویژگی‌های امنیتی جدید
یکی از مهم‌ترین تغییرات در NuGet نسخه جدید، تمرکز روی بررسی وابستگی‌های غیرمستقیم (transitive dependencies) است. در گذشته، بسیاری از آسیب‌پذیری‌ها در وابستگی‌های غیرمستقیم پنهان می‌ماندند، زیرا بررسی پیش‌فرض تنها به وابستگی‌های مستقیم محدود بود. اما حالا در پروژه‌هایی که هدف‌شان .NET 10 یا بالاتر است، ویژگی NuGet Audit به طور پیش‌فرض روی حالت "all" تنظیم شده. این یعنی NuGet نه تنها بسته‌های مستقیم شما را اسکن می‌کند، بلکه تمام وابستگی‌های غیرمستقیم را نیز برای آسیب‌پذیری‌های شناخته‌شده بررسی می‌نماید.
چرا این مهم است؟ در یک پروژه معمولی دات‌نت با حدود ۵۰ وابستگی کلی، ممکن است فقط ۶ تا ۱۰ مورد مستقیم باشند و بقیه (۲۰ تا ۷۰ مورد) غیرمستقیم. آمار نشان می‌دهد که بیشتر آسیب‌پذیری‌ها در همین لایه‌های پنهان رخ می‌دهند. برای مثال، اگر یک بسته مستقیم شما به یک کتابخانه قدیمی وابسته باشد، بدون بررسی غیرمستقیم، ممکن است CVE (آسیب‌پذیری‌های رایج و افشا شده) یا GHSA (مشاوره‌های امنیتی گیتهاب) را از دست بدهید.
این بررسی طی فرآیند dotnet restore انجام می‌شود. NuGet تمام بسته‌ها را با پایگاه داده GitHub Advisory Database مقایسه می‌کند. اگر آسیب‌پذیری پیدا شود، هشدارهایی مانند این دریافت خواهید کرد:
warning NU1902: Package 'Example.Package' 5.0.0 has a known moderate severity vulnerability, https://github.com/advisories/GHSA-xxxx-xxxx-xxxx
این هشدارها به شما کمک می‌کنند تا سریع واکنش نشان دهید. این ویژگی بخشی از رویکرد "shift left" در امنیت است، یعنی تشخیص مشکلات در مراحل اولیه توسعه، که می‌تواند هزینه‌های بعدی را کاهش دهد. همچنین، اگر پروژه شما از CI/CD (یکپارچه‌سازی مداوم و استقرار مداوم) استفاده می‌کند، می‌توانید این هشدارها را به عنوان شکست تنظیم کنید تا تیم مجبور به رفع آن‌ها شود.

پیکربندی رفتار بررسی
اگر نیاز به تنظیم این رفتار دارید، می‌توانید آن را در فایل پروژه یا یک فایل جداگانه مانند Directory.Build.props تغییر دهید. برای مثال، اگر می‌خواهید فقط وابستگی‌های مستقیم بررسی شوند:
<PropertyGroup>
  <NuGetAuditMode>direct</NuGetAuditMode>
</PropertyGroup>
یا اگر (که توصیه نمی‌شود) می‌خواهید بررسی را کاملاً غیرفعال کنید:
<PropertyGroup>
  <NuGetAudit>false</NuGetAudit>
</PropertyGroup>
و برای سرکوب یک مشاوره امنیتی خاص پس از بررسی امنیتی:
<ItemGroup>
  <NuGetAuditSuppress Include="https://github.com/advisories/GHSA-xxxx-xxxx-xxxx" />
</ItemGroup>
توجه کنید که غیرفعال کردن کامل بررسی می‌تواند ریسک‌های امنیتی ایجاد کند، پس فقط در موارد خاص و با دلیل موجه از آن استفاده کنید. همچنین، سرکوب مشاوره‌ها باید پس از ارزیابی دقیق ریسک انجام شود، نه به عنوان راه‌حل دائمی.

رفع آسیب‌پذیری‌ها
وقتی آسیب‌پذیری کشف شد، قدم‌های پیشنهادی برای رفع آن عبارتند از:
  • به‌روزرسانی بسته سطح بالا: اغلب، ارتقای وابستگی مستقیم، نسخه ثابت‌شده وابستگی غیرمستقیم را به همراه می‌آورد.
  • به‌روزرسانی بسته‌های میانی: اگر قدم اول کارساز نبود، بسته‌های در زنجیره وابستگی را ارتقا دهید.
  • ارتقا وابستگی غیرمستقیم به مستقیم: به عنوان آخرین راه، یک ارجاع مستقیم به بسته آسیب‌پذیر اضافه کنید و نسخه ثابت‌شده را مشخص کنید:
<ItemGroup>
  <PackageReference Include="VulnerablePackage" Version="2.0.0" />
</ItemGroup>
خبر خوب این است که در .NET 10، فرآیند ساده‌تر شده. با اجرای دستور dotnet package update --vulnerable, NuGet تمام بسته‌های آسیب‌پذیر را به اولین نسخه بدون آسیب‌پذیری شناخته‌شده به‌روزرسانی می‌کند. این دستور پروژه را اسکن کرده و تغییرات لازم را اعمال می‌نماید، که زمان و تلاش شما را صرفه‌جویی می‌کند.

نتیجه‌گیری
بهبودهای امنیتی NuGet در .NET 10 گام بزرگی به سمت ساخت برنامه‌های ایمن‌تر است. با بررسی خودکار وابستگی‌های غیرمستقیم، هشدارهای به‌موقع و ابزارهای رفع آسان، حالا می‌توانید با اطمینان بیشتری وابستگی‌ها را مدیریت کنید. این تغییرات نه تنها ریسک‌های امنیتی را کاهش می‌دهند، بلکه به شما کمک می‌کنند تا بهترین شیوه‌های امنیتی را در توسعه روزمره بگنجانید. توصیه می‌کنم همیشه بررسی را فعال نگه دارید و به هشدارها توجه کنید؛ امنیت زنجیره تأمین نرم‌افزار مسئولیت همه ماست.


مشاهده مطلب اصلی

نظرات

  • وحید نصیری در ۱۴۰۴/۰۹/۲۳ ۰۹:۳۲
    وابستگی‌های گذرا، که به طور غیرمستقیم از طریق پکیج‌های مستقیم وارد پروژه می‌شوند، اغلب بخش عمده‌ای از اکوسیستم یک اپلیکیشن را تشکیل می‌دهند؛ گاهی بیش از ۸۰ درصد وابستگی‌ها. با این حال، آسیب‌پذیری‌ها در این لایه‌ها می‌توانند منجر به حملات زنجیره تأمین (supply chain attacks) شوند، جایی که مهاجمان از نقاط ضعف پکیج‌های ثانویه بهره‌برداری می‌کنند. نسخه ۱۰ از .NET با معرفی قابلیت بررسی خودکار آسیب‌پذیری‌ها در وابستگی‌های گذرا، گامی مهم در جهت امنیت بیشتر برداشته است.

    توضیح مسئله: آسیب‌پذیری در وابستگی‌های غیرمستقیم
    در فرآیند به‌روزرسانی پروژه‌های .NET، ممکن است هشدارهایی مانند NU1903 ظاهر شوند که به آسیب‌پذیری‌های شناخته‌شده با شدت بالا (high severity) اشاره دارند. برای مثال:
    /build/_build.csproj : warning NU1903: Package 'Microsoft.Build' 17.12.6 has a known high severity vulnerability, https://github.com/advisories/GHSA-w3q9-fxm7-j8fq
    این هشدارها اغلب مربوط به پکیج‌هایی مانند `Microsoft.Build`، `Microsoft.Build.Tasks.Core` و `Microsoft.Build.Utilities.Core` هستند. بررسی فایل پروژه (.csproj) نشان می‌دهد که این پکیج‌ها مستقیماً ارجاع داده نشده‌اند:
    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net10.0</TargetFramework>
      </PropertyGroup>
      <ItemGroup>
        <PackageReference Include="App.Common" Version="9.0.4" />
      </ItemGroup>
      <ItemGroup>
        <PackageDownload Include="GitVersion.Tool" Version="[5.12.0]" />
      </ItemGroup>
    </Project>
    این مسئله ناشی از وابستگی‌های گذرا است که از طریق پکیج‌های مستقیم مانند App.Common وارد می‌شوند. در نسخه‌های پیشین .NET، این وابستگی‌ها اغلب بدون بررسی خودکار باقی می‌ماندند، که می‌توانست ریسک‌های امنیتی را افزایش دهد. مطالعات نشان می‌دهد که وابستگی‌های گذرا می‌توانند منبع اصلی آسیب‌پذیری‌ها باشند، زیرا توسعه‌دهندگان کمتر به مدیریت مستقیم آن‌ها توجه می‌کنند.

    روش‌های سنتی: بررسی دستی و ابزارهای کمکی
    پیش از .NET 10، شناسایی آسیب‌پذیری‌ها در وابستگی‌های گذرا نیازمند رویکردهای دستی بود. یکی از ابزارهای اصلی، دستور dotnet list package با گزینه‌های --vulnerable و --include-transitive بود که لیست پکیج‌ها را همراه با آسیب‌پذیری‌ها نمایش می‌دهد:
    dotnet list package --vulnerable --include-transitive
    خروجی نمونه:
    Project 'MyProject' has the following vulnerable packages
       [net10.0]:
       > Microsoft.Build  [17.12.6]: High - https://github.com/advisories/GHSA-w3q9-fxm7-j8fq
         Transitive via: App.Common -> Microsoft.Build
    پس از شناسایی، توسعه‌دهنده باید ریشه مشکل را یافته و پکیج مستقیم را به‌روزرسانی کند. ابزارهای خارجی مانند dotnet depends برای نمایش گراف وابستگی‌ها مفید بودند، اما این روش‌ها زمان‌بر و وابسته به اجرای دستورات جداگانه بودند. علاوه بر این، عدم هشدار خودکار در مراحل build یا restore، می‌توانست مشکلات را تا مراحل تست یا استقرار پنهان نگه دارد.

    روش نوین: بررسی خودکار در .NET 10
    .NET 10 با تغییر پیش‌فرض در NuGetAuditMode، بررسی آسیب‌پذیری‌ها را به وابستگی‌های گذرا گسترش داده است. این ویژگی، که بخشی از تغییرات breaking در نسخه جدید است، هشدارها را حتی برای پکیج‌های غیرمستقیم تولید می‌کند و امنیت زنجیره تأمین را تقویت می‌نماید.
    برای رفع، پکیج‌های آسیب‌پذیر را مستقیماً نصب و به‌روزرسانی کنید تا نسخه آن‌ها override شود:
    dotnet add package Microsoft.Build
    dotnet add package Microsoft.Build.Tasks.Core
    dotnet add package Microsoft.Build.Utilities.Core
    فایل .csproj پس از تغییر:
    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net10.0</TargetFramework>
      </PropertyGroup>
      <ItemGroup>
        <PackageReference Include="Microsoft.Build" Version="18.0.2" />
        <PackageReference Include="Microsoft.Build.Tasks.Core" Version="18.0.2" />
        <PackageReference Include="Microsoft.Build.Utilities.Core" Version="18.0.2" />
        <PackageReference Include="App.Common" Version="9.0.4" />
      </ItemGroup>
      <ItemGroup>
        <PackageDownload Include="GitVersion.Tool" Version="[5.12.0]" />
      </ItemGroup>
    </Project>
    این رویکرد هشدارها را حذف می‌کند. برای کنترل بیشتر، از property NuGetAuditLevel (مانند high برای آسیب‌پذیری‌های شدید) استفاده کنید. ادغام با pipelineهای CI/CD مانند GitHub Actions، بررسی خودکار را امکان‌پذیر می‌سازد و از ورود کد آسیب‌پذیر جلوگیری می‌کند.