
Семинар по CodeQL, посвящённый CVE-2021-21380
В этом практикуме мы будем использовать синтаксические и семантические рассуждения, чтобы найти SQL-инъекцию в компоненте API рейтингов платформы XWiki, описанную в CVE-2021-21380.
Пожалуйста, по возможности выполните этот раздел до начала практикума.
Установите Visual Studio Code.
Установите расширение CodeQL для Visual Studio Code.
Вам не нужно устанавливать CodeQL CLI: расширение сделает это за вас.
Клонируйте этот репозиторий:
git clone https://github.com/advanced-security/codeql-workshop-cve-2021-21380.git
xwiki-platform-CVE-2021-21380.zip в представлении Explorer и выберите команду CodeQL: Set Current Database.Cmd/Ctrl+Shift+P) найдите и выполните команду CodeQL: Install Pack Dependencies.github в поле, чтобы отфильтровать список.cve-2021-21380-exercises, cve-2021-21380-exercises-tests, cve-2021-21380-solutions и cve-2021-21380-solutions-tests.Практикум разделён на несколько упражнений, знакомящих с поддержкой языка QL для Java, и завершается итоговым запросом для поиска известной SQL-инъекции. В этих упражнениях вы научитесь:
На этом практикуме мы будем искать известные уязвимости SQL-инъекций в компоненте API рейтингов XWiki Platform. Такие уязвимости могут возникать в приложениях, когда информация, контролируемая внешним пользователем, попадает в код приложения, который небезопасно формирует SQL-запрос и выполняет его.
Известная SQL-инъекция, рассматриваемая на этом практикуме, описана в GHSA-79rg-7mv3-jrr5 в GitHub Advisory Database. Чтобы найти SQL-инъекцию и возможные варианты, мы перейдём к следующим подзадачам:
В первых нескольких упражнениях мы будем рассуждать о синтаксической информации, используя абстрактное синтаксическое дерево (AST), чтобы определить:
Найдите все методы с именем getAverageRating и их объявляющий тип в программе, дополнив запрос exercise1.ql
java предоставляет класс Method для рассуждений о методах в программе.Method предоставляет предикаты-члены getName и hasName для рассуждений об имени метода.Method предоставляет член getDeclaringType для рассуждений о типе, который объявляет метод.Решение можно найти в запросе exercise1.ql
Решение упражнения 1 возвращает список методов. Некоторые из них определены в интерфейсе RatingsManager, а некоторые — в классах AbstractRatingsManager и RatingsScriptService.
На основе информации, возвращённой запросом, и документации по компонентам XWiki можно сделать вывод, что:
Role, и реализации, аннотированной Component.ScriptService, становится доступным вики-страницам через скрипты.Найдите все классы, аннотированные аннотацией Component, дополнив запрос exercise2.ql.
Обратите внимание, что полное имя типа аннотации — org.xwiki.component.annotation.Component.
this в /характеристическом предикате/.Class предоставляет метод getAnAnnotation для получения связанных аннотаций.Annotation предоставляет предикат-член getType для рассуждений о его типе.Type предоставляет предикаты-члены getName и hasName для рассуждений об имени типа.RefType, представляющий классы и интерфейсы, предоставляет предикаты-члены getQualifiedName и hasQualifiedName для рассуждений о полном имени ref-типа.Решение можно найти в запросе exercise2.ql
Найдите все компоненты, которые реализуют интерфейс ScriptService, дополнив запрос excercise3.ql
Class предоставляет предикат-член getASuperType для рассуждений о супертипах класса, то есть типах, которые он расширяет (extends) или реализует (implements).Решение можно найти в запросе exercise3.ql