Auditoría de dependencias de paquetes para vulnerabilidades de seguridad
Acerca de las auditorías de seguridad
Una auditoría de seguridad para administradores de paquetes como NuGet es un proceso que implica analizar la seguridad de los paquetes que se incluyen en un proyecto de software. Esto implica identificar vulnerabilidades, evaluar riesgos y realizar recomendaciones para mejorar la seguridad. La auditoría puede incluir una revisión de los propios paquetes, así como las dependencias y sus riesgos asociados. El objetivo de la auditoría es identificar y mitigar las vulnerabilidades de seguridad que podrían aprovechar los atacantes, como la inyección de código o los ataques de scripting entre sitios.
También tenemos una entrada de blog que describe nuestro método recomendado para tomar medidas cuando se descubre que el proyecto usa un paquete con una vulnerabilidad conocida e incluye herramientas para obtener más información.
Disponibilidad de características
NuGet | SDK de .NET | Visual Studio | Característica |
---|---|---|---|
5.9 | SDK de .NET 5 (5.0.200) | N/D | dotnet list package --vulnerable |
6.8 | .NET 8 SDK (8.0.100) | Visual Studio 2022 17.8 | NuGetAudit para PackageReference |
6.10 | N/D | Visual Studio 2022 17.10 | NuGetAudit para packages.config |
6.11 | SDK de .NET 8 (8.0.400) | Visual Studio 2022 17.11 | NuGetAuditSuppress para PackageReference |
6.12 | SDK de .NET 9 (9.0.100) | Visual Studio 2022 17.12 | Orígenes de auditoría. NuGetAuditSuppress para packages.config. |
Ejecución de una auditoría de seguridad con restore
El comando restore
se ejecuta automáticamente cuando se realiza una operación de paquete común, como cargar un proyecto por primera vez, agregar un nuevo paquete, actualizar una versión de paquete o eliminar un paquete del proyecto en el IDE favorito.
Las dependencias se comprueban con una lista de vulnerabilidades conocidas proporcionadas por los orígenes de auditoría.
- En la línea de comandos, vaya al directorio del proyecto o de la solución.
- Ejecute
restore
con sus herramientas preferidas (es decir, dotnet, MSBuild, NuGet.exe, VisualStudio, etc.). - Revise las advertencias y solucione las vulnerabilidades de seguridad conocidas.
Configuración de la auditoría de NuGet
La auditoría se puede configurar a través de las propiedades de MSBuild en un archivo .csproj
o MSBuild que se evalúa como parte del proyecto.
Se recomienda configurar la auditoría en un nivel de repositorio.
Propiedad de MSBuild | Valor predeterminado | Valores posibles | Notas |
---|---|---|---|
NuGetAuditMode | all | direct y all |
Si desea auditar solo las dependencias de nivel superior, puede establecer el valor direct en . NuGetAuditMode no es aplicable a los proyectos packages.config. |
NuGetAuditLevel | Bajo | low , moderate , high y critical . |
Nivel de gravedad mínimo que se ha de notificar. Si desea ver las advertencias moderate , high y critical (excluir low ), establezca el valor en moderate . |
NuGetAudit | true | true y false |
Si no desea recibir informes de auditoría de seguridad, puede optar por no participar en la experiencia completamente estableciendo el valor en false . |
Nota: En .NET 8, el valor predeterminado de NuGetAuditMode es direct
.
Por lo tanto, establezca SdkAnalysisLevel para 8.0.400
cambiar el valor predeterminado de NuGetAuditMode en consecuencia.
Orígenes de auditoría
La restauración descarga el recurso VulnerabilityInfo
de un servidor para comprobar la lista de paquetes que usa cada proyecto.
La lista de orígenes se define mediante el elemento auditSources
de NuGet.Config y se genera la advertencia NU1905 si alguno de los orígenes de auditoría no proporciona ninguna información de vulnerabilidad.
Si auditSources
no está definido o se borra sin agregar ningún origen, entonces se usará packageSources
y se suprimirá la advertencia NU1905.
Dado que una mitigación habitual para los ataques de sustitución de paquetes consiste en usar un único origen de paquete que proviene de nuget.org, de modo que NuGet no esté configurado para usar nuget.org como origen de paquete, los orígenes de auditoría se pueden usar para usar nuget.org (o cualquier otro origen que proporcione información de vulnerabilidad) sin usarlo también como origen del paquete.
El origen de datos de la base de datos de vulnerabilidades de nuget.org es GitHub Advisory Database. Tenga en cuenta que el protocolo V2 está en desuso, por lo que si nuget.config sigue usando el punto de conexión V2, debe migrar al punto de conexión V3.
<configuration>
<auditSources>
<clear />
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
</auditSources>
</configuration>
Los orígenes de auditoría están disponibles a partir de NuGet 6.12, el SDK de .NET 9.0.100 y Visual Studio 2022 17.12.
Antes de esta versión, NuGet Audit solo usará orígenes de paquetes para descargar información de vulnerabilidad.
En este momento dotnet list package --vulnerable
no usa orígenes de auditoría.
Exclusión de advertencias
Puede elegir excluir avisos específicos del informe de auditoría agregando un nuevo elemento NuGetAuditSuppress
de MSBuild para cada advertencia.
Defina un elemento NuGetAuditSuppress
con los metadatos Include=
establecidos en la dirección URL de advertencia que desea suprimir.
<ItemGroup>
<NuGetAuditSuppress Include="https://github.com/advisories/XXXX" />
</ItemGroup>
De forma similar a las otras propiedades de configuración de auditoría de NuGet, los elementos NuGetAuditSuppress
se pueden definir en el nivel de proyecto o repositorio.
NuGetAuditSuppress
está disponible para proyectos de PackageReference a partir de NuGet 6.11, Visual Studio 17.11 y el SDK de .NET 8.0.400.
Está disponible para packages.config desde Visual Studio 17.12 y NuGet 6.12.
Códigos de advertencia
Código de advertencia | Motivo |
---|---|
NU1900 | Error al comunicarse con el origen del paquete al obtener información de vulnerabilidad. |
NU1901 | Paquete con gravedad baja detectada |
NU1902 | Paquete con gravedad moderada detectada |
NU1903 | Paquete con gravedad alta detectada |
NU1904 | Paquete con gravedad crítica detectada |
NU1905 | Un origen de auditoría no proporciona una base de datos de vulnerabilidades |
Puede personalizar la compilación para tratar las advertencias como errores o no tratar las advertencias como errores.
Por ejemplo, si ya usa <TreatWarningsAsErrors>
para tratar todas las advertencias (C#, NuGet, MSBuild, etc.) como errores, puede usar <WarningsNotAsErrors>$(WarningsNotAsErrors);NU1901;NU1902;NU1903;NU1904</WarningsNotAsErrors>
para evitar que las vulnerabilidades detectadas en el futuro interrumpan la compilación.
Como alternativa, si desea mantener vulnerabilidades bajas y moderadas como advertencias, pero tratar vulnerabilidades altas y críticas como errores y no usa TreatWarningsAsErrors
, puede usar <WarningsAsErrors>$(WarningsAsErrors);NU1903;NU1904</WarningsAsErrors>
.
Nota:
Las propiedades de MSBuild para la gravedad del mensaje como NoWarn
y TreatWarningsAsErrors
no se admiten para los proyectos packages.config.
dotnet list package --vulnerable
Una vez que un proyecto se restaura correctamente, dotnet list package
tiene un argumento --vulnerable
para filtrar los paquetes en función de qué paquetes tienen vulnerabilidades conocidas.
Tenga en cuenta que --include-transitive
no es el valor predeterminado, por lo que debe incluirse.
Acciones cuando se notifican paquetes con vulnerabilidades conocidas
También tenemos una entrada de blog que describe nuestro método recomendado para tomar medidas cuando se descubre que el proyecto usa un paquete con una vulnerabilidad conocida e incluye herramientas para obtener más información.
Vulnerabilidades de seguridad encontradas con actualizaciones
Si se encuentran vulnerabilidades de seguridad y hay actualizaciones disponibles para el paquete, puede hacer lo siguiente:
- Edite el archivo
.csproj
u otra ubicación de versión del paquete (Directory.Packages.props
) con una versión más reciente que contenga una corrección de seguridad. - Use la interfaz de usuario del Administrador de paquetes NuGet en Visual Studio para actualizar el paquete individual.
- Ejecute el comando
dotnet add package
con el identificador de paquete correspondiente para actualizar a la versión más reciente.
Paquetes transitivos
Si existe una vulnerabilidad conocida en las dependencias transitivas de un paquete de nivel superior, tiene estas opciones:
- Agregue la versión fija del paquete como referencia directa del paquete. Nota: Asegúrese de quitar esta referencia cuando una nueva actualización de la versión del paquete esté disponible y asegúrese de mantener los atributos definidos para el comportamiento esperado.
- Use Administración central de paquetes con la funcionalidad de anclaje transitivo.
- Suprima el aviso hasta que se pueda solucionar.
- Presentar un problema en el rastreador del paquete de nivel superior para solicitar una actualización.
Vulnerabilidades de seguridad encontradas sin actualizaciones
En caso de que exista una vulnerabilidad conocida en un paquete sin una corrección de seguridad, puede hacer lo siguiente.
- Compruebe los factores de mitigación descritos en el informe de advertencia.
- Use un paquete sugerido si el paquete está marcado como en desuso o está abandonado.
- Si el paquete es de código abierto, considere la posibilidad de contribuir con una corrección.
- Abra un problema en el seguimiento de problemas del paquete.
Comprobación de factores de mitigación
Revise el asesor de seguridad para ver los factores de mitigación que pueden permitirle seguir usando el paquete con la vulnerabilidad. La vulnerabilidad solo puede existir cuando se usa el código en un marco o sistema operativo específicos o cuando se llama a una función especial.
Uso de un paquete sugerido
En caso de que se notifique un aviso de seguridad para el paquete que usa y el paquete esté marcado como en desuso o parezca abandonado, considere la posibilidad de usar cualquier sugerencia de paquete alternativo que el autor haya declarado o un paquete que conste de una funcionalidad similar que se mantiene.
Contribución de una corrección
Si no existe una corrección para el aviso de seguridad, puede sugerir cambios que aborden la vulnerabilidad en una solicitud de cambios en el repositorio de código abierto del paquete o ponerse en contacto con el autor a través de la sección Contact owners
de la página de detalles del paquete de NuGet.org.
Apertura de un problema
Si no desea corregir la vulnerabilidad o no puede actualizar o reemplazar el paquete, abra un problema en el seguimiento de problemas del paquete o en el método de contacto preferido.
En NuGet.org, puede ir a la página de detalles del paquete y hacer clic en Report package
, que le guiará para ponerse en contacto con el autor.
No se encontraron vulnerabilidades de seguridad
Si no se encuentra ninguna vulnerabilidad de seguridad, esto significa que los paquetes con vulnerabilidades conocidas no se encontraron en el gráfico de paquetes en el momento actual que ha comprobado.
Puesto que la base de datos de advertencias se puede actualizar en cualquier momento, se recomienda comprobar periódicamente la salida dotnet restore
y garantizar lo mismo en el proceso de integración continua.
Resumen
Las características de auditoría de seguridad son fundamentales para mantener la seguridad y la integridad de los proyectos de software. Estas características proporcionan un nivel adicional de protección contra vulnerabilidades de seguridad y garantizan que pueda usar paquetes de código abierto con confianza.