Aracılığıyla paylaş


Güvenlik açığı bilgileri

Sürüm 6.7'den başlayarak NuGet istemcisi, geri yükleme işlemleri sırasında paketleri denetleme gibi senaryolarda kullanmak üzere bilinen paket güvenlik açığı bilgilerini indirebilir. Paket meta veri kaynağı bilinen güvenlik açığı bilgilerini de içerir ancak bir uygulamanın bilinen güvenlik açıkları için çok sayıda paketi denetlemesi gerekiyorsa, çok sayıda HTTP isteği yapmak yerine bilinen güvenlik açıklarından oluşan bir dosyayı indirmek ve yerel olarak aramak çok daha hızlıdır. Örneğin bu, NuGet Geri Yükleme'nin bilinen güvenlik açıkları için geri yüklenen paketleri hızla denetlemesine olanak tanır ve bu da paket meta veri kaynağından paket ayrıntılarını hiçbir zaman indirmez.

API en az iki dosyadan oluşur: güvenlik açığı dizini ve bir veya daha fazla güvenlik açığı sayfası dosyası. Bilinen güvenlik açığı verileri birden çok dosyaya bölümlenebilir ve güvenlik açığı dizini istemcilere dosyaları önbelleğe almak ve önbelleği verimli bir şekilde güncelleştirmek için gereken bilgileri sağlar.

Bu URL'yi oluşturmak için kullanılan kaynak, hizmet dizininde bulunan kaynaktırVulnerabilityInfo.

Önerilen bölümleme stratejisi

Güvenlik açığı dizininde listelenen sayfalar ideal olarak önbelleğe almayı en üst düzeye çıkarmak ve dolayısıyla büyük dosyalara yönelik güncelleştirmeleri en aza indirmek için iyileştirilmelidir. Bu, istemcilerin güncelleştirmeleri indirmek için ihtiyaç duyduğu sıklığı en aza indirmesine olanak tanır.

Güvenlik açığı verilerini bölümleme için önerilen bir strateji, base.json ve updates.jsonolmak üzere iki sayfaya sahip olmaktır. Dosya base.json düzenli aralıklarla (örneğin ayda bir kez) güncelleştirilir ve dosya yeniden oluşturulurken bilinen tüm güvenlik açıklarını içerir. Dosya, updates.json en son yeniden oluşturulduktan sonra base.json yayımlanan yeni önerileri içermelidir. Bu, istemcilerin büyük base.json dosyaları seyrek indirmesine olanak tanırken, sık değişen updates.json dosya her zaman nispeten küçüktür.

NuGet istemcileri birden çok dosyadaki verileri ek olarak birleştirir ve dosyaları herhangi bir sırada yükleyebilir. Veri dosyası şeması, bilinen güvenlik açığının başka bir dosyadan değiştirilmesine veya yeniden düzenlenmesine izin vermez. Bu nedenle, bir sunucunun güvenlik açığı veri kaynağı (örneğin GitHub Danışmanları Veritabanı) mevcut bir öneriyi değiştirirse, NuGet sunucusunun güvenlik açığı bilgilerinin daha önce bildirildiği sayfayı değiştirmesi gerekir. Önerilen bölüm düzeniyle bunu başarma yollarından biri, tüm güvenlik açığı değişikliklerini ve silme işlemlerini dosyanın tamamını base.json yeniden oluşturmak ve boş updates.jsonbir tetikleyici olarak işlemektir.

Sürüm oluşturma

Aşağıdaki @type değerler kullanılır:

@type Değer Notlar
VulnerabilityInfo/6.7.0 İlk sürüm

Güvenlik açığı dizini

Güvenlik açığı dizini, aşağıdaki özelliklere sahip bir JSON nesne dizisidir:

Adı Tür Zorunlu Notlar
@name string evet Önbellek anahtarı olarak kullanılan dosya için kısa bir ad.
@id string evet Güvenlik açığı veri dosyasının tam (mutlak) URL'si.
@updated string evet Dosyanın en son güncelleştirilen tarih ve saati temsil eden iso 8601 dizesi ideal olarak UTC saat dilimiyle.
yorum Dize hayır İsteğe bağlı açıklayıcı bir dize.

Aşağıdaki kısıtlamalar geçerlidir:

  • Dizin, 1 ile 16 arasında öğe içeren bir nesne dizisi olmalıdır. Sunucuda herhangi bir güvenlik açığı verisi (sıfır sayfa) yoksa kaynağı öğesinden ServiceIndexkaldırması VulnerabilityInfo gerekir.
  • @namedizin içinde benzersiz olmalı, 1 ile 32 karakter uzunluğunda olmalıdır ve yalnızca , için , az0 ile 9, -veya _karakterlerini AZkullanabilir.
  • @id göreli URL değil mutlak bir URL olmalıdır.

Güvenlik açığı sayfası

Güvenlik açığı sayfa dosyaları, sözlük olarak kullanılan bir JSON nesnesidir. Özellik anahtarları küçük harf paket kimliğidir ve özellik değerleri aşağıdaki özelliklere sahip aşağıdaki nesnenin bir dizisidir:

Adı Tür Zorunlu Notlar
önem derecesi integer evet 0 düşük, 1 orta, 2 yüksek, 3 kritik anlamına gelir.
url Dize evet Kullanıcıların güvenlik açığı hakkında daha fazla bilgi edinebileceği URL.
versions string evet NuGet'in sürüm aralığı söz dizimi kullanılarak güvenlik açığı bulunan sürüm aralığı.

Paket kimlikleri (kök nesnenin anahtarları) ile String.ToLowerInvariantküçük harfe dönüştürülmelidir.

Bir paket için bilinen güvenlik açıkları listesi, sürüm aralığının en yüksek sürümünün azalan düzeninde sıralanmalı, ardından en düşük sürümün azalan sürümü ve ardından URL'nin artan düzeni sıralanmalıdır. Bir sürüm aralığında null min veya max sürümleri (sınırsız) olan aralıklar null olmayan (sınırlanmış) sürümlerden önceye sıralanmalıdır.

Bilinen güvenlik açıkları sağlamayan boş bir sayfa boş bir JSON dizisi ([] olmalıdır).

Örnekler

Güvenlik açığı dizini örneği aşağıda verilmiştir:

[
    {
        "@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."
    }
]

Güvenlik açığı veri dosyası örneği aşağıda verilmiştir:

{
    "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)"
        }
    ]
}