Аудит зависимостей пакета для уязвимостей безопасности
Сведения об аудите безопасности
Аудит безопасности для диспетчеров пакетов, таких как NuGet, — это процесс, который включает в себя анализ безопасности пакетов, включенных в проект программного обеспечения. Это включает выявление уязвимостей, оценку рисков и рекомендации по улучшению безопасности. Аудит может включать проверку самих пакетов, а также любые зависимости и связанные с ними риски. Цель аудита заключается в выявлении и устранении уязвимостей безопасности, которые могут быть использованы злоумышленниками, например внедрение кода или атаки на межсайтовые сценарии.
У нас также есть запись блога, которая обсуждает наш рекомендуемый метод для принятия действий, когда пакет с известной уязвимостью используется вашим проектом, и средства для получения дополнительных сведений.
Доступность функций
NuGet | Пакет SDK для .NET | Visual Studio | Функция |
---|---|---|---|
5.9 | Пакет SDK для .NET 5 (5.0.200) | Н/П | dotnet list package --vulnerable |
6.8 | Пакет SDK для .NET 8 (8.0.100) | Visual Studio 2022 17.8 | NuGetAudit для PackageReference |
6.10 | Н/П | Visual Studio 2022 17.10 | NuGetAudit для packages.config |
6,11 | Пакет SDK для .NET 8 (8.0.400) | Visual Studio 2022 17.11 | NuGetAuditSuppress для PackageReference |
6,12 | Пакет SDK для .NET 9 (9.0.100) | Visual Studio 2022 17.12 | Источники аудита. NuGetAuditSuppress для packages.config. |
Выполнение аудита безопасности с помощью restore
Команда restore
автоматически выполняется при выполнении обычной операции пакета, например при загрузке проекта в первый раз, добавлении нового пакета, обновлении версии пакета или удалении пакета из проекта в любимой интегрированной среде разработки.
Зависимости проверяются на наличие списка известных уязвимостей, предоставляемых источниками аудита.
- В командной строке перейдите в каталог проекта или решения.
- Запустите
restore
с помощью предпочитаемого инструмента (т. е. dotnet, MSBuild, NuGet.exe, VisualStudio и т. д.). - Просмотрите предупреждения и учтите известные уязвимости системы безопасности.
Настройка аудита NuGet
Аудит можно настроить с помощью свойств MSBuild в .csproj
файле MSBuild, который оценивается как часть проекта.
Рекомендуется настроить аудит на уровне репозитория.
Свойство MSBuild | По умолчанию. | Возможные значения | Примечания. |
---|---|---|---|
NuGetAuditMode | all | direct и all . |
Если вы хотите проверить только зависимости верхнего уровня, можно задать значение direct . NuGetAuditMode неприменимо для проектов packages.config. |
NuGetAuditLevel | Низкий | low , moderate , high и critical |
Минимальный уровень серьезности для отчета. Если вы хотите просмотреть moderate , high и critical рекомендации (исключить low ), задайте для значения значение moderate |
NuGetAudit | true | true и false . |
Если вы хотите не получать отчеты аудита безопасности, вы можете полностью отказаться от работы, задав значение false |
Примечание. В .NET 8 используется direct
значение по умолчанию NuGetAuditMode.
Поэтому при настройке SdkAnalysisLevel 8.0.400
изменится значение по умолчанию NuGetAuditMode соответствующим образом.
Источники аудита
Восстановление скачивает ресурс сервера VulnerabilityInfo
для проверки списка пакетов, которые использует каждый проект.
Список источников определяется элементом auditSources
в NuGet.Config, и предупреждение NU1905 возникает, если любой из источников аудита не предоставляет никаких сведений об уязвимостях.
Если auditSources
не определен или снят без добавления источников, packageSources
будет использоваться и предупреждение NU1905 отключается.
Так как распространенный способ устранения атак на подстановку пакетов заключается в использовании одного источника пакета, который выполняется из nuget.org, чтобы NuGet не использовал nuget.org в качестве источника пакета, источники аудита можно использовать для использования nuget.org (или любого другого источника, предоставляющего сведения об уязвимости), не используя его в качестве источника пакета.
Источником данных для базы данных уязвимостей nuget.org является GitHub Advisory Database. Обратите внимание, что протокол V2 не рекомендуется, поэтому если конфигурация nuget.config по-прежнему использует конечную точку версии 2, необходимо перейти к конечной точке версии 3.
<configuration>
<auditSources>
<clear />
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
</auditSources>
</configuration>
Источники аудита доступны в NuGet 6.12, пакете SDK для .NET 9.0.100 и Visual Studio 2022 17.12.
До этой версии Аудит NuGet будет использовать только источники пакетов для скачивания сведений об уязвимостях.
Источники аудита в настоящее время не используются dotnet list package --vulnerable
.
Исключение рекомендаций
Вы можете исключить определенные рекомендации из отчета аудита, добавив новый NuGetAuditSuppress
элемент MSBuild для каждой рекомендации.
Определите NuGetAuditSuppress
элемент с метаданными, Include=
заданным для URL-адреса рекомендаций, которые вы хотите отключить.
<ItemGroup>
<NuGetAuditSuppress Include="https://github.com/advisories/XXXX" />
</ItemGroup>
Как и другие свойства конфигурации аудита NuGet, NuGetAuditSuppress
элементы можно определить на уровне проекта или репозитория.
NuGetAuditSuppress
доступен для проектов PackageReference, начиная с NuGet 6.11, Visual Studio 17.11 и пакета SDK для .NET 8.0.400.
Он доступен для пакетов.config из Visual Studio 17.12 и NuGet 6.12.
Коды предупреждений
Код предупреждения | Причина |
---|---|
NU1900 | Ошибка связи с источником пакета при получении сведений об уязвимостях. |
NU1901 | Пакет с низкой степенью серьезности обнаружен |
NU1902 | Обнаружен пакет с умеренной серьезностью |
NU1903 | Пакет с высоким уровнем серьезности обнаружен |
NU1904 | Пакет с обнаруженным критическим уровнем серьезности |
NU1905 | Источник аудита не предоставляет базу данных уязвимостей |
Вы можете настроить сборку для обработки этих предупреждений как ошибок для обработки предупреждений как ошибок или обрабатывать предупреждения не как ошибки.
Например, если вы уже используете <TreatWarningsAsErrors>
для обработки всех предупреждений (C#, NuGet, MSBuild и т. д.), их можно использовать <WarningsNotAsErrors>$(WarningsNotAsErrors);NU1901;NU1902;NU1903;NU1904</WarningsNotAsErrors>
для предотвращения уязвимостей, обнаруженных в будущем, от нарушения сборки.
Кроме того, если вы хотите сохранить низкие и умеренные уязвимости в качестве предупреждений, но обрабатывать высокие и критически важные уязвимости как ошибки, и вы не используете TreatWarningsAsErrors
, вы можете использовать <WarningsAsErrors>$(WarningsAsErrors);NU1903;NU1904</WarningsAsErrors>
.
Примечание.
Свойства MSBuild для серьезности сообщений, например NoWarn
и TreatWarningsAsErrors
не поддерживаются для проектов packages.config.
dotnet list package --vulnerable
После успешного восстановления dotnet list package
проекта имеет --vulnerable
аргумент для фильтрации пакетов на основе известных уязвимостей пакетов.
Обратите внимание, что --include-transitive
это не по умолчанию, поэтому следует включить.
Действия при обнаружении пакетов с известными уязвимостями
У нас также есть запись блога, которая обсуждает наш рекомендуемый метод для принятия действий, когда пакет с известной уязвимостью используется вашим проектом, и средства для получения дополнительных сведений.
Уязвимости системы безопасности, обнаруженные с обновлениями
Если обнаруженные уязвимости безопасности и обновления доступны для пакета, можно:
- Измените
.csproj
расположение или другое расположение версии пакета (Directory.Packages.props
) с более новой версией, содержащей исправление безопасности. - Используйте пользовательский интерфейс диспетчера пакетов NuGet в Visual Studio для обновления отдельного пакета.
dotnet add package
Выполните команду с соответствующим идентификатором пакета, чтобы обновить до последней версии.
Транзитивные пакеты
Если известная уязвимость существует в транзитивных зависимостях пакета верхнего уровня, у вас есть следующие параметры:
- Добавьте фиксированную версию пакета в качестве прямой ссылки на пакет. Примечание. Не забудьте удалить эту ссылку, когда новое обновление версии пакета становится доступным и обязательно сохраните определенные атрибуты для ожидаемого поведения.
- Используйте централизованное управление пакетами с функцией транзитивного закрепления.
- Отключайте рекомендации до тех пор, пока его не удастся устранить.
- Отправьте проблему в средство отслеживания пакета верхнего уровня, чтобы запросить обновление.
Уязвимости системы безопасности, обнаруженные без обновлений
В случае, если известная уязвимость существует в пакете без исправления безопасности, можно выполнить следующее.
- Проверьте все факторы, смягчающие факторы, описанные в консультативном отчете.
- Используйте предлагаемый пакет, если пакет помечен как нерекомендуемый или не рекомендуется.
- Если пакет открытый код, рассмотрите возможность внесения исправления.
- Откройте проблему в средство отслеживания проблем пакета.
Проверка факторов устранения рисков
Просмотрите помощник по безопасности для любых факторов, которые могут позволить продолжить использование пакета с уязвимостью. Уязвимость может существовать только в том случае, если код используется на определенной платформе, операционной системе или вызывается специальная функция.
Использование предлагаемого пакета
В случае, если для используемого пакета сообщается рекомендации по обеспечению безопасности, и пакет помечен как устаревший или кажется устаревшим, рассмотрите возможность использования любого предлагаемого альтернативного пакета, который автор пакета объявил или пакет, состоящий из аналогичных функций, которые поддерживаются.
Участие в исправлении
Если исправление не существует для рекомендаций по безопасности, может потребоваться предложить изменения, которые устраняют уязвимость в запросе на вытягивание в репозитории пакета открытый код или обратитесь к автору Contact owners
через раздел на странице сведений о пакете NuGet.org.
Открытие проблемы
Если вы не хотите исправить уязвимость или не можете обновить или заменить пакет, откройте проблему в средство отслеживания проблем пакета или предпочтительный метод контакта.
На NuGet.org вы можете перейти на страницу сведений о пакете и щелкнуть Report package
, что поможет вам связаться с автором.
Нет обнаруженных уязвимостей безопасности
Если уязвимости безопасности не найдены, это означает, что пакеты с известными уязвимостями не найдены в графе пакетов в данный момент времени, когда вы проверили.
Так как в любое время можно обновлять базу данных рекомендаций, рекомендуется регулярно проверять dotnet restore
выходные данные и обеспечивать то же самое в процессе непрерывной интеграции.
Итоги
Функции аудита безопасности важны для обеспечения безопасности и целостности проектов программного обеспечения. Эти функции обеспечивают дополнительный уровень защиты от уязвимостей безопасности и гарантирует, что вы можете использовать пакеты открытый код с уверенностью.