Bagikan melalui


Pemindaian dependensi

Pemindaian dependensi di GitHub Advanced Security untuk Azure DevOps mendeteksi komponen sumber terbuka yang digunakan dalam kode sumber Anda dan mendeteksi apakah ada kerentanan terkait. Setiap kerentanan yang ditemukan dari komponen sumber terbuka ditandai sebagai pemberitahuan.

GitHub Advanced Security untuk Azure DevOps berfungsi dengan Azure Repos. Jika Anda ingin menggunakan GitHub Advanced Security dengan repositori GitHub, lihat GitHub Advanced Security.

Tentang pemindaian dependensi

Pemindaian dependensi menghasilkan pemberitahuan untuk komponen sumber terbuka apa pun, langsung atau transitif, yang ditemukan rentan yang bergantung pada kode Anda. Kerentanan langsung adalah pustaka yang digunakan langsung kode Anda. Dependensi transitif adalah pustaka atau perangkat lunak lain yang digunakan dependensi langsung.

Tentang deteksi pemindaian dependensi

Rekam jepret baru komponen Anda disimpan setiap kali grafik dependensi untuk repositori berubah, dan setelah alur yang berisi tugas pemindaian dependensi yang membangun kode baru (dengan kata lain, penerapan baru) dijalankan.

Untuk setiap komponen rentan yang terdeteksi digunakan, komponen dan kerentanan tercantum dalam log build dan ditampilkan sebagai pemberitahuan di tab Keamanan Tingkat Lanjut. Hanya saran yang ditinjau oleh GitHub dan ditambahkan ke Database Penasihat GitHub yang membuat pemberitahuan pemindaian dependensi. Log build menyertakan tautan ke pemberitahuan individu untuk penyelidikan lebih lanjut. Untuk informasi selengkapnya tentang detail pemberitahuan, lihat Memperbaiki pemberitahuan pemindaian dependensi.

Log build juga berisi informasi dasar tentang setiap kerentanan yang terdeteksi. Detail ini termasuk tingkat keparahan, komponen yang terpengaruh, judul kerentanan, dan CVE terkait.

Cuplikan layar output build pemindaian dependensi

Ekosistem paket yang didukung

Pemindaian dependensi mendukung dependensi langsung dan transitif untuk semua ekosistem paket yang didukung.

Pengelolaan paket Bahasa Format yang didukung
Kargo Rust Cargo.toml, Cargo.lock
CocoaPods Swift Podfile.lock
Modul Go Go go.mod, go.sum
Gradle Java *.lockfile
Maven Java pom.xml
npm JavaScript package-lock.json, , package.jsonnpm-shrinkwrap.json,lerna.json
NuGet C# *.packages.config, , *.project.assets*.csproj
pip Python setup.py, requirements.txt
pnpm JavaScript package.json
RubyGems Ruby Gemfile.lock
Yarn JavaScript package.json

Tentang pemberitahuan pemindaian dependensi

Tab Keamanan Tingkat Lanjut di Repos di Azure DevOps adalah hub untuk melihat pemberitahuan keamanan Anda, yang secara default menunjukkan pemberitahuan pemindaian dependensi. Anda dapat memfilter menurut cabang, alur, paket, dan tingkat keparahan. Anda dapat memilih pemberitahuan untuk detail selengkapnya, termasuk panduan remediasi. Saat ini, hub pemberitahuan tidak menampilkan pemberitahuan untuk pemindaian yang diselesaikan pada cabang PR.

Ketika paket yang rentan terdeteksi di repositori Anda, memperbaiki pemberitahuan pemindaian dependensi biasanya melibatkan peningkatan ke versi paket yang lebih tinggi atau menghapus paket yang menyinggung. Saran ini berlaku untuk dependensi langsung dan transitif (atau tidak langsung). Tampilan default di tab Keamanan Tingkat Lanjut Anda adalah pemberitahuan aktif untuk cabang default untuk repositori Anda.

Tidak ada efek untuk menghasilkan jika alur atau cabang diganti namanya - mungkin perlu waktu hingga 24 jam sebelum nama baru ditampilkan.

Cuplikan layar tampilan pemberitahuan pemindaian dependensi untuk repositori

Status pemberitahuan secara otomatis diperbarui ke Closed ketika komponen yang rentan tidak lagi terdeteksi dalam build terbaru untuk alur apa pun tempat tugas pemindaian dependensi diinstal. Untuk melihat pemberitahuan yang diselesaikan, gunakan State filter di toolbar utama dan pilih Closed.

Cuplikan layar menampilkan pemberitahuan pemindaian dependensi tertutup

Jika Anda menonaktifkan Keamanan Tingkat Lanjut untuk repositori, Anda akan kehilangan akses ke hasil di tab Keamanan Tingkat Lanjut dan tugas build. Tugas build tidak akan gagal, tetapi hasil apa pun dari build yang dijalankan dengan tugas sementara Keamanan Tingkat Lanjut dinonaktifkan disembunyikan dan tidak dipertahankan.

Detail peringatan

Anda juga dapat menelusuri detail tentang pemberitahuan dengan mengklik pemberitahuan tertentu, dan panduan remediasi.

Cuplikan layar memperlihatkan detail untuk pemberitahuan pemindaian dependensi

Bagian Penjelasan
Rekomendasi Teks rekomendasi berasal langsung dari penyedia data kerentanan kami, Database Penasihat GitHub. Biasanya, panduan menyarankan peningkatan komponen yang diidentifikasi ke versi yang tidak rentan.
Lokasi Bagian Lokasi merinci jalur tempat tugas pemindaian dependensi telah menemukan komponen yang rentan digunakan. Jika file dapat diselesaikan dari pemindaian build yang mendasar ke file yang diterapkan di sumber, kartu Lokasi muncul sebagai tautan yang dapat diklik. Jika file diproduksi sebagai bagian dari build (misalnya, artefak build), tautan tidak dapat diklik. Tinjau log build untuk lebih memahami bagaimana komponen dibawa ke dalam build.
Deskripsi Deskripsi disediakan oleh deskripsi GitHub Advisory.

Deteksi

Alur yang tercantum di bawah tab Deteksi adalah alur tempat komponen rentan ditemukan. Setiap baris merinci build terbaru dari alur yang terpengaruh dan tanggal ketika paket pertama kali diperkenalkan. Jika paket yang rentan telah diperbaiki di beberapa alur tetapi tidak semua, Anda akan melihat sebagian baris tetap.

Cuplikan layar tampilan deteksi pemindaian dependensi untuk pemberitahuan tanpa perbaikan

Setelah pemberitahuan diselesaikan, pemberitahuan secara otomatis berpindah ke Closed status dan alur eksekusi terbaru di bawah tab Deteksi menampilkan tanda centang hijau, yang berarti bahwa kode yang berisi komponen yang diperbarui dijalankan dalam alur tersebut:

Cuplikan layar tampilan deteksi pemindaian dependensi untuk pemberitahuan

Tingkat keparahan

Database Penasihat GitHub menyediakan skor CVSS, yang kemudian diterjemahkan ke dalam tingkat keparahan rendah, sedang, tinggi, atau kritis untuk pemberitahuan melalui panduan berikut:

Skor CVSS Tingkat keparahan
1.0 < Skor < 4.0 Kurang Penting
4.0 < Skor < 7.0 Medium
7.0 < Skor < 9.0 Sangat Penting
Skor >= 9,0 Kritis

Menemukan detail

Dua bagian umumnya ditemukan di bawah Detail penemuan: paket yang rentan dan dependensi akar. Paket yang rentan adalah komponen yang berpotensi rentan. Bagian dependensi akar berisi komponen tingkat atas yang bertanggung jawab atas rantai dependensi yang mengarah pada kerentanan.

Jika paket yang rentan hanya direferensikan sebagai dependensi langsung, Anda hanya melihat bagian "paket yang rentan".

Jika paket yang rentan direferensikan baik sebagai dependensi langsung dan transitif, paket ditampilkan di bagian "paket rentan" dan "dependensi akar".

Jika paket yang rentan hanya dirujuk sebagai dependensi transitif, paket ditampilkan di bagian "paket rentan", dan dependensi akar yang mereferensikan paket yang rentan ditampilkan di bagian "dependensi akar".

Mengelola pemberitahuan pemindaian dependensi

Menampilkan pemberitahuan untuk repositori

Siapa pun dengan izin kontributor untuk repositori dapat melihat ringkasan semua pemberitahuan untuk repositori di Repos>Advanced Security.

Secara default, halaman pemberitahuan menunjukkan hasil pemindaian dependensi untuk cabang default repositori.

Status pemberitahuan mencerminkan status untuk cabang default dan alur eksekusi terbaru, bahkan jika pemberitahuan ada di cabang dan alur lain.

Memperbaiki pemberitahuan pemindaian dependensi

Dependensi langsung adalah komponen yang Anda miliki di repositori Anda. Dependensi transitif atau tidak langsung adalah komponen yang digunakan oleh dependensi langsung. Proyek Anda masih rentan terlepas dari apakah kerentanan ditemukan dalam dependensi langsung atau transitif.

Memperbaiki dependensi transitif yang rentan biasanya mengambil bentuk mengesampingkan versi komponen yang rentan secara eksplisit yang digunakan untuk setiap dependensi langsung yang diidentifikasi. Setelah dependensi akar meningkatkan penggunaan komponen yang rentan ke versi yang aman, Anda dapat meningkatkan setiap dependensi akar daripada beberapa penimpaan individu.

Memperbarui dependensi untuk Yarn/Npm

Secara hipotetis, mengatakan paket ini memiliki dua kerentanan. Salah satunya adalah untuk axios, dependensi langsung, dan satu untuk acorn, dependensi transitif (juga dikenal sebagai dependensi tidak langsung atau dependensi dependensi).

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

Versi saat ini memiliki kerentanan axios penolakan layanan (DoS) dengan rekomendasi untuk memperbarui ke v0.18.1 atau yang lebih tinggi. Karena ini adalah dependensi langsung, Anda memiliki kontrol atas versi axios yang Anda gunakan; yang perlu Anda lakukan adalah memperbarui versi axios yang Anda tarik. Tampilan yang diperbarui package.json mirip dengan:

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

Sekarang, versi eslint dalam yang package.json ditampilkan tergantung pada versi acorn yang merupakan kerentanan penolakan regex layanan (ReDoS) dengan rekomendasi untuk memperbarui ke versi 5.7.4, 6.4.1, 7.1.1 atau yang lebih tinggi. Jika Anda mendapatkan pemberitahuan dari alat pemindaian dependensi, itu harus memberi tahu Anda dependensi akar yang memerlukan dependensi yang rentan.

Yarn

Jika Anda menggunakan Yarn, Anda dapat menggunakan yarn mengapa untuk menemukan rantai dependensi lengkap.

> $ 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.

Rantai dependensi penuh adalah eslintacorn>espree>. Setelah Anda mengetahui rantai dependensi, Anda dapat menggunakan fitur lain dari Yarn, resolusi dependensi selektif, untuk mengambil alih versi acorn yang akan digunakan.

Gunakan bidang resolusi di package.json untuk menentukan penggantian versi. Tiga metode berbeda untuk mengambil alih paket ditampilkan, dalam urutan terburuk ke terbaik:

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

**/acorn Menggunakan pola akan mengambil alih semua penggunaan paket acorn di semua dependensi. Ini berbahaya, dan istirahat saat runtime. Akibatnya, telah dihapus di Yarn v2.

eslint/**/acorn Menggunakan pola mengambil alih semua penggunaan paket acorn di bawah paket eslint, dan dalam paket apa pun itu tergantung pada. Ini lebih aman daripada mengesampingkan paket untuk semua dependensi, tetapi masih memiliki beberapa risiko jika grafik dependensi untuk paket besar. Pola ini direkomendasikan ketika ada banyak subpaket yang menggunakan paket yang rentan dan menentukan penimpaan untuk subpaket individu tidak akan praktis.

Menggunakan pola eslint/espree/acorn hanya mengambil alih penggunaan acorn dalam espree paket dalam eslint paket. Ini secara khusus menargetkan rantai dependensi yang rentan, dan merupakan cara yang disarankan untuk mengambil alih versi paket.

npm

Jika Anda menggunakan npm 8.3 atau yang lebih tinggi, Anda dapat menggunakan bidang penimpaan di package.json

Tambahkan penimpaan jika Anda perlu membuat perubahan khusus pada dependensi transitif. Misalnya, Anda mungkin perlu menambahkan penimpaan untuk mengganti versi dependensi dengan masalah keamanan yang diketahui, mengganti dependensi yang ada dengan fork, atau memastikan bahwa versi paket yang sama digunakan di mana-mana.

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

Contoh penimpaan yang ditampilkan menunjukkan cara npm untuk mengatakan "ambil alih hanya penggunaan acorn dalam espree paket dalam eslint paket." Ini secara khusus menargetkan rantai dependensi yang rentan, dan merupakan cara yang disarankan untuk mengambil alih versi paket. Penimpaan adalah fitur asli npm. Ini menyediakan cara untuk mengganti paket di pohon dependensi Anda dengan versi lain, atau paket lain sepenuhnya.

Setelah mengatur penimpaan, Anda harus menghapus package-lock.json dan node_modules menjalankan npm install lagi.

Anda mungkin tidak mengatur penimpaan untuk paket yang Anda andalkan secara langsung kecuali dependensi dan penimpaan itu sendiri berbagi spesifikasi yang sama persis. Misalnya, katakanlah axios: "0.18.0" rentan dan kami ingin meningkatkan ke axios: "0.19.2". Secara langsung mengubah versi dependensi alih-alih menggunakan penimpaan.

{
  "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",
  }
}

Perbarui versi dependensi tanpa mengatur penimpaan:

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

Memperbarui dependensi untuk Maven

Mekanisme resolusi dependensi tidak se canggih seperti yang digunakan di Yarn. Akibatnya, Anda hanya dapat memiliki satu versi dependensi dalam proyek. Untuk mengatasi masalah ini, Maven menggunakan algoritma "kemenangan terdekat". Artinya, ia menggunakan versi dependensi terdekat dengan proyek Anda di pohon dependensi.

Misalnya, Anda memiliki grafik dependensi berikut:

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

your-project tergantung pada A:1.0.0, yang pada gilirannya bergantung pada B:2.0.0 tetapi proyek Anda juga memiliki dependensi langsung pada B:1.0.0. Jadi, Anda memiliki dua versi dependensi B yang berbeda dalam grafik dependensi Anda, tetapi dependensi versi 1.0.0 menang karena 'terdekat' dengan proyek Anda.

Dalam beberapa kasus, skenario ini mungkin berfungsi jika versi kompatibel. Namun, jika A:1.0.0 bergantung pada beberapa fitur B yang hanya tersedia dalam versi 2.0.0 maka perilaku ini tidak berfungsi. Dalam skenario terburuk, proyek ini mungkin masih dikompilasi tetapi gagal pada runtime.

Mari kita lihat contoh dunia nyata.

<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>

Katakanlah versi com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider Anda bergantung pada tergantung pada versi com.fasterxml.jackson.core:jackson-databind yang memiliki deserialisasi kerentanan data yang tidak tepercaya.

Anda dapat memverifikasi dependensi ini dengan menggunakan plugin dependensi Maven. Dalam hal ini Anda akan menjalankan mvn dependency:tree -Dincludes=com.fasterxml.jackson.core:jackson-databind dan mendapatkan output berikut:

> $ 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] ------------------------------------------------------------------------

Pertama, periksa apakah ada versi com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider baru yang tidak bergantung pada versi yang rentan dari com.fasterxml.jackson.core:jackson-databind. Jika demikian, Anda dapat meningkatkan com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider dan berhenti di sana. Jika tidak, ambil alih versi com.fasterxml.jackson.core:jackson-databind.

Seperti yang ditunjukkan dalam cuplikan kode, saat menggunakan Maven "kemenangan terdekat", jadi resolusinya adalah menambahkan dependensi langsung ke com.fasterxml.jackson.core:jackson-databind yang memperbaiki kerentanan.

<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>

Anda dapat memverifikasi bahwa resolusi berfungsi dengan menjalankan mvn dependency:tree -Dincludes=com.fasterxml.jackson.core:jackson-databind lagi.

$ 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] ------------------------------------------------------------------------

Disarankan untuk menambahkan komentar di dekat resolusi dependensi, sehingga siapa pun yang datang nanti tahu mengapa dependensi ada di sana. Ini dapat dihapus setelah dependensi akar menggunakan versi baru; jika tidak, Anda mengakumulasi dependensi.

Dalam proyek nyata, tambahkan dependensi setingkat mungkin rantai. Misalnya, Anda dapat menambahkan resolusi dalam file POM induk, alih-alih satu per satu di setiap file POM proyek.

Memperbarui dependensi untuk NuGet

Algoritma resolusi dependensi yang digunakan dalam NuGet mirip dengan Maven, karena hanya satu versi dependensi yang dapat digunakan. Namun, NuGet tidak menyematkan versi dependensi.

Misalnya, jika Anda memiliki dependensi <PackageReference Include="A" Version="1.2.3" />, Anda mungkin mengharapkan paket ini setara dengan = 1.2.3, tetapi sebenarnya berarti >= 1.2.3. Untuk menyematkan versi yang tepat, Anda harus menggunakan Version="[1.2.3]". Untuk informasi selengkapnya, lihat dokumentasi rentang versi NuGet.

Selain perilaku rentang default, NuGet memulihkan versi terendah yang berlaku untuk memenuhi rentang. Perilaku ini berarti bahwa dalam banyak kasus Anda harus menentukan rentang.

Mari kita lihat proyek sampel ini, yang memiliki dependensi pada Microsoft.AspNetCore.App:

<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>

Ini tergantung pada versi Microsoft.AspNetCore.Http.Connections yang rentan terhadap kerentanan eksekusi kode jarak jauh (RCE).

Pertama, Anda harus memeriksa untuk melihat apakah ada versi Microsoft.AspNetCore.App yang diperbarui tergantung pada versi yang lebih baru dari Microsoft.AspNetCore.Http.Connections. Jika demikian, Anda dapat meningkatkan Microsoft.AspNetCore.App dan berhenti di sini. Jika tidak, Anda harus mengambil alih versinya Microsoft.AspNetCore.Http.Connections tergantung pada.

NuGet tidak memiliki benang yang setara mengapa atau dependensi mvn:bawaan pohon, jadi cara term mudah untuk melihat pohon dependensi sering mengunjungi nuget.org. Jika Anda mengunjungi halaman NuGet untukMicrosoft.AspNetCore.App , Anda melihat bahwa itu tergantung pada Microsoft.AspNetCore.Http.Connections version >= 1.0.4 && < 1.1.0. Atau, dalam rentang versi NuGet, sintaks perwakilannya adalah [1.0.4,1.1.0).

Kerentanan RCE dalam Microsoft.AspNetCore.Http.Connections diperbaiki dalam versi 1.0.15, jadi Anda perlu mengambil alih rentang[1.0.15, 1.1.0) versi menjadi.

<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>

Disarankan untuk menambahkan komentar di dekat resolusi dependensi sehingga siapa pun yang datang nanti tahu mengapa dependensi ada di sana. Ini dapat dihapus setelah dependensi akar menggunakan versi baru. Jika tidak, Anda mengakumulasi dependensi.

Bagaimana jika tidak ada perbaikan yang tersedia?

Ketika tidak ada perbaikan yang diketahui tersedia, opsi berikut tersedia sebagai metode remediasi lain hingga komponen yang ditingkatkan tersedia:

  • Berhenti menggunakan komponen dan hapus dari kode Anda - penghapusan ini akan terdeteksi pada build Anda berikutnya dengan tugas pemindaian dependensi yang diinstal
  • Berkontribusi perbaikan pada komponen itu sendiri. Jika organisasi Anda memiliki panduan khusus sekeliling kontribusi sumber terbuka, ikuti panduan tersebut.
  • Menutup pemberitahuan. Namun, pemberitahuan tanpa perbaikan yang diketahui masih dapat menimbulkan ancaman keamanan bagi organisasi Anda. Kami menyarankan agar Anda tidak menutup pemberitahuan hanya karena tidak ada perbaikan yang diketahui.

Menutup pemberitahuan pemindaian dependensi

Untuk menutup pemberitahuan di Advanced Security, Anda memerlukan izin yang sesuai. Secara default, hanya administrator proyek yang diberikan kemampuan untuk menutup pemberitahuan Keamanan Tingkat Lanjut.

Untuk menutup pemberitahuan:

  1. Buka pemberitahuan yang ingin Anda tutup dan pilih pada pemberitahuan
  2. Pilih menu drop-down Tutup pemberitahuan
  3. Jika belum dipilih, pilih Risiko diterima atau Positif palsu sebagai alasan penutupan
  4. Menambahkan komentar opsional ke dalam kotak teks Komentar
  5. Pilih Tutup untuk mengirimkan dan menutup pemberitahuan
  6. Status pemberitahuan berubah dari Terbuka ke Ditutup dan menampilkan alasan pemecatan Anda

Cuplikan layar memperlihatkan cara menutup pemberitahuan pemindaian dependensi

Tindakan ini hanya menutup pemberitahuan untuk cabang yang Anda pilih. Cabang lain yang mungkin berisi kerentanan yang sama tetap aktif sampai ditindaklanjuti. Pemberitahuan apa pun yang sebelumnya telah diberhentikan dapat dibuka kembali secara manual.

Pemecahan masalah pemindaian dependensi

Pemindaian dependensi tidak mengidentifikasi komponen apa pun

Jika tugas pemindaian dependensi selesai tanpa menandai komponen apa pun dan gagal menghasilkan pemberitahuan untuk komponen dengan kerentanan yang diketahui, pastikan Anda memiliki langkah pemulihan paket sebelum AdvancedSecurity-Dependency-Scanning@1 tugas.

Misalnya, untuk proyek C# (.NET Core), berikut adalah cuplikan YAML sampel:

- task: DotNetCoreCLI@2
  displayName: 'Restore NuGet packages'
  inputs:
    command: 'restore'
    projects: '**/*.csproj'

    # If you are using a private package feed such as Azure Artifacts, you will need additional variables.
    # For more information, see https://learn.microsoft.com/en-us/azure/devops/pipelines/tasks/reference/dotnet-core-cli-v2?view=azure-pipelines 
    feedsToUse: 'select'
    ...

- task: AdvancedSecurity-Dependency-Scanning@1

Untuk proyek JavaScript, berikut adalah cuplikan YAML sampel:

- task: Npm@1
  displayName: 'npm install'
  inputs:
    command: 'install'
    workingDir: '$(System.DefaultWorkingDirectory)'

- task: AdvancedSecurity-Dependency-Scanning@1

Pemindaian dependensi tidak mengambil kerentanan baru

Jika Anda menjalankan build baru tetapi tidak melihat kerentanan baru seperti yang diharapkan, pastikan bahwa build dijalankan dengan penerapan baru.

Batas waktu tugas pemindaian dependensi

Waktu default yang dijalankan tugas pemindaian dependensi sebelum waktu habis adalah 300 detik, atau 5 menit. Jika waktu tugas habis sebelum penyelesaian, Anda dapat mengatur variabel DependencyScanning.Timeoutalur , yang mengharapkan bilangan bulat yang mewakili detik, seperti DependencyScanning.Timeout: 600. Apa pun di bawah batas waktu default 300 detik tidak berpengaruh.

Untuk menggunakan variabel ini, tambahkan DependencyScanning.Timeout sebagai variabel alur:

- task: AdvancedSecurity-Dependency-Scanning@1
- env:
    DependencyScanning.Timeout: 600

Skenario break-glass untuk tugas build

Jika tugas build pemindaian dependensi memblokir keberhasilan eksekusi alur Anda dan Anda perlu melewati tugas build secara mendesak, Anda dapat mengatur variabel DependencyScanning.Skip: truealur .

Izin tugas pemindaian dependensi

Tugas build pemindaian dependensi menggunakan identitas alur untuk memanggil API REST Keamanan Tingkat Lanjut. Secara default, alur dalam proyek yang sama memiliki akses untuk mengambil pemberitahuan. Jika Anda menghapus izin tersebut dari akun layanan build atau jika Anda memiliki penyiapan kustom (misalnya, alur yang dihosting dalam proyek yang berbeda dari repositori), Anda harus memberikan izin ini secara manual.

Berikan Advanced Security: View Alerts izin ke akun layanan build yang digunakan dalam alur Anda, yang untuk alur cakupan proyek adalah [Project Name] Build Service ([Organization Name]), dan untuk alur cakupan koleksi adalah Project Collection Build Service ([Organization Name]).