ارتقاء امنیت برنامههای داتنت از طریق بازرسی بستهها (Package Audits)
نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۲/۰۶ ۰۷:۲۷
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
dotnet list package --vulnerable، به توسعهدهندگان امکان میدهند تا بستههای آسیبپذیر را شناسایی کنند. این دستور از پایگاه داده مشاوره امنیتی گیتهاب (GitHub Advisory Database) استفاده میکند که اطلاعات بهروز و معتبری درباره آسیبپذیریهای شناختهشده ارائه میدهد. با این حال، شناسایی این آسیبپذیریها تنها قدم اول است؛ توسعهدهندگان باید بتوانند این فرآیند را در چرخه توسعه خود ادغام کنند تا از امنیت مداوم برنامه اطمینان حاصل کنند.dotnet list package --vulnerabledotnet list package --vulnerable است که از نسخه ۵.۰.۲۰۰ به بعد SDK داتنت در دسترس است. این دستور بستههای پروژه را اسکن کرده و هرگونه آسیبپذیری شناختهشده را گزارش میدهد. برای اطمینان از بررسی کامل، استفاده از پارامتر --include-transitive ضروری است، زیرا این پارامتر وابستگیهای غیرمستقیم را نیز در نظر میگیرد.Newtonsoft.Json وابسته است. اجرای دستور زیر در مسیر پروژه یا راهحل (Solution) انجام میشود:dotnet list package --vulnerable --include-transitive
Project `MyProject` has the following vulnerable packages [net8.0]: Transitive Package Resolved Severity Advisory URL System.Text.Json 8.0.0 High https://github.com/advisories/GHSA-1234
System.Text.Json دارای آسیبپذیری با شدت بالا (High Severity) است و لینک مشاوره امنیتی مربوطه را ارائه میدهد. توسعهدهندگان میتوانند با مراجعه به این لینک، جزئیات بیشتری درباره آسیبپذیری و راهحلهای پیشنهادی دریافت کنند.dotnet list package --vulnerable را بررسی کرده و در صورت وجود آسیبپذیری، فرآیند ساخت (Build) را متوقف میکند.#!/bin/bash
dotnet list package --vulnerable --include-transitive > vuln.txt
if grep -q "has the following vulnerable packages" vuln.txt; then
echo "Vulnerable packages found. Build failed."
cat vuln.txt
exit 1
else
echo "No vulnerable packages found."
exit 0
fi.csproj به عنوان منبع اصلی برای تمام مراجع بسته (Package references) عمل میکند. وجود حتی یک بسته آسیبپذیر در این فایل، به طور مستقیم یا غیرمستقیم، میتواند کل برنامه کاربردی را به خطر بیندازد.NuGetAudit را به عنوان یک پراپرتی اماسبیلد (MSBuild property) معرفی کرده است که تشخیص آسیبپذیری را در زمان بازیابی (Restore) یا ساخت (Build) بهبود میبخشد. هنگامی که NuGetAudit روی مقدار true تنظیم شود، نیوگت یک بازرسی از وابستگیهای نیوگت پروژه انجام داده و هشدارهایی را برای هرگونه آسیبپذیری شناسایی شده تولید میکند. این امکان را فراهم میسازد تا مسائل امنیتی قبل از استقرار برنامه کاربردی شناسایی و برطرف شوند. برای فعال کردن NuGetAudit، میتوان قطعه کد زیر را به فایل .csproj اضافه کرد:<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<NugetAudit>true</NugetAudit>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
<PackageReference Include="Refit" Version="7.2.1" />
</ItemGroup>
</Project>NuGetAudit فعال باشد، فرآیند ساخت برای هر بسته نیوگت با آسیبپذیری شناخته شده، هشدار تولید میکند. این هشدارها شامل اطلاعاتی درباره آسیبپذیری، مانند شدت و نسخه بسته آسیبدیده خواهد بود.NuGetAuditLevel پیکربندی کرد. این پراپرتی مقادیر زیر را میپذیرد:None: هیچ هشدار بازرسی نمایش داده نمیشود.Low: فقط هشدارهایی برای آسیبپذیریهایی با شدت پایین (Low) یا بالاتر نمایش داده میشوند. این مقدار پیشفرض است.Moderate: فقط هشدارهایی برای آسیبپذیریهایی با شدت متوسط (Moderate) یا بالاتر نمایش داده میشوند.High: فقط هشدارهایی برای آسیبپذیریهایی با شدت بالا (High) یا بحرانی (Critical) نمایش داده میشوند.Critical: فقط هشدارهایی برای آسیبپذیریهایی با شدت بحرانی (Critical) نمایش داده میشوند.NuGetAuditLevel را به صورت زیر در فایل .csproj تنظیم کرد:<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<NugetAudit>true</NugetAudit>
<NugetAuditLevel>critical</NugetAuditLevel>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
<PackageReference Include="Refit" Version="7.2.1" />
</ItemGroup>
</Project>WarningsAsErrors میتواند با تبدیل هشدارهای مشخص شده به خطا، منجر به شکست ساخت شود. جدول زیر کدهای هشداری مرتبط را نشان میدهد:| کد هشدار (Warning Code) | دلیل (Reason) |
| NU1900 | خطا در ارتباط با منبع بسته در هنگام دریافت اطلاعات آسیبپذیری. |
| NU1901 | بسته با شدت پایین آسیبپذیری. |
| NU1902 | بسته با شدت متوسط آسیبپذیری. |
| NU1903 | بسته با شدت بالا آسیبپذیری. |
| NU1904 | بسته با شدت بحرانی آسیبپذیری. |
| NU1905 | یک منبع بازرسی پایگاه داده آسیبپذیری ارائه نمیدهد. |
WarningsAsErrors را به صورت زیر در فایل .csproj تنظیم کرد:<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<NugetAudit>true</NugetAudit>
<NugetAuditLevel>critical</NugetAuditLevel>
<WarningsAsErrors>NU1904;</WarningsAsErrors>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
<PackageReference Include="Refit" Version="7.2.1" />
</ItemGroup>
</Project>NuGetAuditSuppress، هشدارهای خاصی را نادیده بگیرند، که این امکان انعطافپذیری بیشتری در مدیریت آسیبپذیریها فراهم میکند.Newtonsoft.Json به نسخهای که آسیبپذیری را برطرف کرده، میتواند خطر را کاهش دهد.--include-transitive استفاده کنید.dotnet list package --vulnerable و قابلیتهای جدید مانند NuGet Audit، فرآیند شناسایی آسیبپذیریها را سادهتر کردهاند. با این حال، ادغام این ابزارها در خط لولههای CI/CD و استفاده از رویکردهای مکمل مانند ابزارهای شخص ثالث، میتواند امنیت پروژهها را به سطح بالاتری برساند.