Condividi tramite


Analisi del codice

L'analisi del codice in GitHub Advanced Security per Azure DevOps consente di analizzare il codice in un repository Azure DevOps per individuare vulnerabilità di sicurezza ed errori di codifica. Eventuali problemi identificati dall'analisi vengono generati come avviso. L'analisi del codice usa CodeQL per identificare le vulnerabilità.

CodeQL è il motore di analisi del codice sviluppato da GitHub per automatizzare i controlli di sicurezza. È possibile analizzare il codice usando CodeQL e visualizzare i risultati come avvisi di analisi del codice.

GitHub Advanced Security per Azure DevOps funziona con Azure Repos. Per usare GitHub Advanced Security con i repository GitHub, vedere GitHub Advanced Security.

Avvisi codeQL

Gli esperti di GitHub, i ricercatori della sicurezza e i collaboratori della community scrivono e mantengono le query CodeQL predefinite usate per l'analisi del codice. Le query vengono aggiornate regolarmente per migliorare l'analisi e ridurre eventuali risultati falsi positivi. Le query sono open source, quindi è possibile visualizzare e contribuire alle query nel repository github/codeql .

Per una documentazione più specifica su CodeQL, vedere la documentazione di CodeQL su GitHub.

CodeQL supporta linguaggi compilati e interpretati e può trovare vulnerabilità ed errori nel codice scritto nei linguaggi supportati.

  • C/C++
  • C#
  • Go
  • Java
  • JavaScript/TypeScript
  • Kotlin (beta)
  • Python
  • Ruby
  • Swift

Per altre informazioni, vedere la documentazione sul sito Web CodeQL in Linguaggi e framework supportati.

È possibile visualizzare le query e i dettagli dell'attività specifici usati da CodeQL esaminando il log di compilazione, in modo analogo all'analisi delle dipendenze.

Screenshot dell'attività di pubblicazione dei risultati dell'analisi del codice

Avvisi di analisi del codice

Gli avvisi di analisi del codice di GitHub Advanced Security per Azure DevOps includono flag di analisi del codice per repository che avvisano le vulnerabilità dell'applicazione a livello di codice.

Per usare l'analisi del codice, è prima necessario configurare GitHub Advanced Security per Azure DevOps.

La scheda Sicurezza avanzata in Repository in Azure DevOps è l'hub per visualizzare gli avvisi di analisi del codice. Selezionare la scheda Analisi codice per visualizzare gli avvisi di analisi. È possibile filtrare per ramo, stato, pipeline, tipo di regola e gravità. Al momento, l'hub degli avvisi non visualizza gli avvisi per l'analisi completata nei rami delle richieste pull.

Non esiste alcun effetto sui risultati se le pipeline o i rami vengono rinominati. Potrebbero essere necessarie fino a 24 ore prima che venga visualizzato il nuovo nome.

Se si sceglie di eseguire query CodeQL personalizzate, non esiste per impostazione predefinita un filtro separato per gli avvisi generati da query pack diversi. È possibile filtrare in base alla regola, che è distinta per ogni query.

Screenshot dell'analisi del codice degli avvisi per un repository

Se si disattiva Sicurezza avanzata per il repository, si perde l'accesso ai risultati nella scheda Sicurezza avanzata e nell'attività di compilazione. L'attività di compilazione non ha esito negativo, ma i risultati delle compilazioni vengono eseguiti con l'attività mentre la sicurezza avanzata è disabilitata sono nascoste e non mantenute.

Dettagli dell'avviso

Selezionare un avviso per altri dettagli, incluse le indicazioni sulla correzione. Ogni avviso include una posizione, una descrizione, un esempio e una gravità.

Screenshot dei dettagli dell'avviso di analisi del codice

Sezione Spiegazione
Ufficio La sezione Locations descrive in dettaglio un'istanza specifica in cui CodeQL ha rilevato una vulnerabilità. Se sono presenti più istanze del codice che violano la stessa regola, viene generato un nuovo avviso per ogni posizione distinta. La scheda Percorsi contiene un collegamento diretto al frammento di codice interessato, in modo da poter selezionare il frammento da indirizzare all'interfaccia utente Web di Azure DevOps per la modifica.
Descrizione La descrizione viene fornita dallo strumento CodeQL in base al problema.
Elemento consigliato La raccomandazione è la correzione consigliata per un determinato avviso di analisi del codice.
Esempio La sezione di esempio mostra un esempio semplificato della debolezza identificata nel codice.
Gravità I livelli di gravità possono essere bassi, medi, alti o critici. Il punteggio di gravità è basato sul punteggio cvSS (Common Vulnerability Scoring System) specificato per l'enumerazione CWE (Common Weakness Enumeration). Altre informazioni sul punteggio della gravità sono disponibili in questo post di blog di GitHub.

Gestire gli avvisi di analisi del codice

Visualizzazione degli avvisi per un repository

Chiunque disponga delle autorizzazioni di collaboratore per un repository può visualizzare un riepilogo di tutti gli avvisi per un repository nella scheda Sicurezza avanzata in Repository. Selezionare la scheda Analisi codice per visualizzare tutti gli avvisi di analisi dei segreti.

Per visualizzare i risultati, è necessario eseguire prima le attività di analisi del codice. Al termine della prima analisi, tutte le vulnerabilità rilevate vengono visualizzate nella scheda Sicurezza avanzata.

Per impostazione predefinita, nella pagina degli avvisi vengono visualizzati i risultati dell'analisi delle dipendenze per il ramo predefinito del repository.

Lo stato di un determinato avviso riflette lo stato per il ramo predefinito e la pipeline di esecuzione più recente, anche se l'avviso esiste in altri rami e pipeline.

Ignorare gli avvisi di analisi del codice

Per ignorare gli avvisi, sono necessarie autorizzazioni appropriate. Per impostazione predefinita, solo gli amministratori del progetto possono ignorare gli avvisi di sicurezza avanzata.

Per ignorare un avviso:

  1. Passare all'avviso da chiudere e selezionare l'avviso.
  2. Selezionare l'elenco a discesa Chiudi avviso .
  3. Se non è già selezionata, selezionare Rischio accettato o Falso positivo come motivo di chiusura.
  4. Aggiungere un commento facoltativo nella casella di testo Commento .
  5. Selezionare Chiudi per inviare e chiudere l'avviso.
  6. Lo stato dell'avviso passa da Apri a Chiuso e viene visualizzato il motivo di chiusura.

Screenshot di come ignorare un avviso di analisi del codice

Questa azione ignora solo l'avviso per il ramo selezionato. Altri rami che contengono la stessa vulnerabilità rimangono attivi fino a quando non vengono ignorati. Qualsiasi avviso ignorato in precedenza può essere riaperto manualmente.

Uso di query personalizzate con CodeQL

Per impostazione predefinita, se non è stato specificato un file di configurazione personalizzato nella configurazione della pipeline, CodeQL esegue il security-extended pacchetto di query per analizzare il codice. È possibile usare query CodeQL personalizzate per scrivere query personalizzate per individuare vulnerabilità ed errori specifici. È anche necessario creare un file di configurazione personalizzato per modificare l'analisi predefinita di CodeQL.

Per trovare query personalizzate esistenti o per contribuire alla propria query personalizzata, vedere Contributi a CodeQL.

Analisi con query personalizzate

Il modo più rapido per iniziare con una query personalizzata consiste nel scrivere una query e salvarla nel repository DevOps di Azure locale. È possibile personalizzare i dettagli di una query personalizzata in base alle esigenze, ma deve avere almeno un ID regola. Per altre informazioni su come scrivere una query CodeQL personalizzata, vedere Scrittura di query CodeQL. È anche possibile raggruppare più query in un gruppo di query o utilizzare pacchetti pubblicati da altri utenti. Per altre informazioni, vedere Pubblicazione e uso di pacchetti CodeQL.

Utilizzo di un file di configurazione personalizzato

Un file di configurazione personalizzato è un modo per gestire le query eseguite durante l'analisi di CodeQL sul codice. È possibile specificare più query o query pack da eseguire e modificare o disabilitare le query CodeQL predefinite.

Per includere una query specifica da includere, specificare la query con un nome e un percorso per il percorso del file di query (con estensione ql) nel repository.

Per includere un pacchetto specifico da includere, specificare il nome del pacchetto. È possibile specificare un numero qualsiasi di Query Pack codeQL da eseguire nel file di configurazione.

Il passaggio successivo consiste nel creare un qlpack.yml file. Questo file dichiara il pacchetto CodeQL e le informazioni su di esso. Tutti i *.ql file nella stessa directory (o sottodirectory) di un qlpack.yml vengono considerati parte del pacchetto.

Suggerimento

Il filtro packs dal file di configurazione supporta il download dei pacchetti dai repository ospitati in GitHub, anche se il filtro queries non lo fa. Se il pacchetto è privato in GitHub, è necessario fornire un token di accesso GitHub tramite l'attività AdvancedSecurity-Codeql-Init@1 come variabile di ambiente e nome di variabile come GITHUB_TOKEN, con l'ambito del token come read:packages.

Di seguito è riportato un esempio di file di configurazione.

name: "Run custom queries"

# When using a configuration file, if you do not disable default queries,
# then the default CodeQL queries in the `code-scanning` query suite will also execute upon analysis.
disable-default-queries: true
 
# To reference local queries saved to your repository,
# the path must start with `./` followed by the path to the custom query or queries.
# Names for each query referenced is optional.
queries:
  - name: Use security-extended query suite
    uses: security-extended
  - name: Use local custom query (single query)
    uses: ./customQueries/javascript/FindTestFunctions.ql
  - name: Use local custom query (directory of queries)
    uses: ./customQueries/javascript/MemoryLeakQueries  
 
packs:
 - mygithuborg/mypackname
 
paths:
 - src
 
paths-ignore:
  - src/node_modules
  - '**/*.test.js'
 
query-filters:
 - include:
    kind: problem
 - include:
     precision: medium
 - exclude:
    id:
      - js/angular/disabling-sce
      - js/angular/insecure-url-allowlist

Suggerimento

Le specifiche dei file di configurazione ignorano e hanno la precedenza sulle configurazioni a livello di pipeline per l'attività AdvancedSecurity-Codeql-Init@1 . includepaths / ignorepaths verrà ignorato o, se paths/paths-ignore presenti, sovrascritto con i valori di paths/paths-ignore. querysuite verrà sovrascritto con i valori specificati in queries o packs nel file di configurazione.

Se si usa una query personalizzata, di seguito è riportato un esempio qlpack.yml inserito nella directory delle query personalizzate:

version: 1.0.1
dependencies:
  codeql/javascript-all: "*"
  codeql/javascript-queries: "*"

La dependencies variabile contiene tutte le dipendenze di questo pacchetto e i relativi intervalli di versioni compatibili. A ogni dipendenza viene fatto riferimento come di scope/name un pacchetto di libreria CodeQL. Quando si definisce dependencies, dipende qlpack.yml esattamente da uno dei Language Pack principali (ad esempio, JavaScript, C#, Ruby e così via), che determina il linguaggio che la query può analizzare.

Per consigli e opzioni di configurazione più specifici con il file di configurazione, vedere Personalizzazione dell'installazione avanzata per l'analisi del codice o per qlpack.yml l'installazione, vedere Struttura del pacchetto CodeQL.

Dopo aver creato il file di configurazione, è necessario personalizzare la pipeline che esegue l'analisi CodeQL per usare il nuovo file. Ecco una pipeline di esempio che punta a un file di configurazione:

trigger: none
 
pool:
  vmImage: windows-latest

# You can either specify your CodeQL variables in a variable block... 
variables:
# `configfilepath` must be an absolute file path relative to the repository root
  advancedsecurity.codeql.configfilepath: '$(build.sourcesDirectory)/.pipelines/steps/configfile.yml' 

# Or you can specify variables as variables for the task. You do not need both definitions. 
steps:
- task: AdvancedSecurity-Codeql-Init@1
  displayName: Initialize CodeQL
  inputs:
    languages: 'javascript'
    loglevel: '2'
    configfilepath: '$(build.sourcesDirectory)/.pipelines/steps/configfile.yml'
# If downloading a pack from GitHub,
# you must include a GitHub access token with the scope of `read:packages`.
  env:
    GITHUB_TOKEN: $(githubtoken)
 
- task: AdvancedSecurity-Codeql-Autobuild@1
  displayName: AutoBuild
 
- task: AdvancedSecurity-Codeql-Analyze@1
  displayName: Perform CodeQL Analysis

Risoluzione dei problemi di analisi del codice

In genere, se si verificano errori con l'esecuzione di CodeQL, l'interfaccia della riga di comando codeQL segnala lo stato di ogni comando eseguito come codice di uscita. Il codice di uscita fornisce informazioni per i comandi successivi o per altri strumenti che si basano sull'interfaccia della riga di comando codeQL. Per altre informazioni sui dettagli del codice di uscita, vedere Codici di uscita.

Errore: comando CodeQL 'database finalize' (32)

Questo errore indica un problema con la finalizzazione della creazione del database CodeQL, potenzialmente a causa di errori di estrazione o passaggi di compilazione mancanti.

Passaggi per la risoluzione dei problemi:

  1. Verificare che il codice esista e che sia compilato
    • Per i linguaggi compilati, verificare che il processo di compilazione stia compilando il codice e che si stia verificando tra le AdvancedSecurity-Codeql-Init attività e AdvancedSecurity-Codeql-Analyze . I comandi di compilazione comuni e i flag obbligatori ,ad esempio clean no-cache/no-daemon, sono disponibili qui in Specifica dei comandi di compilazione.
    • Per le lingue interpretate, verificare che nel progetto sia presente un codice sorgente per la lingua specificata.
  2. Controllare gli errori di estrazione
    • Verificare se gli errori di estrazione influiscono sull'integrità del database CodeQL.
    • Esaminare il file di log per individuare gli errori di estrazione e gli avvisi per valutare l'integrità complessiva del database.
  3. Analizzare gli errori travolgenti
    • Se la maggior parte dei file rileva errori dell'estrattore, esaminare ulteriormente per comprendere la causa radice dell'estrazione non corretta.

Errore: script di compilazione automatica (1)

Questo errore descrive un errore di compilazione automatico, che suggerisce un problema relativo all'analisi del codice durante l'installazione o la configurazione.

Passaggi per la risoluzione dei problemi:

  1. Configurare i passaggi di compilazione

Errore: Directory CodeQL non trovate nella cache degli strumenti agente

Questo errore indica un problema relativo all'installazione di CodeQL per gli agenti self-hosted.

Passaggi per la risoluzione dei problemi:

  1. Vedere linee guida per l'installazione o script di configurazione forniti in Configurare la sicurezza avanzata di GitHub per Azure DevOps.

Errore: variabile della pipeline di linguaggio non impostata

Questo errore si verifica quando si tenta di eseguire CodeQL senza impostare la variabile della pipeline che specifica le lingue da analizzare.

Passaggi per la risoluzione dei problemi:

  1. Impostare la variabile della pipeline del linguaggio

CodeQL che non restituisce risultati

Questa sezione fornisce indicazioni per le situazioni in cui l'analisi CodeQL non produce risultati.

Passaggi per la risoluzione dei problemi:

  1. Verificare la presenza di vulnerabilità rilevate
    • Considerare la possibilità che il codice non abbia effettivamente vulnerabilità. Se le vulnerabilità sono previste ma non rilevate, procedere con la verifica.
  2. Esaminare la configurazione del gruppo di query
    • Confermare l'uso del gruppo di query e prendere in considerazione il passaggio a una suite più completa, se necessario.
    • In alternativa, è possibile creare pacchetti di query personalizzati per l'analisi personalizzata.
  3. Modificare le autorizzazioni per la visualizzazione dei risultati
    • Assicurarsi che le autorizzazioni appropriate, almeno a livello di collaboratore, vengano concesse per accedere ai risultati dell'analisi. Per altre informazioni, vedere Autorizzazioni di sicurezza avanzata.

Timeout codeQL

Se l'attività AdvancedSecurity-Codeql-Analyze@1 viene visualizzata This job was abandoned ... we lost contact with the agent e si usa un agente Microsoft ospitato, l'attività raggiunge il timeout predefinito di sei ore per gli agenti ospitati a pagamento. In alternativa, è possibile tentare di eseguire l'analisi su un agente self-hosted.

Autorizzazioni per le attività di analisi del codice

L'attività di compilazione di analisi del codice usa l'identità della pipeline per chiamare le API REST di sicurezza avanzata. Per impostazione predefinita, le pipeline nello stesso progetto hanno accesso per caricare il file SARIF generato eseguendo l'analisi CodeQL. Se queste autorizzazioni vengono rimosse dall'account del servizio di compilazione o se si dispone di un'installazione personalizzata , ad esempio una pipeline ospitata in un progetto diverso dal repository, è necessario concedere queste autorizzazioni manualmente.

Passaggi per la risoluzione dei problemi:

  • Concedere Advanced Security: View alerts e Advanced Security: Manage and dismiss alerts l'autorizzazione all'account del servizio di compilazione usato nella pipeline, che per le pipeline con ambito progetto è [Project Name] Build Service ([Organization Name])e per le pipeline con ambito raccolta è Project Collection Build Service ([Organization Name]).

Installazione manuale del bundle CodeQL nell'agente self-hosted

Installare il bundle CodeQL nella cache degli strumenti dell'agente usando lo script di installazione per l'architettura, disponibile in GitHub. Questi script richiedono che la $AGENT_TOOLSDIRECTORY variabile di ambiente sia impostata sul percorso della directory degli strumenti dell'agente nell'agente, ad esempio C:/agent/_work/_tool. In alternativa, è possibile implementare manualmente i passaggi seguenti:

  1. Selezionare il bundle di versione codeQL più recente da GitHub.
  2. Scaricare e decomprimere il bundle nella directory seguente all'interno della directory degli strumenti dell'agente, in genere disponibile in _work/_tool: ./CodeQL/0.0.0-[codeql-release-bundle-tag]/x64/. Usando la versione corrente di , il nome della v2.16.0cartella sarà denominato ./CodeQL/0.0.0-codeql-bundle-v2.16.0/x64/. Altre informazioni sulla directory degli strumenti dell'agente.
  3. Creare un file vuoto denominato x64.complete all'interno della ./CodeQL/0.0.0-[codeql-release-bundle-tag] cartella . Usando l'esempio precedente, il percorso del file finale del x64.complete file deve essere ./CodeQL/0.0.0-codeql-bundle-v2.16.0/x64.complete.