취약성 정보
NuGet 클라이언트는 버전 6.7부터 복원 작업 중 패키지 검사 같은 시나리오에서 사용할 알려진 패키지 취약성 정보를 다운로드할 수 있습니다. 패키지 메타데이터 리소스에는 알려진 취약성 정보도 포함되어 있지만, 앱이 알려진 취약성에 대해 많은 수의 패키지를 검사 경우 많은 수의 HTTP 요청을 수행하는 대신 로컬에서 알려진 취약성 및 조회 파일을 다운로드하는 것이 훨씬 빠릅니다. 예를 들어 NuGet 복원을 사용하면 지금까지 패키지 메타데이터 리소스에서 패키지 세부 정보를 다운로드하지 않은 알려진 취약성에 대해 복원된 패키지를 신속하게 검사 수 있습니다.
API는 취약성 인덱스 및 하나 이상의 취약성 페이지 파일인 두 개 이상의 파일로 구성됩니다. 알려진 취약성 데이터는 여러 파일로 분할할 수 있으며 취약성 인덱스는 클라이언트에게 파일을 캐시하고 캐시를 효율적으로 업데이트하는 데 필요한 정보를 제공합니다.
이 URL을 빌드하는 데 사용되는 리소스는 서비스 인덱스에서 찾은 리소스입니다VulnerabilityInfo
.
취약성 인덱스에 나열된 페이지는 캐싱을 최대화하여 대용량 파일에 대한 업데이트를 최소화하도록 최적화하는 것이 가장 좋습니다. 이렇게 하면 클라이언트가 업데이트를 다운로드하는 데 필요한 빈도를 최소화할 수 있습니다.
취약성 데이터 분할에 대해 제안된 전략은 두 페이지와 updates.json
두 페이지를 base.json
갖는 것입니다.
파일 base.json
은 정기적으로(예: 한 달에 한 번) 업데이트되며 파일이 다시 생성될 때 알려진 모든 취약성을 포함합니다.
이 파일에는 updates.json
마지막으로 다시 생성된 이후 base.json
게시된 모든 새 권고가 포함되어야 합니다.
이렇게 하면 자주 변경 updates.json
되는 파일은 항상 상대적으로 작은 반면 클라이언트는 자주 큰 파일을 다운로드 base.json
할 수 있습니다.
NuGet 클라이언트는 여러 파일의 데이터를 추가적으로 결합하며, 임의의 순서로 파일을 로드할 수 있습니다.
데이터 파일 스키마는 다른 파일에서 알려진 취약성을 수정하거나 수정할 수 없습니다.
따라서 서버의 취약성 데이터 원본(예: GitHub Advisories 데이터베이스)이 기존 권고를 수정하는 경우 NuGet 서버는 이전에 취약성 정보가 보고된 페이지를 수정해야 합니다.
제안된 파티션 구성표를 사용하여 이 작업을 수행하는 한 가지 방법은 모든 취약성 수정 및 삭제를 트리거로 처리하여 전체 base.json
파일을 다시 생성하고 비어 updates.json
있는 것입니다.
다음 @type
값이 사용됩니다.
@type 값 | 주의 |
---|---|
VulnerabilityInfo/6.7.0 | 초기 릴리스 |
취약성 인덱스는 다음 속성을 가진 개체의 JSON 배열입니다.
속성 | Type | Required | 주의 |
---|---|---|---|
@name | string | 예 | 캐시 키로 사용되는 파일의 짧은 이름입니다. |
@id | string | 예 | 취약성 데이터 파일에 대한 전체(절대) URL입니다. |
@updated | string | 예 | 파일이 마지막으로 업데이트된 날짜와 시간을 나타내는 ISO 8601 문자열로, UTC 표준 시간대를 사용하는 것이 좋습니다. |
comment | string | 아니요 | 선택적 설명 문자열입니다. |
다음 제한 사항이 적용됩니다.
- 인덱스가 1~16개 항목이 있는 개체의 배열이어야 합니다.
서버에 취약성 데이터(페이지 0개)가 없는 경우 리소스를
VulnerabilityInfo
제거ServiceIndex
해야 합니다. @name
는 인덱스 내에서 고유해야 하고, 1자에서 32자 사이여야 하며, 문자A
에서 , toz
,9
a
0
-
또는_
.에만 사용할 수 있습니다.Z
@id
는 상대 URL이 아닌 절대 URL이어야 합니다.
취약성 페이지 파일은 사전으로 사용되는 JSON 개체입니다. 속성 키는 소문자 패키지 ID이고 속성 값은 다음 속성을 가진 다음 개체의 배열입니다.
속성 | Type | Required | 주의 |
---|---|---|---|
severity | 정수 | 예 | 0은 낮음, 1은 중간, 2는 높음, 3은 중요를 의미합니다. |
url | string | 예 | 사용자가 취약성에 대한 자세한 정보를 얻을 수 있는 URL입니다. |
버전 | string | 예 | NuGet의 버전 범위 구문을 사용하여 취약한 버전 범위입니다. |
패키지 ID(루트 개체의 키)는 로 소문자를 지정 String.ToLowerInvariant
해야 합니다.
패키지의 알려진 취약성 목록은 버전 범위의 최대 버전 내림차순으로 정렬한 다음 최소 버전의 내림차순으로 정렬한 다음 URL의 오름차순으로 정렬해야 합니다. 버전 범위에서 null 최소 또는 최대 버전(바인딩되지 않음)이 있는 범위는 null이 아닌(바인딩된) 버전 이전으로 정렬되어야 합니다.
알려진 취약성을 제공하지 않는 빈 페이지는 빈 JSON 배열([]
)이어야 합니다.
다음은 취약성 인덱스의 샘플입니다.
[
{
"@name": "base",
"@id": "https://nuget.contoso.com/v3/vulnerabilities/3bb6b300-2f74-45bc-af06-746fd21c024b.json",
"@updated": "2023-06-01T06:14:58.4159909Z",
"comment": "The base data for vulnerability update periodically"
},
{
"@name": "update",
"@id": "https://nuget.contoso.com/v3/vulnerabilities/ffd572cd-33f3-4372-8714-a9cab2e86b45.json",
"@updated": "2023-06-14T11:35:30.3155764Z",
"comment": "The patch data for the vulnerability. Contains all the vulnerabilities since base was last updated."
}
]
다음은 취약성 데이터 파일의 샘플입니다.
{
"contoso.library": [
{
"url": "https://cve.contoso.com/advisories/1",
"severity": 1,
"versions": "(, 2.0.0)"
},
{
"url": "https://cve.contoso.com/advisories/2",
"severity": 2,
"versions": "(1.0.0, 2.0.0)"
}
],
"contoso.utilities": [
{
"url": "https://cve.contoso.com/advisories/3",
"severity": 3,
"versions": "(, 1.0.0)"
}
]
}