Informazioni su CodeQL

Completato

CodeQL è il motore di analisi usato dagli sviluppatori per automatizzare i controlli di sicurezza e dai ricercatori della sicurezza per eseguire l'analisi delle varianti.

In CodeQL il codice viene trattato come dati. Vulnerabilità, bug e altri errori di sicurezza vengono modellati come query che possono essere eseguite nei database estratti dal codice. È possibile eseguire le query standard di CodeQL, scritte da ricercatori e collaboratori della community di GitHub, oppure scrivere query specifiche per usarle nelle analisi personalizzate. Le query che individuano potenziali bug evidenziano il risultato direttamente nel file di origine.

In questa unità verranno fornite informazioni sullo strumento di analisi statica CodeQL e sul modo in cui usa database, gruppi di query e Language Pack di query per eseguire l'analisi delle varianti.

Analisi delle varianti

L'analisi delle varianti è il processo di utilizzo di una vulnerabilità di sicurezza nota come valore di inizializzazione per individuare problemi simili nel codice. Si tratta di una tecnica usata dai tecnici della sicurezza per identificare potenziali vulnerabilità e assicurarsi che queste minacce siano corrette in più codebase.

L'esecuzione di query sul codice con CodeQL è il modo più efficiente per eseguire l'analisi delle varianti. È possibile usare le query CodeQL standard per identificare le vulnerabilità iniziali o individuare nuove vulnerabilità scrivendo query CodeQL personalizzate. Quindi, è possibile sviluppare o eseguire quindi l'iterazione della query per trovare automaticamente varianti logiche dello stesso bug che potrebbero non essere rilevate con tecniche manuali tradizionali.

Database CodeQL

I database CodeQL contengono dati queryable estratti da una codebase per un singolo linguaggio in un determinato momento. Il database contiene una rappresentazione gerarchica completa del codice, inclusa una rappresentazione dell'albero sintattico astratto, il grafico del flusso di dati e il grafico del flusso di controllo.

Ogni linguaggio ha uno schema di database univoco che definisce le relazioni usate per creare un database. Lo schema fornisce un'interfaccia tra l'analisi lessicale iniziale eseguita durante il processo di estrazione e l'analisi complessa effettiva dell'analizzatore di query di CodeQL. Lo schema specifica, ad esempio, che è presente una tabella per ogni costrutto di linguaggio.

Per ogni linguaggio, le librerie di CodeQL definiscono le classi per fornire un livello di astrazione sulle tabelle di database. In questo modo viene fornita una visualizzazione dei dati, orientata agli oggetti che semplifica la scrittura di query.

In un database CodeQL per un programma Java, ad esempio, due tabelle chiave sono:

  • La tabella expressions, contenente una riga per ogni singola espressione nel codice sorgente analizzato durante il processo di compilazione.
  • La tabella statements, contenente una riga per ogni singola istruzione nel codice sorgente analizzato durante il processo di compilazione.

La libreria di CodeQL definisce le classi per fornire un livello di astrazione su ognuna di queste tabelle e sulle tabelle ausiliarie correlate: Expr e Stmt.

Gruppi di query

I gruppi di query CodeQL consentono di selezionare le query in base al nome file, alle proprietà dei metadati o alla posizione su disco o in un pacchetto QL. Creare gruppi di query per le query da usare di frequente nelle analisi di CodeQL.

I gruppi di query consentono di passare più query a CodeQL senza dover specificare il percorso di ogni file di query singolarmente. Le definizioni dei gruppi di query vengono archiviate nei file YAML con l'estensione .qls. Una definizione di suite è una sequenza di istruzioni, dove ogni istruzione è un mapping YAML con (in genere) una singola chiave. Le istruzioni vengono eseguite nell'ordine in cui vengono visualizzate nella definizione del gruppo di query. Dopo l'esecuzione di tutte le istruzioni nella definizione del gruppo, il risultato è un set di query selezionate.

Gruppi di query predefiniti

Sono disponibili due gruppi di query predefiniti per CodeQL:

  • default: Queste sono le query eseguite per impostazione predefinita nell'analisi del codice CodeQL in GitHub, disponibile con la configurazione predefinita dell'analisi del codice. Le query in questa suite di query sono estremamente precise e restituiscono pochi risultati di analisi del codice falsi positivi. Rispetto al gruppo di query security-extended, la suite predefinita restituisce un minor numero di risultati di analisi del codice con attendibilità bassa.
  • security-extended: Questa suite contiene tutte le query della suite default, oltre a query di sicurezza aggiuntive con precisione e gravità leggermente inferiori. È disponibile con la configurazione predefinita dell'analisi del codice ed è indicata come 'Estesa' come opzione nell'elenco a discesa dei gruppi di query. Rispetto alla suite di query default, questa suite può restituire un numero maggiore di risultati di analisi del codice falso positivo.

La configurazione predefinita dell'analisi del codice userà la suite di query default. Questa operazione può essere modificata selezionando l'icona di overflow per visualizzare la configurazione codeQL e quindi selezionando il pulsante modifica. Nelle "Impostazioni di analisi" è possibile scegliere una delle due opzioni descritte come suite di query.

Pacchetti CodeQL

I pacchetti CodedQL vengono usati per organizzare i file usati nell'analisi CodeQL, in modo da poter creare, condividere, dipendere ed eseguire facilmente query e librerie CodeQL. Contengono query, file di libreria, gruppi di query e metadati importanti. Con i pacchetti CodeQL e i comandi di gestione dei pacchetti nell'interfaccia della riga di comando di CodeQL, è possibile pubblicare le query personalizzate e integrarle nell'analisi della codebase.

Esistono tre tipi di pacchetti CodeQL: pacchetti di query, pacchetti di libreria e pacchetti di modelli.

  • I pacchetti di query sono progettati per essere eseguiti. Quando viene pubblicato un query pack, il bundle include tutte le dipendenze transitive e le rappresentazioni precompilate di ogni query, oltre alle origini di query. In questo modo si garantisce un'esecuzione coerente ed efficiente delle query nel pacchetto.
  • I pacchetti di libreria sono progettati per essere usati da pacchetti di query (o da altri pacchetti di libreria) e non contengono le query stesse. Le librerie non vengono compilate separatamente.
  • I pacchetti di modelli possono essere usati per espandere l'analisi del codice includendo dipendenze non supportate di default. I pacchetti di modelli sono attualmente in versione beta e sono soggetti a modifiche. Durante la versione beta, i pacchetti di modello sono disponibili per l'analisi Java a livello di repository. Per altre informazioni sulla creazione di pacchetti di modelli personalizzati, vedere "Creazione di un pacchetto di modelli CodeQL".

Struttura dei pacchetti CodeQL

L'interfaccia della riga di comando codeQL può essere usata per sviluppare e pubblicare un pacchetto usando il pack init comando . Questo comando creerà la struttura di directory e i file necessari, includendo il file principale denominato qlpack.yml nella directory radice. I metadati in ogni file qlpack.yml indicano a CodeQL come compilare tutte le query nel pacchetto, le librerie da cui dipende il pacchetto e dove trovare le definizioni del gruppo di query.

Il contenuto del pacchetto CodeQL (query o librerie usate nell'analisi CodeQL) viene incluso nella stessa directory di qlpack.yml o nelle relative sottodirectory.

La directory contenente il file qlpack.yml funge da directory radice per il contenuto del pacchetto CodeQL. Ovvero, per tutti i .ql file e .qlls nel pacchetto, CodeQL risolverà tutte le istruzioni di importazione relative alla directory contenente il file qlpack.yml nella radice del pacchetto.

Di seguito è riportato un esempio di un file qlpack.yml:

name: codeql/java-queries
version: 0.0.6-dev
groups: java
suites: codeql-suites
extractor: java
defaultSuiteFile: codeql-suites/java-code-scanning.qls
dependencies:
    codeql/java-all: "*"
    codeql/suite-helpers: "*"

Per altre informazioni sulla creazione e la pubblicazione di pacchetti CodeQL personalizzati, vedere "Pubblicazione e uso di pacchetti CodeQL".[1]