
Um workshop de CodeQL abordando CVE-2021-21380
Neste workshop, usaremos raciocínio sintático e semântico para encontrar uma injeção de SQL no componente de avaliação da plataforma XWiki documentada pela CVE-2021-21380
Complete esta seção antes do workshop, se possível.
Instale o Visual Studio Code.
Instale a extensão CodeQL para Visual Studio Code.
Você não precisa instalar o CLI do CodeQL: a extensão cuidará disso para você.
Clone este repositório:
git clone https://github.com/advanced-security/codeql-workshop-cve-2021-21380.git
xwiki-platform-CVE-2021-21380.zip na exibição do Explorer e selecione o comando CodeQL: Set Current Database.Cmd/Ctrl+Shift+P), pesquise e execute o comando CodeQL: Install Pack Dependencies.github na caixa para filtrar a lista.cve-2021-21380-exercises, cve-2021-21380-exercises-tests, cve-2021-21380-solutions e cve-2021-21380-solutions-tests.O workshop é dividido em vários exercícios que apresentam o suporte da linguagem QL para Java e termina com uma consulta final para encontrar a injeção de SQL conhecida. Nestes exercícios, você aprenderá:
Neste workshop, procuraremos por vulnerabilidades de injeção de SQL conhecidas no componente da API de avaliações do XWiki Platform. Essas vulnerabilidades podem ocorrer em aplicações quando informações controladas por um usuário externo chegam ao código da aplicação que constrói e executa uma consulta SQL de forma insegura.
A injeção de SQL conhecida discutida neste workshop é revisada em GHSA-79rg-7mv3-jrr5 no GitHub Advisory Database. Para encontrar a injeção de SQL e possíveis variantes, vamos resolver os seguintes subproblemas:
Nos primeiros exercícios, raciocinaremos sobre informações sintáticas, usando a Árvore Sintática Abstrata (AST), para identificar:
Encontre todos os métodos com o nome getAverageRating e o tipo declarante no programa completando a consulta exercise1.ql
java fornece uma classe Method para raciocinar sobre métodos em um programa.Method fornece os predicados membros getName e hasName para raciocinar sobre o nome de um método.Method fornece o membro getDeclaringType para raciocinar sobre o tipo que declara o método.Uma solução pode ser encontrada na consulta exercise1.ql
Uma solução para o exercício 1 retorna uma lista de métodos. Alguns são definidos em uma interface chamada RatingsManager e outros são definidos nas classes AbstractRatingsManager e RatingsScriptService.
A partir das informações retornadas pela consulta e da documentação de componentes do XWiki podemos deduzir que:
Role, e uma implementação anotada com Component.ScriptService é tornado acessível a páginas wiki por meio de scripts.Encontre todas as classes anotadas com a anotação Component completando a consulta exercise2.ql.
Observe que o nome totalmente qualificado do tipo da anotação é org.xwiki.component.annotation.Component.
this no /predicado característico/.Class fornece um método getAnAnnotation para obter anotações associadas.Annotation fornece o predicado membro getType para raciocinar sobre seu tipo.Type fornece os predicados membros getName e hasName para raciocinar sobre o nome de um tipo.RefType, que representa classes e interfaces, fornece os predicados membros getQualifiedName e hasQualifiedName para raciocinar sobre o nome totalmente qualificado do reftype.Uma solução pode ser encontrada na consulta exercise2.ql
Encontre todos os componentes que implementam a interface ScriptService completando a consulta excercise3.ql
Class fornece o predicado membro getASuperType para raciocinar sobre os supertipos de uma classe, ou seja, os tipos que ela extends ou implements.