다음을 통해 공유


보안 취약성에 대한 패키지 종속성 감사

보안 감사 정보

NuGet과 같은 패키지 관리자에 대한 보안 감사는 소프트웨어 프로젝트에 포함된 패키지의 보안을 분석하는 프로세스입니다. 여기에는 취약성 식별, 위험 평가 및 보안 향상을 위한 권장 사항이 포함됩니다. 감사에는 패키지 자체의 검토뿐만 아니라 종속성 및 관련 위험이 포함될 수 있습니다. 감사의 목표는 코드 삽입 또는 사이트 간 스크립팅 공격과 같이 공격자가 악용할 수 있는 보안 취약성을 식별하고 완화하는 것입니다.

또한 알려진 취약성이 있는 패키지가 프로젝트에서 사용되는 것으로 확인된 경우 조치를 취하는 데 권장되는 방법과 자세한 정보를 얻는 데 도움이 되는 도구에 대해 설명하는 블로그 게시물있습니다.

기능 가용성

NuGet .NET SDK Visual Studio 기능
5.9 .NET 5 SDK(5.0.200) 해당 없음 dotnet list package --vulnerable
6.8 .NET 8 SDK(8.0.100) Visual Studio 2022 17.8 PackageReference용 NuGetAudit
6.10 해당 없음 Visual Studio 2022 17.10 packages.config에 대한 NuGetAudit
6.11 .NET 8 SDK(8.0.400) Visual Studio 2022 17.11 PackageReference용 NuGetAuditSuppress
6.12 .NET 9 SDK(9.0.100) Visual Studio 2022 17.12 감사 원본. packages.config에 대한 NuGetAuditSuppress 입니다.

다음을 사용하여 보안 감사 실행 restore

restore 명령은 처음으로 프로젝트 로드, 새 패키지 추가, 패키지 버전 업데이트 또는 즐겨찾는 IDE의 프로젝트에서 패키지 제거와 같은 일반적인 패키지 작업을 수행할 때 자동으로 실행됩니다. 종속성은 감사 원본에서 제공하는 알려진 취약성 목록에 대해 확인됩니다.

  1. 명령줄에서 프로젝트 또는 솔루션 디렉터리로 이동합니다.
  2. 원하는 도구(예: dotnet, MSBuild, NuGet.exe, VisualStudio 등)를 사용하여 실행 restore 합니다.
  3. 경고를 검토하고 알려진 보안 취약성을 해결합니다.

NuGet 감사 구성

감사는 프로젝트의 일부로 평가되는 MSBuild 파일의 MSBuild 속성을 .csproj 통해 구성할 수 있습니다. 감사는 리포지토리 수준에서 구성하는 것이 좋습니다.

MSBuild 속성 기본값 사용 가능한 값: 주의
NuGetAuditMode 직접적 directall 최상위 종속성만 감사하려는 경우 값을 direct.로 설정할 수 있습니다. NuGetAuditMode는 packages.config 프로젝트에 적용되지 않습니다.
NuGetAuditLevel 낮음 low, moderate, highcritical 보고할 최소 심각도 수준입니다. 및 권고(제외moderate)를 보려면 highcriticallow 값을 moderate
NuGetAudit true truefalse 보안 감사 보고서를 받지 않으려면 값을 로 설정하여 환경을 완전히 옵트아웃할 수 있습니다. false

감사 원본

복원은 각 프로젝트에서 사용 중인 패키지 목록을 확인하기 위해 서버 VulnerabilityInfo 의 리소스 를 다운로드합니다. 원본 목록은 NuGet.ConfigauditSources 정의되며 감사 원본 중 하나라도 취약성 정보를 제공하지 않으면 NU1905 경고가 발생합니다. auditSources 정의되지 않았거나 소스를 packageSources 추가하지 않고 지워지면 NU1905 경고가 표시되지 않습니다.

패키지 대체 공격에 대한 일반적인 완화는 nuget.org 업스트림하는 단일 패키지 원본을 사용하는 것이므로 NuGet이 nuget.org 패키지 원본으로 사용하도록 구성되지 않도록 감사 원본을 사용하여 패키지 원본으로 사용하지 않고도 nuget.org(또는 취약성 정보를 제공하는 다른 소스)를 사용할 수 있습니다.

nuget.org의 취약성 데이터베이스에 대한 데이터 원본은 GitHub 자문 데이터베이스입니다. V2 프로토콜은 더 이상 사용되지 않으므로 nuget.config가 여전히 V2 엔드포인트를 사용하는 경우 V3 엔드포인트로 마이그레이션해야 합니다.

<configuration>
    <auditSources>
        <clear />
        <add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
    </auditSources>
</configuration>

감사 원본은 NuGet 6.12, .NET 9.0.100 SDK 및 Visual Studio 2022 17.12에서 사용할 수 있습니다. 이 버전 이전에 NuGet 감사는 패키지 원본만 사용하여 취약성 정보를 다운로드합니다. 감사 원본은 현재 사용되지 dotnet list package --vulnerable 않습니다.

권고 제외

각 권고에 대해 새 NuGetAuditSuppress MSBuild 항목을 추가하여 감사 보고서에서 특정 권고를 제외하도록 선택할 수 있습니다. NuGetAuditSuppress 표시하지 않으려는 권고 URL로 설정된 메타데이터를 사용하여 Include= 항목을 정의합니다.

<ItemGroup>
    <NuGetAuditSuppress Include="https://github.com/advisories/XXXX" />
</ItemGroup>

다른 NuGet 감사 구성 속성 NuGetAuditSuppress 과 마찬가지로 항목은 프로젝트 또는 리포지토리 수준에서 정의할 수 있습니다.

NuGetAuditSuppress는 NuGet 6.11, Visual Studio 17.11 및 .NET 8.0.400 SDK부터 시작하는 PackageReference 프로젝트에 사용할 수 있습니다. Visual Studio 17.12 및 NuGet 6.12의 packages.config에 사용할 수 있습니다.

경고 코드

경고 코드 원인
NU1900 취약성 정보를 가져오는 동안 패키지 원본과 통신하는 동안 오류가 발생했습니다.
NU1901 심각도가 낮은 패키지가 검색됨
NU1902 보통 심각도가 검색된 패키지
NU1903 심각도가 높은 패키지가 검색됨
NU1904 심각도가 검색된 패키지
NU1905 감사 원본은 취약성 데이터베이스를 제공하지 않습니다.

이러한 경고를 오류로 처리하도록 빌드를 사용자 지정하여 경고를 오류로 처리하거나 오류가 아닌 경고를 처리할 수 있습니다. 예를 들어 모든 경고(C#, NuGet, MSBuild 등)를 오류로 처리하는 데 이미 사용하고 <TreatWarningsAsErrors> 있는 경우 나중에 검색된 취약성이 빌드를 중단하지 않도록 방지하는 데 사용할 <WarningsNotAsErrors>$(WarningsNotAsErrors);NU1901;NU1902;NU1903;NU1904</WarningsNotAsErrors> 수 있습니다. 또는 낮음 및 보통 취약성을 경고로 유지하지만 높고 중요한 취약성을 오류로 처리하고 사용하지 TreatWarningsAsErrors않는 경우 사용할 <WarningsAsErrors>$(WarningsAsErrors);NU1903;NU1904</WarningsAsErrors>수 있습니다.

참고 항목

packages.config 프로젝트와 같은 NoWarn 메시지 심각도에 대한 MSBuild 속성은 TreatWarningsAsErrors 지원되지 않습니다.

dotnet list package --vulnerable

프로젝트가 성공적으로 복원되면 dotnet list package 알려진 취약성이 --vulnerable 있는 패키지에 따라 패키지를 필터링하는 인수가 있습니다. --include-transitive 기본값은 아니므로 포함해야 합니다.

알려진 취약성이 있는 패키지가 보고되는 경우의 작업

또한 알려진 취약성이 있는 패키지가 프로젝트에서 사용되는 것으로 확인된 경우 조치를 취하는 데 권장되는 방법과 자세한 정보를 얻는 데 도움이 되는 도구에 대해 설명하는 블로그 게시물있습니다.

업데이트로 발견된 보안 취약성

보안 취약성이 발견되고 패키지에 대한 업데이트를 사용할 수 있는 경우 다음 중 하나를 수행할 수 있습니다.

  • 보안 수정 사항이 .csproj 포함된 최신 버전으로 또는 다른 패키지 버전 위치(Directory.Packages.props)를 편집합니다.
  • Visual Studio에서 NuGet 패키지 관리자 사용자 인터페이스를 사용하여 개별 패키지를 업데이트합니다.
  • dotnet add package 해당 패키지 ID를 사용하여 명령을 실행하여 최신 버전으로 업데이트합니다.

전이적 패키지

최상위 패키지의 전이적 종속성에 알려진 취약성이 있는 경우 다음과 같은 옵션이 있습니다.

  • 고정 패키지 버전을 직접 패키지 참조로 추가합니다. 참고: 새 패키지 버전 업데이트를 사용할 수 있게 되면 이 참조를 제거하고 예상 동작에 대해 정의된 특성을 유지 관리해야 합니다.
  • 전이적 고정 기능과 함께 중앙 패키지 관리를 사용합니다.
  • 권고를 처리할 수 있을 때까지 표시하지 않습니다.
  • 업데이트를 요청하기 위해 최상위 패키지의 추적기에서 문제를 제출합니다.

업데이트 없이 발견된 보안 취약성

보안 수정 없이 패키지에 알려진 취약성이 있는 경우 다음을 수행할 수 있습니다.

  • 권고 보고서에 설명된 완화 요인을 확인합니다.
  • 패키지가 사용되지 않는 것으로 표시되거나 중단된 경우 제안된 패키지를 사용합니다.
  • 패키지가 오픈 소스 경우 수정 사항을 제공하는 것이 좋습니다.
  • 패키지의 문제 추적기에서 문제를 엽니다.

완화 요인 확인

취약성이 있는 패키지를 계속 사용할 수 있는 완화 요인은 보안 관리자를 검토합니다. 이 취약성은 코드가 특정 프레임워크, 운영 체제 또는 특수 함수에서 호출되는 경우에만 존재할 수 있습니다.

제안된 패키지 사용

사용 중인 패키지에 대한 보안 권고가 보고되고 패키지가 더 이상 사용되지 않는 것으로 표시되거나 중단된 것으로 보이는 경우 패키지 작성자가 선언한 제안된 대체 패키지 또는 유지 관리되는 유사한 기능으로 구성된 패키지를 사용하는 것이 좋습니다.

수정 사항 기여

보안 권고에 대한 수정 사항이 없는 경우 패키지의 오픈 소스 리포지토리에서 끌어오기 요청의 취약성을 해결하는 변경 내용을 제안하거나 NuGet.org 패키지 세부 정보 페이지의 섹션을 통해 Contact owners 작성자에게 문의할 수 있습니다.

문제 열기

취약성을 수정하지 않거나 패키지를 업데이트하거나 바꿀 수 없는 경우 패키지의 문제 추적기 또는 기본 연락처 메서드에서 문제를 엽니다. NuGet.org 패키지 세부 정보 페이지로 이동하여 작성자와 연락하도록 안내하는 항목을 클릭 Report package 할 수 있습니다.

보안 취약성을 찾을 수 없음

보안 취약성이 없는 경우 이는 확인된 현재 시점에 알려진 취약성이 있는 패키지를 패키지 그래프에서 찾을 수 없음을 의미합니다. 권고 데이터베이스는 언제든지 업데이트할 수 있으므로 정기적으로 출력을 dotnet restore 확인하고 연속 통합 프로세스에서 동일한지 확인하는 것이 좋습니다.

요약

보안 감사 기능은 소프트웨어 프로젝트의 보안 및 무결성을 유지하는 데 매우 중요합니다. 이러한 기능은 보안 취약성에 대한 추가 보호 계층을 제공하고 오픈 소스 패키지를 자신있게 사용할 수 있도록 합니다.