共用方式為


程式碼掃描

GitHub Advanced Security for Azure DevOps 中的 程式代碼掃描可讓您分析 Azure DevOps 存放庫中的程序代碼,以找出安全性弱點和編碼錯誤。 會以警示形式提出分析所識別的任何問題。 程式碼掃描會使用 CodeQL 識別弱點。

CodeQL 是由 GitHub 所開發的程式碼分析引擎,可讓安全性檢查自動化。 您可以使用 CodeQL 分析程式碼,並以程式碼掃描警示型態顯示結果。 如需有關 CodeQL 的更具體檔,請參閱 CodeQL 檔

適用於 Azure DevOps 的 GitHub 進階安全性可與 Azure Repos 搭配運作。 如果您想要搭配 GitHub 存放庫使用 GitHub 進階安全性,請參閱 GitHub 進階安全性

程式代碼掃描的其他設定

語言和查詢支援

GitHub 專家、安全性研究人員和社群參與者會撰寫和維護用於程式代碼掃描的預設 CodeQL 查詢。 查詢會定期更新,以改善分析並減少任何誤判結果。 查詢是 開放原始碼,因此您可以檢視並參與 github/codeql 存放庫中的查詢。

CodeQL 支援並使用下列語言識別碼:

語言 識別碼 選擇性替代識別碼(如果有的話)
C/C++ c-cpp ccpp
C# csharp
Go go
Java/Kotlin java-kotlin
JavaScript/TypeScript javascript
Python python
Ruby ruby
Swift swift

提示

  • 使用 c-cpp 來分析以 C、C++或兩者撰寫的程式代碼。
  • 使用 java-kotlin 來分析以 Java、Kotlin 或兩者撰寫的程式代碼。
  • 使用 javascript 來分析以 JavaScript、TypeScript 或兩者撰寫的程式代碼。

如需詳細資訊,請參閱 支援的語言和架構

您可以在組建記錄檔中檢視 CodeQL 所執行的特定查詢和工作詳細數據。

程式代碼掃描發佈結果工作的螢幕快照。

程式代碼掃描建置模式自定義

設定管線以進行掃描時,程式代碼掃描支援兩種建置模式:

  • none - CodeQL 資料庫是直接從程式代碼基底建立,而不需要建置程式代碼基底(支援所有解譯的語言,以及 C# 和 Java 也支援)。
  • manual - 您可以定義用於工作流程中程式代碼基底的建置步驟(支援所有編譯的語言)。

如需不同建置模式的詳細資訊,包括每個建置模式優點的比較,請參閱 CodeQL程式碼掃描編譯的語言

若要透過適用於 Azure DevOps 的 GitHub 進階安全性執行程式代碼掃描分析,autobuild建置模式會改為個別的建置工作。 AdvancedSecurity-CodeQL-Autobuild@1

提示

建置模式 none 可與其他解譯的語言搭配使用(例如 JavaScript、Python、Ruby)。 如果針對 C# 或 Java 指定建置模式 none ,並搭配不支援建置模式 none的其他已編譯語言,管線工作將會失敗。

以下是具有多種語言和 none 建置模式的有效組態範例:

trigger: none
 
pool:
  vmImage: windows-latest

steps:
- task: AdvancedSecurity-Codeql-Init@1
  displayName: Initialize CodeQL
  inputs:
# build mode `none` is supported for C# and Java, and JavaScript is an interpreted language
# and build mode `none` has no impact on JavaScript analysis
    languages: 'csharp, java, javascript' 
    buildtype: 'none'

- task: AdvancedSecurity-Codeql-Analyze@1
  displayName: Perform CodeQL Analysis

以下是具有多種語言和 none 建置模式之無效組態的範例:

trigger: none
 
pool:
  vmImage: windows-latest

steps:
- task: AdvancedSecurity-Codeql-Init@1
  displayName: Initialize CodeQL
  inputs:
# build mode `none` is supported for C# but build mode `none` is NOT supported for Swift
# so this pipeline definition will result in a failed run
    languages: 'csharp, swift'
    buildtype: 'none'

- task: AdvancedSecurity-Codeql-Analyze@1
  displayName: Perform CodeQL Analysis

程式碼掃描警示

適用於 Azure DevOps 程式代碼掃描警示的 GitHub 進階安全性包含程式碼層級應用程式弱點警示的存放庫的程式代碼掃描旗標。

若要使用程式代碼掃描,您必須先設定 Azure DevOps 的 GitHub 進階安全性。

Azure DevOps 中 Repos 底下的 [進階安全性] 索引標籤是用來檢視程式代碼掃描警示的中樞。 選取 [ 程序代碼掃描] 索引 標籤以檢視掃描警示。 您可以依分支、狀態、管線、規則類型和嚴重性進行篩選。 此時,警示中樞不會顯示在PR分支上完成掃描的警示。

如果重新命名管線或分支,則結果不會有任何影響,最多可能需要 24 小時才會顯示新名稱。

如果您選擇執行自定義 CodeQL 查詢,則根據預設,不會針對從不同查詢套件產生的警示個別篩選。 您可以依規則進行篩選,每個查詢各有不同。

程式代碼掃描存放庫警示的螢幕快照。

如果您關閉存放庫的進階安全性,您會失去 [進階安全性] 索引標籤和建置工作中結果的存取權。 建置工作不會失敗,但當停用進階安全性時,會以工作執行的任何建置結果,且不會保留。

警示詳細資料

如需詳細資訊,請選取警示,包括補救指引。 每個警示都包含位置、描述、範例和嚴重性。

程式代碼掃描警示詳細數據的螢幕快照。

區段 說明
Location [位置]段會詳細說明 CodeQL 偵測到弱點的特定實例。 如果有多個違反相同規則的程式代碼實例,就會為每個不同的位置產生新的警示。 [位置] 卡片包含受影響代碼段的直接連結,因此您可以選取要導向至 Azure DevOps Web UI 的代碼段進行編輯。
描述 根據問題,CodeQL 工具會提供描述。
建議 建議針對指定的程式代碼掃描警示進行建議修正。
範例 範例區段顯示程式代碼中已識別弱點的簡化範例。
嚴重性 嚴重性層級可以是低、中、高或嚴重。 嚴重性分數是以所識別常見弱點列舉 (CWE) 的給定常見弱點評分系統 (CVSS) 分數為基礎。 在此 GitHub 部落格文章深入瞭解嚴重性如何評分。

檢視存放庫的警示

具有存放庫參與者許可權的任何人都可以在 [Repos] 下的 [進階安全性] 索引卷標中檢視存放庫的所有警示摘要。 選取 [ 程序代碼掃描] 索引 標籤,以檢視所有秘密掃描警示。

若要顯示結果,程式代碼掃描工作必須先執行。 第一次掃描完成後,任何偵測到的弱點都會顯示在 [進階安全性] 索引卷標中。

根據預設,警示頁面會顯示存放庫預設分支的相依性掃描結果。

指定的警示狀態會反映預設分支和最新執行管線的狀態,即使警示存在於其他分支和管線上也一樣。

關閉程式代碼掃描警示

若要關閉警示,您需要適當的許可權。 根據預設,只有專案管理員可以關閉進階安全性警示。

若要關閉警示:

  1. 流覽至您想要關閉的警示,然後選取警示。
  2. 選取 [ 關閉警示] 下拉式清單。
  3. 如果尚未選取,請選取 [ 接受風險] 或 [誤判 ] 作為關閉原因。
  4. 在 [批注] 文本框中新增選擇性批注
  5. 選取 [ 關閉 ] 以提交並關閉警示。
  6. 警示狀態會從 [開啟] 變更為 [已關閉] ,並顯示關閉原因。

如何關閉程式代碼掃描警示的螢幕快照。

此動作只會關閉所選分支的警示。 包含相同弱點的其他分支會保持作用中,直到關閉為止。 先前關閉的任何警示都可以手動重新開啟。

管理提取要求的程式代碼掃描警示

如果在提取要求中為新的程式碼變更建立警示,警示會在提取要求的 [概觀] 索引卷標的批註區段中回報為批註,並在 [進階安全性存放庫] 索引卷標中作為警示。提取要求分支有新的分支選擇器專案。

您可以檢閱受影響的程式代碼行、查看尋找的摘要,以及解決概觀一節中的批注。

作用中程序代碼提取要求批注的螢幕快照。

若要關閉提取要求警示,您必須流覽至警示詳細數據檢視,以關閉警示並解決批注。 否則,只要變更批注狀態 (1) 即可解析批注,但不會關閉或修正基礎警示。

已關閉程序代碼提取要求批注的螢幕快照。

若要查看提取要求分支的整個結果集,請流覽至 [Repos>進階安全性],然後選取您的提取要求分支。 在註釋上選取 [顯示更多詳細數據 ],會將您導向 [進階安全性] 索引卷標的 [警示詳細數據] 檢視。

提示

只有在受影響的程式代碼行與提取要求的目標分支相比,提取要求差異完全是唯一的時,才會建立批注。