Ограничьте Возможности NuGet-пакетов в Вашем Проекте
При добавлении NuGet-пакета в проект принято думать о нём только как о библиотеке времени выполнения. В действительности пакеты также могут импортировать свойства/таргеты MSBuild и анализаторы Roslyn. Эти ресурсы запускаются во время восстановления или сборки. Описание общих рисков безопасности и лучших практик можно найти тут.
Т.е. пакет может выполнять код на вашем компьютере или в CI без вашего ведома. Если вам нужна только часть ресурсов пакета, вы можете ограничить импорт, используя IncludeAssets и ExcludeAssets в PackageReference.
Почему это важно
Пакеты NuGet могут включать:
- файлы build, buildMultitargeting и buildTransitive (свойства и таргеты MSBuild);
- анализаторы (включая генераторы кода);
- библиотеки времени выполнения и компиляции.
Если вам не нужна логика сборки или анализаторы из пакета, их блокировка уменьшает поверхность атаки и делает сборки более предсказуемыми. Если вы читали последние новости об атаках на цепочки поставок, вы знаете, что любой код, работающий на вашей машине или в CI, представляет потенциальный риск. По умолчанию импортируются все ресурсы из пакета, поэтому важно помнить об этом и принимать меры при необходимости.
Включайте только то, что вам нужно
Наиболее безопасный подход часто заключается в разрешении только необходимых вам ресурсов:
<ItemGroup>
<PackageReference Include="Some.Package" Version="1.2.3">
<IncludeAssets>compile;runtime</IncludeAssets>
</PackageReference>
</ItemGroup>
При такой конфигурации NuGet не импортирует анализаторы и таргеты сборки из пакета.
Исключение определённых типов ресурсов
Если вы предпочитаете сохранить поведение по умолчанию и удалить только некоторые группы ресурсов, используйте ExcludeAssets:
<ItemGroup>
<PackageReference Include="Some.Package" Version="1.2.3">
<ExcludeAssets>analyzers;build;buildTransitive</ExcludeAssets>
</PackageReference>
</ItemGroup>
Это полезно, когда вам по-прежнему нужны другие ресурсы, такие как contentFiles.
Распространённые сценарии
Включать только ресурсы среды выполнения/библиотеки:
<PackageReference Include="Some.Package" Version="1.2.3">
<IncludeAssets>runtime;compile</IncludeAssets>
</PackageReference>
Включать библиотеку времени выполнения, отключить анализаторы:
<PackageReference Include="Some.Package" Version="1.2.3">
<ExcludeAssets>analyzers</ExcludeAssets>
</PackageReference>
Оставить анализаторы, отключить таргеты сборки:
<PackageReference Include="Some.Package" Version="1.2.3">
<ExcludeAssets>build;buildMultitargeting;buildTransitive</ExcludeAssets>
</PackageReference>
Использовать пакет только для сборки:
<PackageReference Include="Some.Package" Version="1.2.3" PrivateAssets="all">
<IncludeAssets>build;buildMultitargeting;buildTransitive</IncludeAssets>
</PackageReference>
Параметр "PrivateAssets="all" предотвращает транзитивное распространение зависимости на проекты, которые ссылаются на ваш проект.
Примечания и оговорки
- Для корректной работы некоторых пакетов требуются анализаторы или таргеты сборки. Тестируйте после изменения фильтров ресурсов.
- Предпочтительнее явно указывать и документировать выбор критически важных зависимостей в файлах .csproj.
- Сочетайте это с файлами блокировки пакетов и сопоставлением источников пакетов для более надёжной защиты цепочки поставок.
Источник: https://www.meziantou.net/limit-what-nuget-packages-can-do-in-your-project.htm
