
Un workshop CodeQL che copre CVE-2021-21380
In questo workshop useremo il ragionamento sintattico e semantico per trovare una SQL injection nel componente di valutazione della piattaforma XWiki documentata da CVE-2021-21380.
Ti preghiamo di completare questa sezione prima del workshop, se possibile.
Installa Visual Studio Code.
Installa l'estensione CodeQL per Visual Studio Code.
Non è necessario installare il CodeQL CLI: l'estensione lo gestirà per te.
Clona questo repository:
git clone https://github.com/advanced-security/codeql-workshop-cve-2021-21380.git
xwiki-platform-CVE-2021-21380.zip nella vista Explorer e seleziona il comando CodeQL: Set Current Database.Cmd/Ctrl+Shift+P), cerca ed esegui il comando CodeQL: Install Pack Dependencies.github nella casella per filtrare l'elenco.cve-2021-21380-exercises, cve-2021-21380-exercises-tests, cve-2021-21380-solutions e cve-2021-21380-solutions-tests.Il workshop è suddiviso in diversi esercizi che introducono il supporto del linguaggio QL per Java e termina con una query finale per trovare la SQL injection nota. In questi esercizi imparerai:
In questo workshop cercheremo delle vulnerabilità di SQL injection note nel componente API di valutazione della XWiki Platform. Tali vulnerabilità possono verificarsi nelle applicazioni quando informazioni controllate da un utente esterno raggiungono codice applicativo che costruisce in modo non sicuro una query SQL e la esegue.
La SQL injection nota discussa in questo workshop è recensita in GHSA-79rg-7mv3-jrr5 nel GitHub Advisory Database. Per trovare la SQL injection, e le possibili varianti, ci occuperemo dei seguenti sottoproblemi:
Nei primi esercizi ragioneremo sulle informazioni sintattiche, usando l'Abstract Syntax Tree (AST), per identificare:
Trova tutti i metodi con nome getAverageRating e il loro tipo dichiarante nel programma completando la query exercise1.ql
java fornisce una classe Method per ragionare sui metodi di un programma.Method fornisce i predicati membro getName e hasName per ragionare sul nome di un metodo.Method fornisce il membro getDeclaringType per ragionare sul tipo che dichiara il metodo.Una soluzione si trova nella query exercise1.ql
Una soluzione all'esercizio 1 restituisce un elenco di metodi. Alcuni di essi sono definiti in un'interfaccia chiamata RatingsManager, altri sono definiti nelle classi AbstractRatingsManager e RatingsScriptService.
Dalle informazioni restituite dalla query e dalla documentazione dei componenti XWiki possiamo dedurre che:
Role, e da un'implementazione annotata con Component.ScriptService viene reso accessibile alle pagine wiki tramite scripting.Trova tutte le classi annotate con l'annotazione Component completando la query exercise2.ql.
Nota che il nome completo del tipo dell'annotazione è org.xwiki.component.annotation.Component.
this nel /predicato caratteristico/.Class fornisce un metodo getAnAnnotation per ottenere le annotazioni associate.Annotation fornisce il predicato membro getType per ragionare sul suo tipo.Type fornisce i predicati membro getName e hasName per ragionare sul nome di un tipo.RefType, che rappresenta classi e interfacce, fornisce i predicati membro getQualifiedName e hasQualifiedName per ragionare sul nome completo del reftype.Una soluzione si trova nella query exercise2.ql
Trova tutti i componenti che implementano l'interfaccia ScriptService completando la query excercise3.ql