Что такое CodeQL?
CodeQL — это подсистема анализа, используемая разработчиками для автоматизации проверок безопасности, а исследователями безопасности для выполнения анализа вариантов.
В CodeQL код рассматривается как данные. Уязвимости системы безопасности и разного рода ошибки моделируются в виде запросов, которые можно выполнять для баз данных, извлеченных из кода. Вы можете выполнять стандартные запросы CodeQL, написанные исследователями GitHub и участниками сообщества, или написать собственные запросы для использования в настраиваемом анализе. Если при запросе, обнаружены потенциальные ошибки, результат выделяется непосредственно в исходном файле.
В этом уроке вы узнаете о средстве статического анализа CodeQL и о том, как он использует базы данных, наборы запросов и языковые пакеты запросов для выполнения анализа вариантов.
Анализ вариантов
Анализ вариантов — это процесс использования известной уязвимости системы безопасности в качестве начального значения для поиска схожих проблем в коде. Это метод, используемый инженерами безопасности для выявления потенциальных уязвимостей и обеспечения правильной исправления этих угроз в нескольких базах кода.
Выполнение запросов к коду с помощью CodeQL — наиболее эффективный способ анализа вариантов. Для определения уязвимостей по начальному значению или поиска новых уязвимостей путем написания собственных пользовательских запросов CodeQL можно использовать стандартные запросы CodeQL. Затем вы можете разработать или выполнить итерацию по запросу, чтобы автоматически найти логические варианты той же ошибки, которую можно пропустить с помощью традиционных методов вручную.
Базы данных CodeQL
Базы данных CodeQL содержат запрашиваемые данные, извлеченные из базы кода для одного языка в определенный момент времени. База данных содержит полное иерархическое представление кода, включая представление абстрактного дерева синтаксиса, графа потока данных и графа потока управления.
Каждый язык имеет собственную уникальную схему базы данных, которая определяет связи, используемые для создания базы данных. Схема предоставляет интерфейс между первоначальным лексическим анализом, выполняемым во время извлечения, и фактическим сложным анализом вычислителя запросов CodeQL. Схема задает, например, таблицу для каждой конструкции языка.
Для каждого языка библиотеки CodeQL определяют классы, предоставляющие уровень абстракции для таблиц базы данных. Это обеспечивает объектно-ориентированное представление данных, что упрощает запись запросов.
Например, в базе данных CodeQL для программы Java существуют две ключевые таблицы:
- Таблица
expressions, содержащая строку для каждого отдельного выражения в исходном коде, который был проанализирован во время процесса сборки. - Таблица
statements, содержащая строку для каждой отдельной инструкции в исходном коде, которая была проанализирована во время процесса сборки.
Библиотека CodeQL определяет классы, предоставляющие уровень абстракции для каждой из этих таблиц (и связанных вспомогательных таблиц): Expr и Stmt.
Наборы запросов
Наборы запросов CodeQL предоставляют способ выбора запросов на основе их имени файла, свойств метаданных или расположения на диске или в пакете QL. Создайте наборы запросов для запросов, которые необходимо часто использовать в анализе CodeQL.
Наборы запросов позволяют передавать несколько запросов в CodeQL без необходимости указывать путь к каждому файлу запроса отдельно. Определения набора запросов хранятся в файлах YAML с расширением .qls. Определение набора — это последовательность инструкций, в которых каждая инструкция — это сопоставление YAML с одним ключом (обычно). Инструкции выполняются в том порядке, в котором они отображаются в определении набора запросов. У результате выполнения всех инструкций в определении набора будет создан набор выбранных запросов.
Наборы запросов по умолчанию
Существует два встроенных набора запросов для CodeQL:
-
default: это запросы, выполняемые по умолчанию в коде CodeQL, сканируемые на GitHub, доступные при настройке по умолчанию сканирования кода. Запросы в этом наборе запросов являются высоко точными и возвращают несколько результатов проверки ложноположительных результатов кода. По отношению кsecurity-extendedнабору запросов набор по умолчанию возвращает меньше результатов сканирования кода с низкой достоверностей. -
security-extended: этот набор содержит все запросы изdefaultнабора, а также дополнительные запросы безопасности с немного меньшей точностью и серьезностью. Он доступен с настройкой по умолчанию для сканирования кода и указан как опция "Расширенный" в раскрывающемся списке наборов запросов. По отношению к наборуdefaultзапросов этот набор может возвращать большее количество результатов проверки ложноположительных результатов кода.
Настройка кода по умолчанию будет использовать default набор запросов. Это можно изменить, щелкнув значок переполнения, чтобы просмотреть конфигурацию CodeQL, а затем щелкнув кнопку редактирования. В разделе "Параметры сканирования" можно выбрать один из двух вариантов, описанных в качестве набора запросов.
Пакеты CodeQL
Пакеты CodedQL используются для упорядочивания файлов, используемых в анализе CodeQL, что позволяет легко создавать, предоставлять общий доступ, зависеть от них и выполнять запросы и библиотеки CodeQL. Они содержат запросы, файлы библиотек, наборы запросов и важные метаданные. С помощью пакетов CodeQL и команд управления пакетами в CLI CodeQL можно публиковать пользовательские запросы и интегрировать их в анализ базы кода.
Существует три типа пакетов CodeQL: пакеты запросов, пакеты библиотек и пакеты моделей.
- Пакеты запросов предназначены для запуска. При публикации пакета запросов пакет включает все транзитивные зависимости и предварительно скомпилированные представления каждого запроса в дополнение к источникам запросов. Это обеспечивает согласованное и эффективное выполнение запросов в пакете.
- Пакеты библиотек предназначены для использования пакетами запросов (или другими пакетами библиотек) и не содержат сами запросы. Библиотеки не компилируются отдельно.
- Пакеты моделей можно использовать для расширения анализа сканирования кода для включения зависимостей, которые не поддерживаются по умолчанию. Пакеты моделей в настоящее время находятся в бета-версии и подвергаются изменению. Во время бета-версии пакеты моделей доступны для анализа Java на уровне репозитория. Дополнительные сведения о создании собственных пакетов моделей см. в статье "Создание пакета модели CodeQL".
Структура пакета CodeQL
CLI CodeQL можно использовать для разработки и публикации пакета с помощью команды pack init. Эта команда создаст необходимую структуру каталогов и файлы, включая основной файл, вызываемый qlpack.yml в корневом каталоге. Метаданные в каждом qlpack.yml файле сообщают CodeQL, как скомпилировать все запросы в пакете, какие библиотеки зависят от пакета и где найти определения набора запросов.
Содержимое пакета CodeQL (запросы или библиотеки, используемые в анализе CodeQL), включается в тот же каталог, что qlpack.ymlи вложенные каталоги.
Каталог, содержащий файл qlpack.yml, служит корневым каталогом для содержимого пакета CodeQL. То есть для всех .ql файлов и .qllфайлов в пакете CodeQL будет разрешать все инструкции импорта относительно каталога, содержащего файл qlpack.yml в корневом каталоге пакета.
Ниже приведен пример файла 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: "*"
Дополнительные сведения о создании и публикации собственных пакетов CodeQL см. в статье "Публикация и использование пакетов CodeQL".[1]