Bağımlılık taramayı ayarlama

Azure DevOps için GitHub Gelişmiş Güvenlik'te bağımlılık taraması, kaynak kodunuzda kullanılan açık kaynak bileşenlerini algılar ve ilişkili güvenlik açıkları olup olmadığını algılar. açık kaynak bileşenlerinden bulunan tüm güvenlik açıkları uyarı olarak işaretlenir. Azure DevOps için GitHub Gelişmiş Güvenliği'ne veya tek başına deneyimi kullanıyorsanız Azure DevOps için GitHub Code Security'yi etkinleştirmeniz gerekir.

Azure DevOps için GitHub Advanced Security, Azure Repos ile çalışır. GitHub Depoları ile GitHub Gelişmiş Güvenlik'i kullanmak için bkz. gitHub Gelişmiş Güvenlik .

Önkoşullar

Kategori Gereksinimler
İzinler - Depoya yönelik tüm uyarıların özetini görüntülemek için: Katkıda Bulunan depo izinleri.
- Gelişmiş Güvenlik'te uyarıları kapatmak için: Proje yöneticisi izinleri.
- Gelişmiş Güvenlik izinlerini yönetmek için: Proje Koleksiyonu Yöneticileri grubunun bir üyesi olun veya Gelişmiş Güvenlik'e ait ayar izinleri , olarak Ayarla izininesahip olun.
İşlem hattı görevleri - Kuruluş ayarları>İşlem Hatları>Ayarlar>Görev kısıtlamaları bölümünde Marketplace görevlerini devre dışı bırak seçeneğinin kapalı olduğundan emin olun. Kod tarama ve bağımlılık taraması, Visual Studio Market aracılığıyla dağıtılan Azure Pipelines görevleri temel alır. Market görevlerini devre dışı bırakırsanız, varsayılan kurulum taramaları çalıştıramaz ve gelişmiş kurulum işlem hatları bir görevin eksik olduğunu bildirebilir. Daha fazla bilgi için bkz. Görev yönetimi.

Gelişmiş Güvenlik izinleri hakkında daha fazla bilgi için bkz. Gelişmiş Güvenlik izinlerini yönetme.

Bağımlılık tarama hakkında

Kodunuzun bağımlı olduğu, doğrudan veya dolaylı herhangi bir açık kaynak bileşeninde güvenlik açığı bulunduğunda, bağımlılık taraması bir uyarı oluşturur. Doğrudan güvenlik açıkları, kodunuzun doğrudan kullandığı kitaplıklardır. Geçişli bağımlılıklar, doğrudan bağımlılıkların kullandığı kitaplıklar veya diğer yazılımlardır.

Bağımlılık tarama algılama hakkında bilgi edinin

Depo için bağımlılık grafiği her değiştiğinde ve bağımlılık tarama görevini içeren bir işlem hattı yürütüldükten sonra bileşenlerinizin yeni bir anlık görüntüsü depolanır.

Kullanımda algılanan her güvenlik açığı bileşeni için, bileşen ve güvenlik açığı derleme günlüğünde listelenir ve Gelişmiş Güvenlik sekmesinde uyarı olarak görüntülenir. Yalnızca GitHub tarafından incelenen ve GitHub Danışmanlık Veritabanı'na eklenen öneriler bağımlılık tarama uyarısı oluşturur. Yapı günlüğü, daha fazla araştırma için uyarıya ait bağlantıyı içerir. Uyarı ayrıntıları hakkında daha fazla bilgi için Bkz. Bağımlılık tarama uyarılarını düzeltme.

Derleme günlüğü, algılanan her güvenlik açığıyla ilgili temel bilgileri de içerir. Bu ayrıntılar önem derecesini, etkilenen bileşeni, güvenlik açığının başlığını ve ilişkili CVE'yi içerir.

Bağımlılık tarama derleme çıkışının ekran görüntüsü.

Note

Bağımlılık taraması, görevle yapılandırılmış bir işlem hattının çalıştırılmasını veya bağımlılık tarama varsayılan kurulumunun AdvancedSecurity-Dependency-Scanning@1 etkin olduğu bir depoda işlem hattının çalıştırılmasını gerektirir. Gelişmiş Güvenlik veya Kod Güvenliği'nin etkinleştirilmesi bağımlılık taramasını otomatik olarak yürütmez.

Desteklenen bileşen ekosistemlerinin ve sürümlerinin listesi için bkz . Desteklenen paket ekosistemleri.

Bağımlılık tarama uyarıları hakkında bilgi edinin

Azure DevOps'taki Depolar'daki Gelişmiş Güvenlik sekmesi, güvenlik uyarılarınızı görüntülemek için varsayılan olarak bağımlılık tarama uyarılarını gösteren merkezdir. Dal, işlem hattı, paket, önem derecesi, bağımlılık kapsamı ve Exploit Prediction Scoring System (EPSS) yüzdelik dilimine göre filtreleyebilirsiniz. Düzeltme kılavuzu da dahil olmak üzere daha fazla ayrıntı için bir uyarı seçebilirsiniz. Şu anda uyarı merkezi, çekme isteği dallarında tamamlanan taramalar için uyarıları görüntülemez.

Deponuzda güvenlik açığı bulunan bir paket algılandığında bağımlılık tarama uyarılarının düzeltilmesi genellikle daha yüksek bir paket sürümüne yükseltmeyi veya sorunlu bir paketi kaldırmayı içerir. Bu öneri hem doğrudan hem de geçişli (veya dolaylı) bağımlılıklar için geçerlidir. Gelişmiş Güvenlik sekmenizdeki varsayılan görünüm, deponuzun varsayılan dalı için etkin uyarılardır.

İşlem hatları veya dallar yeniden adlandırılırsa sonuçların bir etkisi olmaz; yeni adın görüntülenmesi 24 saat kadar sürebilir.

Kapsam ve EPSS yüzdebirlik filtreleri içeren bağımlılık tarama uyarıları sayfasının ekran görüntüsü.

Bağımlılık kapsamına göre uyarıların önceliğini belirleme

Bağımlılık kapsamı, güvenlik açığı bulunan bir bağımlılığın çalışma zamanında mı yoksa yalnızca geliştirme sırasında mı kullanıldığını gösterir. Uyarılar sayfasında, Çalışma Zamanı veya Geliştirme bağımlılığı uyarılarını göstermek için tek seçimli Kapsam filtresini kullanın.

Yalnızca geliştirme amaçlı bağımlılıklar, uyarı listesinde Geliştirme rozetiyle görüntülenir. Tarama sonucu bu meta verileri içerdiğinde uyarı ayrıntıları da bağımlılık kapsamını görüntüler. Kapsam meta verileri mevcut değilse, Gelişmiş Güvenlik, uyarının diğer davranışlarında herhangi bir değişiklik yapmadan rozeti ve kapsam ayrıntısını atlar.

Kapsam, genel olarak pakete değil, belirli bir bağımlılık sonucuna uygulanır. Aynı paket başka bir bağımlılık yolunda veya projede algılandığında farklı bir kapsama sahip olabilir.

EPSS ile uyarıların önceliklerini belirleme

Exploit Prediction Scoring System (EPSS), bir yazılım güvenlik açığının vahşi yaşamda kötüye kullanılma olasılığını tahmin eder. EPSS bir puan ve yüzdelik dilim sağlar; Advanced Security, bağımlılık taraması uyarıları için yüzdelik dilimi görüntüler. Daha yüksek bir yüzdebirlik değeri, güvenlik açığının puanlanan diğer güvenlik açıklarına göre tahmin edilen açıklardan yararlanma olasılığı açısından daha yüksek olduğunu gösterir.

Düzeltmeyi önceliklendirirken EPSS yüzdelik dilimini şiddetle birlikte kullanın. Önem derecesi bir güvenlik açığının olası etkisini yansıtırken EPSS, açıklardan yararlanma olasılığını değerlendirmenize yardımcı olur. Uyarılar sayfasında, bir yüzdebirlik aralığı belirtmek ve aralığı karşılayan bağımlılık uyarılarına odaklanmak için EPSS yüzdebirlik filtresini kullanın. Aralık sınırları kapsayıcıdır ve uyguladığınız diğer filtrelerle birleştirilir.

EPSS yüzdebirlik filtresi güvenlik açıklarını aşağıdaki kategorilere göre gruplandırıyor:

EPSS yüzdelik dilimi Kategori
90-100% Çok yüksek
70-90% Yüksek
50-70% Orta
0-50% Düşük

EPSS verileri her danışmanlık için kullanılamaz. Bir uyarıda EPSS meta verileri olmadığında, Gelişmiş Güvenlik uyarı ayrıntılarında EPSS yüzdebirlik değerini görüntülemez. Eksik meta veriler uyarının önem derecesini, durumunu veya düzeltme kılavuzunu etkilemez.

Bağımlılık tarama görevinin yüklü olduğu işlem hatlarında en son derlemede güvenlik açığı bulunan bileşen artık algılanmadığında, uyarının durumu Closed olarak otomatik güncellenir. Çözümlenen uyarılarınızı görüntülemek için ana araç çubuğundaki filtreyi State kullanarak öğesini seçin Closed.

Kapalı bağımlılık tarama uyarılarını görüntüleme ekran görüntüsü.

Deponuz için Gelişmiş Güvenlik'i kapatırsanız, Gelişmiş Güvenlik sekmesinde ve derleme görevinde sonuçlara erişimi kaybedersiniz. Derleme görevi başarısız olmaz, ancak Gelişmiş Güvenlik devre dışı bırakıldığında derlemelerden elde edilen sonuçlar gizlidir ve korunmaz.

Uyarı ayrıntıları

Ayrıca, belirli bir uyarıya tıklayarak ve düzeltme kılavuzuna tıklayarak bir uyarıyla ilgili ayrıntıları inceleyebilirsiniz.

Bağımlılık tarama uyarısında EPSS yüzdebirlik tehdit bilgilerinin ekran görüntüsü.

Bölüm Açıklama
Scope Kapsam, güvenlik açığı bulunan bağımlılığın çalışma zamanında mı yoksa yalnızca geliştirme sırasında mı kullanıldığını gösterir. Bu bilgiler yalnızca sonuç için bağımlılık kapsamı meta verileri kullanılabilir olduğunda görünür.
EPSS yüzdelik dilimi EPSS yüzdelik dilimi, güvenlik açığının tahmin edilen istismar edilme olasılığı açısından, puanlanan diğer güvenlik açıklarına kıyasla hangi sırada yer aldığını gösterir. Bu satır yalnızca danışmanlık için EPSS meta verileri kullanılabilir olduğunda görünür.
Öneri Öneri metni doğrudan güvenlik açığı veri sağlayıcımız olan GitHub Danışmanlık Veritabanı'ndan gelir. Genellikle kılavuz, tanımlanan bileşenin desteklenemez bir sürüme yükseltilmesi önerisinde bulunur.
Konum Konumları bölümü, bağımlılık tarama görevinin kullanımda olan güvenlik açığı bileşenini bulmasına neden olan yolların ayrıntılarını içerir. Dosya temel alınan derleme taramasından kaynaktaki kaydedilmiş bir dosyaya çözümlenebiliyorsa Konumlar kartı tıklanabilir bağlantı olarak görünür. Bir dosya bir derlemenin parçası olarak oluşturulduysa (örneğin, derleme yapıtı), bağlantıya tıklanamaz. Bileşenin derlemeye nasıl dahil edildiğini daha iyi anlamak için derleme günlüklerini gözden geçirin.
Açıklama GitHub Tavsiye açıklamasından sağlanan açıklama.

Algılamalar

Algılamalar sekmesinde listelenen işlem hatları, güvenlik açığı bulunan bileşenin bulunduğu işlem hatlarıdır. Her satır, etkilenen işlem hattının en son derlemesini ve paketin ilk kez tanıtıldığı tarihi ayrıntılı olarak belirtir. Güvenlik açığı içeren paket bazı işlem hatlarında düzeltildiyse ancak hepsi düzeltilmediyse, kısmen düzeltilmiş satırları görürsünüz.

Düzeltme içermeyen bir uyarı için bağımlılık tarama algılamaları görünümünün ekran görüntüsü.

Bir uyarı çözümlendikten sonra, uyarı otomatik olarak Closed durumuna geçer ve Algılamalar sekmesinin altındaki en son çalıştırma işlem hattı yeşil bir onay işareti görüntüler; bu da güncelleştirilmiş bileşeni içeren kodun bu işlem hattında çalıştırıldığı anlamına gelir:

Bir uyarı için bağımlılık tarama algılamaları görünümünün ekran görüntüsü.

Ciddiyet

GitHub Danışmanlık Veritabanı bir CVSS puanı sağlar ve bu puan aşağıdaki yönergelerle uyarı için düşük, orta, yüksek veya kritik önem derecesine dönüştürülür:

CVSS Puanı Ciddiyet
1.0 < Puan < 4.0 Düşük
4.0 < Puan < 7.0 Orta
7.0 < Puan < 9.0 Yüksek
Puan >= 9,0 Hayati önemde

Ayrıntıları bulma

Ayrıntıları bulma bölümünde yaygın olarak iki bölüm bulunur: güvenlik açığı olan paket ve kök bağımlılığı. Güvenlik açığı bulunan paket, güvenlik açığı olabilecek bileşendir. Kök bağımlılık bölümü, bir güvenlik açığına yol açan bağımlılık zincirinden sorumlu en üst düzey bileşenleri içerir.

Güvenlik açığı olan pakete yalnızca doğrudan bağımlılık olarak başvurulursa, yalnızca "güvenlik açığı olan paket" bölümünü görürsünüz.

Güvenlik açığı olan pakete hem doğrudan hem de geçişli bağımlılık olarak başvurulursa, paket hem "savunmasız paket" hem de "kök bağımlılık" bölümünde gösterilir.

Güvenlik açığı bulunan pakete yalnızca geçişli bağımlılık olarak başvurulsa, paket "güvenlik açığı olan paket" bölümünde gösterilir ve güvenlik açığı bulunan pakete başvuran kök bağımlılıklar "kök bağımlılık" bölümünde gösterilir.

Bağımlılık tarama uyarılarını yönetme

Depo için uyarıları görüntüleme

Varsayılan olarak, uyarılar sayfasında deponun varsayılan dalı için bağımlılık tarama sonuçları gösterilir.

Uyarı diğer dallarda ve işlem hatlarında mevcut olsa bile, uyarının durumu varsayılan dalın ve en son çalıştırma işlem hattının durumunu yansıtır.

Copilot Otomatik Düzeltme ile bir düzeltme oluşturun

Desteklenen bir bağımlılık güvenlik açığı uyarısı için, Copilot Otomatik Düzeltme'nin bir değişiklik önermesini ve bir çekme isteği açmasını sağlamak üzere Düzeltme oluştur'u seçin. Önerilen düzeltmeyi gözden geçirin, test edin ve birleştirin, ardından sonucu doğrulamak için bağımlılık taramasını yeniden çalıştırın.

Agentic Autofix, önerilen düzeltmenin kodlama standartlarınıza uymasına yardımcı olmak için depoya işlenmiş havuz yönergelerini ve ilgili becerileri kullanabilir. Sınırlı genel önizleme aşamasındadır ve kötü amaçlı yazılım bulgularını desteklemez. Önkoşullar, etkinleştirme ve depo bağlamı yönergeleri için bkz. kod güvenliği uyarıları için Copilot Autofix.

Eski veya kullanılmayan işlem hattı yapılandırmalarından gelen uyarıları otomatik temizleme

Otomatik temizleme, işlem hattı yapılandırmaları çalışmayı durdurduğunda eski tarama sonuçlarını gizler. Uyarıyı, sırf uyarı veya dalı 90 günden eski diye gizlemez. Bu davranış, kod tarama ve bağımlılık tarama uyarıları için geçerlidir.

Bir yapılandırma ayarını eski yapan nedir?

Temizleme, tarama yapılandırmasıyla ilişkili işlem hattı aşamasının en son tamamlanma süresini kullanır. Bu tamamlanma süresi varsayılan olarak 90 günden uzun bir süre önce olduğunda aşama eskir.

Advanced Security, işlem hattı aşaması kaydını etkin değil olarak işaretler ancak sonuçlarını korur. Ardından, uyarı görünümü bir uyarıyı yalnızca bu uyarıyla ilişkili en son sonuçların tümü eski yapılandırmalardan geldiğinde gizler. Bu sonuçlardan herhangi biri etkin bir yapılandırmadan geliyorsa uyarı yine de görünebilir.

Tarih veya etkinlik 90 günlük temizlik için mi kullanılır?
Uyarı ilk algılandığında No
Uyarının en son algılandığı zaman No
Dalın en son ne zaman tarandığı Bağımsız olarak değil. Temizleme, dallar arasında paylaşılabilen ilişkili işlem hattı aşamasını izler.
İlişkili işlem hattı aşamasının en son tamamlanma zamanı Yes

Eski dal tespiti neden görünür kalabilir veya yeniden görünebilir?

Farklı dallar aynı işlem hattı aşaması etkinlik kaydını paylaşabilir. Bu aşama başka bir dalda yeniden çalıştırıldığında Gelişmiş Güvenlik tamamlanma süresini güncelleştirir ve ilişkili yapılandırmaları yeniden etkinleştirir. Sonuç olarak, yakın zamanda çalışmayan bir daldaki eski algılamalar görünür veya yeniden görünebilir.

Örneğin, şu sırayı göz önünde bulundurun:

  1. İşlem hattı aşaması develop üzerinde bir güvenlik açığı tespit eder.
  2. Bu aşama 90 günden uzun bir süre boyunca hiçbir branch'te çalışmaz. Temizleme bunu etkin değil olarak işaretledikten sonra Gelişmiş Güvenlik, diğer etkin yapılandırmalardan en son sonuçları yoksa uyarıyı gizler.
  3. Aynı aşama feature/update-build üzerinde çalışır. Gelişmiş Güvenlik, ilişkili yapılandırmalarını yeniden etkinleştirir; bu nedenle eski develop algılama yeniden görünebilir.

run üzerindeki feature/update-builddevelop taramaz. Paylaşılan işlem hattı aşamasının etkinlik durumunu değiştirir; bu durum, Gelişmiş Güvenlik'in eski sonucu gösterip göstermeyeceğini denetler.

Bu nedenle, ilk görüldüğü veya son görüldüğü eski bir tarihle bir uyarı görüntülenebilir. Bu tarihler işlem hattı aşamasının etkinlik durumunu değil daldaki algılamayı açıklar. Yapılandırmanın yeniden etkinleştirilmesi, eski sonucun yeni bir algılama haline gelmesine neden olmaz veya özgün ilk görüldüğü tarihin değiştirilmesini gerektirmez.

Neyi kontrol etmelisiniz?

Eski bir algılama görünür durumda kaldığında, yalnızca uyarıda gösterilen dalı değil dallar arasında aynı işlem hattı aşamasının çalıştırmalarını gözden geçirin. Güvenlik açığının o dalda hala mevcut olup olmadığını denetlemek için bu dalda taramayı çalıştırın.

Important

Sonuçlar otomatik temizleme nedeniyle gizlenir. Güvenlik açığını düzeltmez veya uyarıyı kapatmaz. İlişkili yapılandırma yeniden etkin hale gelirse, önceden gizli olan açık uyarılar açık uyarılar olarak döndürülebilir.

Bağımlılık tarama uyarılarını düzeltme

Doğrudan bağımlılık, deponuzda bulunan bir bileşendir. Geçişli veya dolaylı bağımlılık, doğrudan bağımlılık tarafından kullanılan bir bileşendir. Projeniz, güvenlik açığının doğrudan veya geçişli bir bağımlılıkta bulunup bulunmadığına bakılmaksızın hala savunmasızdır.

Güvenlik açığı bulunan geçişli bağımlılığı düzeltmek genellikle tanımlanan her doğrudan bağımlılık için kullanılan savunmasız bileşenin sürümünü açıkça geçersiz kılma biçimine sahip olur. Kök bağımlılıklar, güvenlik açığı bulunan bileşenin kullanımını güvenli bir sürüme yükselttiklerinde, her bir kök bağımlılığı bireysel geçersiz kılmalardan ziyade topluca yükseltebilirsiniz.

Yarn/Npm için bağımlılıkları güncelleştirme

Varsayımsal olarak, bu paketin iki güvenlik açığı olduğunu varsayalım. Birisi axios doğrudan bağımlılık içindir, diğeri ise acorn geçişli bağımlılık (dolaylı bağımlılık veya bağımlılığın bağımlılığı olarak da bilinir) içindir.

{
 "name": "my-package",
 "version": "1.0.0",
 "dependencies": {
   "axios": "0.18.0",
   "eslint": "5.16.0",
 }
}

geçerli sürümü, axios v0.18.1 veya üzeri sürüme güncelleştirme önerisi içeren bir hizmet reddi (DoS) güvenlik açığına sahiptir. Bu doğrudan bir bağımlılık olduğundan, kullandığınız sürümü axios üzerinde denetiminiz vardır; tek yapmanız gereken, çektiğiniz sürümü axios güncelleştirmektir. Güncellenen package.json şuna benzer:

{
  "name": "my-package",
  "version": "1.0.0",
  "dependencies": {
    "axios": "0.19.2",
    "eslint": "5.16.0",
  }
}

Şimdi, gösterilen eslint'deki package.json sürümü, düzenli ifade hizmet reddi "Re-DoS" güvenlik açığına sahip bir acorn sürümüne bağlıdır ve 5.7.4, 6.4.1, 7.1.1 veya daha yüksek bir sürüme güncelleme yapılması önerilmektedir. Bağımlılık tarama aracından bir uyarı alırsanız, bu uyarı size güvenlik açığı olan bağımlılığı gerektiren kök bağımlılığı belirtmelidir.

İplik

Yarn kullanıyorsanız yarn why kullanarak bağımlılık zincirinin tamamını bulabilirsiniz.

> $ yarn why acorn
 yarn why v1.22.4
 [1/4] Why do we have the module "acorn"...?
 [2/4] Initialising dependency graph...
 [3/4] Finding dependency...
 [4/4] Calculating file sizes...
 => Found "acorn@6.4.0"
 info Reasons this module exists
   - "eslint#espree" depends on it
   - Hoisted from "eslint#espree#acorn"
 info Disk size without dependencies: "1.09MB"
 info Disk size with unique dependencies: "1.09MB"
 info Disk size with transitive dependencies: "1.09MB"
 info Number of shared dependencies: 0
 Done in 0.30s.

Bağımlılık zincirinin tamamıdıreslint>espree>acorn. Bağımlılık zincirini bildiğinizde, kullanılan acorn sürümünü değiştirmek için Yarn'ın seçmeli bağımlılık çözümlemeleri özelliğini kullanabilirsiniz.

Sürüm geçersiz kılmayı tanımlamak için package.json içindeki çözümlemeler alanını kullanın. Bir paketi geçersiz kılmak için en kötüden en iyiye sırasıyla üç farklı yöntem gösterilir:

{
  "name": "yarn-resolutions",
  "version": "1.0.0",
  "license": "MIT",
  "dependencies": {
    "axios": "0.19.2",
    "eslint": "5.16.0"
  },
  "resolutions": {
    // DO NOT USE!
    "**/acorn": "6.4.1",
    // BETTER
    "eslint/**/acorn": "6.4.1",
    // BEST
    "eslint/espree/acorn": "6.4.1"
  }
}

Desenin**/acorn kullanılması, tüm bağımlılıklar genelinde meşe palamudu paketinin tüm kullanımlarını geçersiz kılar. Tehlikelidir ve çalışma zamanında bozulur, bu nedenle Yarn v2'de kaldırdık.

eslint/**/acorn modelinin kullanılması, eslint paketi altında ve onun bağımlı olduğu tüm paketlerde Acorn paketinin tüm kullanımlarını geçersiz kılar. Paketi tüm bağımlılıklar için geçersiz kılmaktan daha güvenlidir, ancak bir paketin bağımlılık grafiği büyükse bazı riskleri vardır. Bu düzen, güvenlik açığı bulunan bir paket kullanan çok sayıda alt paket olduğunda ve tek tek alt paketler için geçersiz kılmaların tanımlanması pratik olmadığında önerilir.

Desenin eslint/espree/acorn kullanılması yalnızca paketin acornespree içindeki kullanımını eslint geçersiz kılar. Özellikle güvenlik açığı olan bağımlılık zincirini hedefler ve paket sürümlerini geçersiz kılmanın önerilen yoludur.

npm

npm 8.3 veya üzerini kullanıyorsanız, package.json dosyanızda overrides alanını kullanabilirsiniz.

Geçişli bağımlılıklarda belirli değişiklikler yapmanız gerekiyorsa override tanımlayın. Örneğin, bilinen bir güvenlik sorunuyla bağımlılığın sürümünü geçersiz kılmanız, var olan bir bağımlılığı çatalla değiştirmeniz veya paketin aynı sürümünün her yerde kullanıldığından emin olmanız gerekebilir.

{
  "name": "npm-overrides",
  "version": "1.0.0",
  "license": "MIT",
  "dependencies": {
    "axios": "0.19.2",
    "eslint": "5.16.0"
  },
   "overrides":{
       "eslint": {
        "espree": {
          "acorn": "6.4.1"
        }
    }
   }
}

Gösterilen geçersiz kılma örneği, npm'nin "acorn paketinde, espree paketindeki eslint kullanımını yalnızca geçersiz kıl" demenin bir yolunu gösterir. Özellikle güvenlik zaafiyeti içeren bağımlılık zincirini hedef alır ve paket sürümlerini geçersiz kılmanın önerilen yoludur. Geçersiz kılmalar, npm'nin yerel bir özelliğidir. Bağımlılık ağacınızdaki bir paketi başka bir sürümle veya tamamen başka bir paketle değiştirmenin bir yolunu sağlar.

Geçersiz kılmaları ayarladıktan sonra package-lock.json ve node_modules öğelerini silip npm install'yi yeniden çalıştırmanız gerekir.

Hem bağımlılık hem de geçersiz kılmanın kendisi aynı belirtimi paylaşmadıkları sürece doğrudan bağımlı olduğunuz bir paket için geçersiz kılma ayarlaması yapamazsınız. Örneğin, axios: "0.18.0"'ın güvenlik açığı olduğunu varsayalım ve axios: "0.19.2"sürümüne yükseltmek istediğimizi düşünelim. Geçersiz kılma kullanmak yerine bağımlılık sürümünü doğrudan değiştirin.

{
  "name": "npm-overrides",
  "version": "1.0.0",
  "license": "MIT",
  "dependencies": {
    "axios": "0.18.0"
  },
  "overrides": {
    // BAD, will throw an EOVERRIDE error
    // "axios": "0.19.2",
  }
}

Geçersiz kılma işlemi belirlemeden bağımlılığın sürümünü güncelleyin.

{
  "name": "npm-overrides",
  "version": "1.0.0",
  "license": "MIT",
  "dependencies": {
    "axios": "0.19.2"
  }
}

Maven için bağımlılıkları güncelleştirme

Bağımlılık çözümleme mekanizması Yarn'da kullanılan mekanizma kadar karmaşık değildir. Sonuç olarak, bir projede bağımlılığın yalnızca tek bir sürümüne sahip olabilirsiniz. Maven, bu sorunu çözmek için "en yakın kazanan" algoritmasını kullanır. Başka bir ifadeyle, bağımlılık ağacında projenize en yakın bağımlılığın sürümünü kullanır.

Örneğin, aşağıdaki bağımlılık grafiğine sahipsiniz:

your-project --- A:1.0.0 --- B:2.0.0
      \
       \__ B:1.0.0

your-project A:1.0.0 öğesine bağlıdır, o da B:2.0.0 öğesine bağlıdır, ancak projenizin de B:1.0.0 üzerinde doğrudan bir bağımlılığı vardır. Bu nedenle, bağımlılık grafiğinizde B bağımlılığının iki farklı sürümü vardır, ancak B bağımlılığının 1.0.0 sürümü projenize "en yakın" olduğu için kazanır.

Bazı durumlarda, sürümler uyumluysa bu senaryo işe yarayabilir. Ancak, B'nin yalnızca sürümde A:1.0.0 kullanılabilen bazı özelliklerine bağlıysa 2.0.0 bu davranış çalışmaz. En kötü durumda, bu proje yine de derlenebilir ancak çalışma zamanında başarısız olabilir.

Şimdi gerçek bir dünya örneğine göz atalım.

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.microsoft.customer360</groupId>
  <artifactId>maven-dependencies</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>maven-dependencies</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>com.fasterxml.jackson.jaxrs</groupId>
      <artifactId>jackson-jaxrs-json-provider</artifactId>
      <version>2.10.3</version>
    </dependency>
</project>

Varsayalım ki com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider sürümüne bağlı olduğunuz com.fasterxml.jackson.core:jackson-databind, güvenilmeyen verilerin seri duruma geri dönüştürme güvenlik açığı olan bir sürümüne bağlı.

Maven bağımlılık eklentisini kullanarak bu bağımlılığı doğrulayabilirsiniz. Bu durumda komutunu çalıştırıp mvn dependency:tree -Dincludes=com.fasterxml.jackson.core:jackson-databind aşağıdaki çıkışı alırsınız:

> $ mvn dependency:tree -Dincludes=com.fasterxml.jackson.core:jackson-databind
 [INFO] Scanning for projects...
 [INFO]
 [INFO] ------------< com.microsoft.customer360:maven-dependencies >------------
 [INFO] Building maven-dependencies 1.0-SNAPSHOT
 [INFO] --------------------------------[ jar ]---------------------------------
 [INFO]
 [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ maven-dependencies ---
 [INFO] com.microsoft.customer360:maven-dependencies:jar:1.0-SNAPSHOT
 [INFO] \- com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:jar:2.10.3:compile
 [INFO]    \- com.fasterxml.jackson.jaxrs:jackson-jaxrs-base:jar:2.10.3:compile
 [INFO]       \- com.fasterxml.jackson.core:jackson-databind:jar:2.10.3:compile
 [INFO] ------------------------------------------------------------------------
 [INFO] BUILD SUCCESS
 [INFO] ------------------------------------------------------------------------
 [INFO] Total time:  0.928 s
 [INFO] Finished at: 2020-04-27T14:30:55+02:00
 [INFO] ------------------------------------------------------------------------

İlk olarak, güvenlik açığı olan bir sürümüne com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider bağımlı olmayan yeni bir sürümü com.fasterxml.jackson.core:jackson-databindolup olmadığını denetleyin. Öyleyse, yükseltebilir com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider ve orada durabilirsiniz. Aksi takdirde com.fasterxml.jackson.core:jackson-databind sürümünü geçersiz kılın.

Kod parçacığında gösterildiği gibi, Maven kullanırken "en yakın olan tercih edilir", bu yüzden çözüm olarak, güvenlik açığını gidermek için com.fasterxml.jackson.core:jackson-databind'a doğrudan bir bağımlılık eklenmelidir.

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.microsoft.customer360</groupId>
  <artifactId>maven-dependencies</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>maven-dependencies</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>com.fasterxml.jackson.jaxrs</groupId>
      <artifactId>jackson-jaxrs-json-provider</artifactId>
      <version>2.10.3</version>
    </dependency>
    <!-- Dependency resolutions -->
    <!-- jackson-jaxrs-json-provider -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.10.4</version>
    </dependency>
  </dependencies>
</project>

Yeniden çalıştırarak mvn dependency:tree -Dincludes=com.fasterxml.jackson.core:jackson-databind çözümlemenin çalıştığını doğrulayabilirsiniz.

$ mvn dependency:tree -Dincludes=com.fasterxml.jackson.core:jackson-databind
[INFO] Scanning for projects...
[INFO]
[INFO] ------------< com.microsoft.customer360:maven-dependencies >------------
[INFO] Building maven-dependencies 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ maven-dependencies ---
[INFO] com.microsoft.customer360:maven-dependencies:jar:1.0-SNAPSHOT
[INFO] \- com.fasterxml.jackson.core:jackson-databind:jar:2.9.10.4:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.827 s
[INFO] Finished at: 2020-04-27T14:32:42+02:00
[INFO] ------------------------------------------------------------------------

Daha sonra gelen herkesin bağımlılığın neden orada olduğunu bilmesi için bağımlılık çözümünün yakınına bir açıklama eklemenizi öneririz. Kök bağımlılık yeni sürümü kullandığında kaldırılabilir; aksi takdirde bağımlılıkları biriktirirsiniz.

Gerçek bir projede bağımlılığı zincire mümkün olduğunca yüksek bir şekilde ekleyin. Örneğin, çözümlemeyi her proje POM dosyasına ayrı ayrı eklemek yerine üst POM dosyasına ekleyebilirsiniz.

NuGet için bağımlılıkları güncelleştirme

NuGet'te kullanılan bağımlılık çözümleme algoritması Maven'a benzer, bu nedenle bir bağımlılığın yalnızca tek bir sürümü kullanılabilir. Ancak NuGet, bağımlılık sürümlerini sabitlemez.

Örneğin, bir bağımlılığınız <PackageReference Include="A" Version="1.2.3" />varsa, bu paketin ile eşdeğer = 1.2.3olmasını bekleyebilirsiniz, ancak aslında anlamına gelir >= 1.2.3. Tam bir sürümü sabitlemek için kullanmanız Version="[1.2.3]"gerekir. Daha fazla bilgi için NuGet sürüm aralıkları belgelerine bakın.

NuGet, varsayılan aralık davranışına ek olarak bir aralığı karşılamak için en düşük geçerli sürümü geri yükler. Bu davranış, çoğu durumda bir aralık tanımlamanız gerekebileceği anlamına gelir.

şimdi üzerinde bağımlılığı Microsoft.AspNetCore.Appolan bu örnek projeye göz atalım:

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <RootNamespace>NuGet.Dependencies</RootNamespace>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App" Version="2.1.14" />
  </ItemGroup>
</Project>

Microsoft.AspNetCore.Http.Connections'in uzaktan kod yürütme (RCE) güvenlik açığı içeren bir sürümüne bağlıdır.

İlk olarak, Microsoft.AspNetCore.App için daha yeni bir Microsoft.AspNetCore.Http.Connections sürümüne bağlı olan güncellenmiş bir sürümün olup olmadığını kontrol etmelisiniz. Bu durumda Microsoft.AspNetCore.App öğesini yükseltebilir ve burada durabilirsiniz. Aksi takdirde, Microsoft.AspNetCore.Http.Connections'in bağlı olduğu sürümü geçersiz kılmanız gerekir.

NuGet'in yarn why veya mvn dependency:tree yerleşik bir eşdeğeri yoktur, bu nedenle bağımlılık ağacını görmenin en kolay yolu genellikle nuget.org'u ziyaret etmektir. için NuGet sayfasını ziyaret ederseniz, ve bunun bağımlı olduğunu görürsünüz. Alternatif olarak, NuGet sürüm aralığında temsili söz dizimi şeklindedir [1.0.4,1.1.0).

Microsoft.AspNetCore.Http.Connections sürümündeki RCE güvenlik açığı 1.0.15 sürümünde düzeltildi, bu nedenle sürüm aralığını [1.0.15, 1.1.0) olarak ayarlamanız gerekir.

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <RootNamespace>NuGet.Dependencies</RootNamespace>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App" Version="2.2.8" />
  </ItemGroup>

  <ItemGroup Label="Dependency Resolutions">
    <!-- Microsoft.AspNetCore.App -->
    <PackageReference Include="Microsoft.AspNetCore.Http.Connections" Version="[1.0.15,1.1.0)" />
  </ItemGroup>
</Project>

Daha sonra gelecek herkesin bağımlılığın neden orada olduğunu bilmesi için bağımlılık çözümünün yakınına bir açıklama eklemenizi öneririz. Ana bağımlılık yeni sürümü kullanmaya başladığında kaldırılabilir. Aksi takdirde bağımlılıkları biriktirirsiniz.

Düzeltme yoksa ne olur?

Bilinen bir düzeltme olmadığında, yükseltilen bir bileşen kullanılabilir olana kadar aşağıdaki seçenekler diğer düzeltme yöntemleri olarak kullanılabilir:

  • Bileşeni kullanmayı durdurun ve kodunuzdan kaldırın. Bağımlılık tarama görevi yüklü bir sonraki derlemenizde bu kaldırma algılanır
  • Bileşenin kendisine bir düzeltme katkıda bulunun. Kuruluşunuzun açık kaynak katkılarıyla ilgili belirli yönergeleri varsa bu yönergeleri izleyin.
  • Uyarı kapatılıyor. Ancak, bilinen bir düzeltmesi olmayan uyarılar kuruluşunuz için bir güvenlik tehdidi oluşturabilir. Bilinen bir düzeltme olmadığı için uyarıyı kapatmamanızı öneririz.

Bağımlılık tarama uyarılarını kapatma

Uyarıyı kapatmak için aşağıdaki adımları uygulayın:

  1. Kapatmak istediğiniz uyarıya gidin ve uyarıyı seçin.

  2. Uyarıyı kapat açılır menüsünü seçin.

  3. Henüz seçilmemişse, kapatma nedeni olarak ya Risk kabul edildi ya da Yanlış pozitif seçeneklerinden birini seçin.

  4. Açıklama metin kutusuna isteğe bağlı bir açıklama ekleyin.

  5. Uyarıyı göndermek ve kapatmak için Kapat'ı seçin.

  6. Uyarı durumu Açık 'den Kapalı 'ye değişir ve reddetme nedeninizi görüntüler.

    Bağımlılık tarama uyarısını kapatmayı gösteren ekran görüntüsü.

Bu eylem uyarıyı tüm dallarda kaldırır. Aynı güvenlik açığını içeren diğer dallar da kapatılır. Daha önce kapatılan tüm uyarılar el ile yeniden açılabilir.

Pull request'lerde bağımlılık tarama uyarılarını yönetme

Çekme isteğinde yeni kod değişiklikleri için uyarılar oluşturulursa, uyarı, çekme isteğinin Genel Bakış sekmesinin yorum bölümünde bir ek açıklama olarak ve Gelişmiş Güvenlik depo sekmesinde uyarı olarak bildirilir. Çekme isteği dalı için yeni bir dal seçici maddesi mevcuttur.

Etkilenen paket bildirimini görebilir, bulmanın özetini görebilir ve Genel Bakış bölümünde ek açıklamayı çözümleyebilirsiniz.

Aktif bağımlılık pull request açıklamasının ekran görüntüsü.

Çekme isteği uyarılarını kapatmak için önce uyarı ayrıntı görünümüne gidip uyarıyı kapatmanız, ardından yorumu çözmeniz gerekir. Aksi halde, açıklama durumunun değiştirilmesi (1) ek açıklamayı giderir, ancak temel alınan uyarıyı kapatmaz veya düzeltmez.

Kapalı bağımlılık çekme isteği açıklamasının ekran görüntüsü.

Çekme isteği dalınızın tüm sonuç kümesini görmek için Repos gidin ve çekme isteği dalınızı seçin. Ek açıklama üzerinde Daha fazla ayrıntı göster (2) seçeneğinin seçilmesi sizi Gelişmiş Güvenlik sekmesindeki uyarı ayrıntı görünümüne yönlendirir.

İpucu

Ek açıklamalar yalnızca etkilenen kod satırları çekme isteğinin hedef dalı ile karşılaştırıldığında çekme isteği farkı için tamamen benzersiz olduğunda oluşturulur.