Бөлісу құралы:


Проверка кода

Сканирование кода в GitHub Advanced Security для Azure DevOps позволяет анализировать код в репозитории Azure DevOps, чтобы найти уязвимости безопасности и ошибки кодирования. Все проблемы, выявленные в процессе анализа, регистрируются как оповещения. Сканирование кода использует CodeQL для выявления уязвимостей.

CodeQL — это подсистема анализа кода, разработанная GitHub для автоматизации проверок безопасности. Вы можете анализировать код с помощью CodeQL и отображать результаты в виде оповещений проверки кода.

GitHub Advanced Security для Azure DevOps работает с Azure Repos. Если вы хотите использовать GitHub Advanced Security с репозиториями GitHub, см. статью GitHub Advanced Security.

Оповещения CodeQL

Эксперты GitHub, исследователи безопасности и участники сообщества записывают и поддерживают запросы CodeQL по умолчанию, используемые для сканирования кода. Запросы регулярно обновляются для улучшения анализа и уменьшения количества ложноположительных результатов. Запросы открытый код, поэтому вы можете просматривать и вносить вклад в запросы в репозитории github/codeql.

Дополнительные сведения о CodeQL см. в документации CodeQL на сайте GitHub.

CodeQL поддерживает как скомпилированные, так и интерпретированные языки, и может находить уязвимости и ошибки в коде, написанном на поддерживаемых языках.

  • C/C++
  • C#
  • Go
  • Java
  • JavaScript/TypeScript
  • Kotlin (бета-версия)
  • Python
  • Ruby
  • Swift

Дополнительные сведения см. в документации на веб-сайте CodeQL на поддерживаемых языках и платформах.

Вы можете просматривать определенные запросы и сведения о задаче, используемые CodeQL, просматривая журнал сборки, аналогичный проверке зависимостей.

Снимок экрана: задача проверки результатов публикации кода

Оповещения о проверке кода

Дополнительные оповещения проверки кода GitHub для Azure DevOps включают флаги сканирования кода в репозитории, которые оповещают уязвимости приложений на уровне кода.

Чтобы использовать сканирование кода, необходимо сначала настроить GitHub Advanced Security для Azure DevOps.

Вкладка "Расширенная безопасность" в Repos в Azure DevOps — это концентратор для просмотра оповещений сканирования кода. Выберите вкладку "Сканирование кода" для просмотра оповещений сканирования. Вы можете фильтровать по ветви, состоянию, конвейеру, типу правила и серьезности. В настоящее время центр оповещений не отображает оповещения о сканировании, завершенном в ветвях PR.

Если конвейеры или ветви переименовываются, результаты не влияют, может потребоваться до 24 часов до отображения нового имени.

Если вы решили запустить пользовательские запросы CodeQL, по умолчанию нет отдельного фильтра для оповещений, созданных из разных пакетов запросов. Вы можете фильтровать по правилу, которое отличается для каждого запроса.

Снимок экрана: оповещение сканирования кода для репозитория

Если отключить расширенную безопасность для репозитория, вы потеряете доступ к результатам на вкладке "Расширенная безопасность" и задаче сборки. Задача сборки не завершается ошибкой, но любые результаты выполнения сборки с задачей, пока расширенная безопасность отключена, скрыты и не сохраняются.

Сведения об оповещении

Выберите оповещение для получения дополнительных сведений, включая руководство по исправлению. Каждое оповещение содержит расположение, описание, пример и серьезность.

Снимок экрана: сведения о сканировании кода

Section Описание
Расположение В разделе "Расположения" подробно описан конкретный экземпляр, в котором CodeQL обнаружил уязвимость. Если в коде несколько экземпляров нарушает одно правило, создается новое оповещение для каждого отдельного расположения. Карточка "Расположения" содержит прямую ссылку на затронутый фрагмент кода, чтобы можно было выбрать фрагмент кода, который будет направлен в веб-интерфейс Azure DevOps для редактирования.
Description Описание предоставляется средством CodeQL, основанным на проблеме.
Рекомендация Рекомендация — это предлагаемое исправление для заданного оповещения проверки кода.
Пример В разделе примера показан упрощенный пример обнаруженной слабости в коде.
Важность Уровни серьезности могут быть низкими, средними, высокими или критическими. Оценка серьезности основана на заданной оценке распространенных уязвимостей (CVSS) для идентифицированного перечисления распространенных слабых мест (CWE). Узнайте больше о том, как серьезность оценивается в этой записи блога GitHub.

Управление оповещениями сканирования кода

Просмотр оповещений для репозитория

Любой пользователь с разрешениями участника для репозитория может просмотреть сводку всех оповещений для репозитория на вкладке "Расширенная безопасность" в репозитории. Перейдите на вкладку "Сканирование кода", чтобы просмотреть все оповещения о сканировании секретов.

Чтобы отобразить результаты, сначала необходимо выполнить задачи сканирования кода. После завершения первой проверки все обнаруженные уязвимости отображаются на вкладке "Расширенная безопасность".

По умолчанию на странице оповещений отображаются результаты проверки зависимостей для ветвь по умолчанию репозитория.

Состояние заданного оповещения отражает состояние ветвь по умолчанию и последнего конвейера выполнения, даже если оповещение существует в других ветвях и конвейерах.

Закрытие оповещений сканирования кода

Чтобы закрыть оповещения, вам нужны соответствующие разрешения. По умолчанию только администраторы проектов могут закрыть оповещения расширенной безопасности.

Чтобы закрыть оповещение:

  1. Перейдите к оповещению, которое вы хотите закрыть, и выберите оповещение.
  2. Выберите раскрывающийся список "Закрыть оповещение".
  3. Если этот параметр еще не выбран, выберите "Риск принят " или "Ложный положительный результат " в качестве причины закрытия.
  4. Добавьте необязательный комментарий в текстовое поле "Комментарий ".
  5. Нажмите кнопку "Закрыть", чтобы отправить и закрыть оповещение.
  6. Состояние генерации оповещений изменяется с open to Closed и отображается причина увольнения.

Снимок экрана: закрытие оповещений сканирования кода

Это действие закрывает оповещение только для выбранной ветви. Другие ветви, содержащие ту же уязвимость, остаются активными до закрытия. Любое оповещение, ранее отклоненное, можно повторно открыть вручную.

Использование пользовательских запросов с CodeQL

По умолчанию, если у вас нет пользовательского файла конфигурации, указанного в настройке конвейера, CodeQL запускает security-extended пакет запросов для анализа кода. Вы можете использовать пользовательские запросы CodeQL для записи собственных запросов для поиска определенных уязвимостей и ошибок. Кроме того, необходимо создать пользовательский файл конфигурации для изменения анализа по умолчанию CodeQL.

Чтобы найти существующие пользовательские запросы или внести свой собственный пользовательский запрос, см. статью "Участие в CodeQL".

Анализ с помощью пользовательских запросов

Самый быстрый способ начать работу с пользовательским запросом — написать запрос и сохранить его в локальном репозитории Azure DevOps. Вы можете настроить сведения о пользовательском запросе в соответствии с вашими необходимыми данными, но он должен иметь по крайней мере идентификатор правила. Дополнительные сведения о написании собственного запроса CodeQL см. в статье "Написание запросов CodeQL". Вы также можете объединить несколько запросов в набор запросов или использовать пакеты, опубликованные другими людьми. Дополнительные сведения см. в статье "Публикация и использование пакетов CodeQL".

Использование пользовательского файла конфигурации

Пользовательский файл конфигурации — это способ управления запросами во время анализа CodeQL в коде. Можно указать дополнительные запросы или пакеты запросов для выполнения, а также изменить или отключить запросы CodeQL по умолчанию.

Чтобы включить определенный запрос, который требуется включить, укажите запрос с именем и путем к расположению файла запроса (QL) в репозитории.

Чтобы включить определенный пакет, который требуется включить, укажите имя пакета. Можно указать любое количество пакетов запросов CodeQL для запуска в файле конфигурации.

Следующим шагом является создание qlpack.yml файла. Этот файл объявляет пакет CodeQL и сведения об этом. Все *.ql файлы в одном каталоге (или вложенном каталоге) qlpack.yml считаются частью пакета.

Совет

Фильтр packs из файла конфигурации поддерживает скачивание пакетов из репозиториев, размещенных в GitHub, хотя это не распространяется на фильтр queries. Если пакет является частным в GitHub, необходимо предоставить маркер доступа GitHub через AdvancedSecurity-Codeql-Init@1 задачу в качестве переменной среды и имени переменной, как GITHUB_TOKENи область действия маркера read:packages.

Далее приведен пример файла конфигурации.

name: "Run custom queries"

# When using a configuration file, if you do not disable default queries,
# then the default CodeQL queries in the `code-scanning` query suite will also execute upon analysis.
disable-default-queries: true
 
# To reference local queries saved to your repository,
# the path must start with `./` followed by the path to the custom query or queries.
# Names for each query referenced is optional.
queries:
  - name: Use security-extended query suite
    uses: security-extended
  - name: Use local custom query (single query)
    uses: ./customQueries/javascript/FindTestFunctions.ql
  - name: Use local custom query (directory of queries)
    uses: ./customQueries/javascript/MemoryLeakQueries  
 
packs:
 - mygithuborg/mypackname
 
paths:
 - src
 
paths-ignore:
  - src/node_modules
  - '**/*.test.js'
 
query-filters:
 - include:
    kind: problem
 - include:
     precision: medium
 - exclude:
    id:
      - js/angular/disabling-sce
      - js/angular/insecure-url-allowlist

Совет

Спецификации файла конфигурации игнорируют и имеют приоритет над конфигурациями на уровне конвейера для AdvancedSecurity-Codeql-Init@1 задачи. includepaths / ignorepathsбудет игнорироваться или, если paths/paths-ignore они присутствуют, перезаписываются со значениями из .paths/paths-ignore querysuite будет перезаписан со значениями, указанными в queries файле конфигурации или packs в файле конфигурации.

Если вы используете любой пользовательский запрос, ниже приведен пример qlpack.yml , размещенный в каталоге пользовательских запросов:

version: 1.0.1
dependencies:
  codeql/javascript-all: "*"
  codeql/javascript-queries: "*"

Переменная dependencies содержит все зависимости этого пакета и их совместимые диапазоны версий. Каждая зависимость ссылается на scope/name пакет библиотеки CodeQL. При определении dependenciesqlpack.yml зависит от одного из основных языковых пакетов (например, JavaScript, C#, Ruby и т. д.), определяющих язык, который может анализировать запрос.

Дополнительные рекомендации и параметры конфигурации с помощью файла конфигурации см. в разделе "Настройка расширенной настройки для сканирования кода" или qlpack.yml "Настройка" см. в разделе "Структура пакета CodeQL".

После получения файла конфигурации необходимо настроить конвейер, на котором выполняется анализ CodeQL, чтобы использовать новый файл. Ниже приведен пример конвейера, указывающий на файл конфигурации:

trigger: none
 
pool:
  vmImage: windows-latest

# You can either specify your CodeQL variables in a variable block... 
variables:
# `configfilepath` must be an absolute file path relative to the repository root
  advancedsecurity.codeql.configfilepath: '$(build.sourcesDirectory)/.pipelines/steps/configfile.yml' 

# Or you can specify variables as variables for the task. You do not need both definitions. 
steps:
- task: AdvancedSecurity-Codeql-Init@1
  displayName: Initialize CodeQL
  inputs:
    languages: 'javascript'
    loglevel: '2'
    configfilepath: '$(build.sourcesDirectory)/.pipelines/steps/configfile.yml'
# If downloading a pack from GitHub,
# you must include a GitHub access token with the scope of `read:packages`.
  env:
    GITHUB_TOKEN: $(githubtoken)

- task: AdvancedSecurity-Codeql-Analyze@1
  displayName: Perform CodeQL Analysis

Устранение неполадок с сканированием кода

Как правило, если возникают ошибки при выполнении CodeQL, интерфейс командной строки CodeQL сообщает о состоянии каждой команды, выполняемой в качестве кода выхода. Код выхода содержит сведения о последующих командах или других средствах, использующих cli CodeQL. Дополнительные сведения о коде выхода см. в разделе "Коды выхода".

Ошибка: команда CodeQL "Завершение базы данных" (32)

Эта ошибка указывает на проблему при завершении создания базы данных CodeQL, возможно, из-за ошибок извлечения или отсутствия шагов сборки.

Действия по устранению неполадок.

  1. Проверка наличия кода и компиляция
    • Для скомпилированных языков убедитесь, что процесс сборки компилируется код и происходит между AdvancedSecurity-Codeql-Init задачами и задачами AdvancedSecurity-Codeql-Analyze . Общие команды сборки и обязательные флаги (например, очистка без кэша или управляющей программы) можно найти здесь в разделе "Указание команд сборки".
    • Для интерпретированных языков убедитесь, что в проекте существует некоторый исходный код для указанного языка.
  2. Проверка ошибок извлечения
    • Проверьте, влияют ли ошибки извлечения на работоспособность базы данных CodeQL.
    • Просмотрите файл журнала для извлечения ошибок и предупреждений, чтобы оценить общую работоспособность базы данных.
  3. Исследование подавляющие ошибки
    • Если большинство файлов сталкиваются с ошибками средства извлечения, изучите дополнительные сведения о первопричине неправильного извлечения.

Ошибка: скрипт автостроения (1)

Эта ошибка описывает автоматический сбой сборки, предлагая проблему с проверкой кода установки или конфигурации.

Действия по устранению неполадок.

  1. Настройка шагов сборки

Ошибка: каталоги CodeQL не найдены в кэше инструментов агента

Эта ошибка указывает на проблему с установкой CodeQL для локальных агентов.

Действия по устранению неполадок.

  1. Ознакомьтесь с рекомендациями по настройке или скриптами конфигурации, указанными в разделе "Настройка расширенной безопасности GitHub для Azure DevOps".

Ошибка: переменная конвейера языка не задана

Эта ошибка возникает при попытке запустить CodeQL без задания переменной конвейера, указывающей, какие языки следует проверять.

Действия по устранению неполадок.

  1. Установка переменной конвейера языка
    • Убедитесь, что переменная конвейера языка настроена правильно. Ознакомьтесь с рекомендациями по настройке GitHub Advanced Security для Azure DevOps.
    • Поддерживаемые языки включают csharp, , javagojavascriptcpp, pythonи . rubyswift

CodeQL, возвращающий результаты без результатов

В этом разделе приводятся рекомендации по ситуациям, когда анализ CodeQL не дает результатов.

Действия по устранению неполадок.

  1. Проверка обнаруженных уязвимостей
    • Рассмотрите возможность того, что ваш код может действительно не иметь уязвимостей. Если ожидается, но не обнаружены уязвимости, перейдите к проверке далее.
  2. Проверка конфигурации набора запросов
    • Убедитесь, что набор запросов используется и при необходимости рассмотрите возможность переключения на более полный набор.
    • Кроме того, пользовательские наборы запросов можно создать для анализа с учетом.
  3. Настройка разрешений для просмотра результатов
    • Убедитесь, что разрешения, по крайней мере на уровне участника, предоставляются для доступа к результатам анализа. Дополнительные сведения см. в разделе "Расширенные разрешения безопасности".

Время ожидания CodeQL

AdvancedSecurity-Codeql-Analyze@1 Если задача отображается This job was abandoned ... we lost contact with the agent и используется размещенный агент Майкрософт, задача достигает встроенного шестичасового ожидания для платных размещенных агентов. Вместо этого можно попытаться выполнить анализ на локальном агенте.

Разрешения на сканирование кода

Задача сканирования кода использует удостоверение конвейера для вызова REST API расширенной безопасности. По умолчанию конвейеры в одном проекте имеют доступ к отправке ФАЙЛА SARIF, созданного с помощью анализа CodeQL. Если эти разрешения удаляются из учетной записи службы сборки или если у вас есть пользовательская настройка (например, конвейер, размещенный в проекте, отличном от репозитория), необходимо предоставить эти разрешения вручную.

Действия по устранению неполадок.

  • Предоставление Advanced Security: View alerts и Advanced Security: Manage and dismiss alerts разрешение учетной записи службы сборки, используемой в конвейере, которая используется [Project Name] Build Service ([Organization Name])для конвейеров с областью проекта, и для конвейеров Project Collection Build Service ([Organization Name])с областью сбора.

Ручная установка пакета CodeQL для локального агента

Установите пакет CodeQL в кэш средств агента, используя скрипт установки для архитектуры, доступный на сайте GitHub. Эти скрипты требуют $AGENT_TOOLSDIRECTORY , чтобы переменная среды была задана в расположении каталога средств агента в агенте, например C:/agent/_work/_tool. Кроме того, можно вручную выполнить следующие действия.

  1. Выберите последний пакет выпуска CodeQL из GitHub.
  2. Скачайте и распакуйте пакет в следующий каталог в каталоге инструментов агента, как правило, расположенного в разделе _work/_tool: ./CodeQL/0.0.0-[codeql-release-bundle-tag]/x64/. Используя текущий v2.16.0выпуск, имя папки будет заголовок ./CodeQL/0.0.0-codeql-bundle-v2.16.0/x64/. Дополнительные сведения о каталоге средств агента.
  3. Создайте пустой файл, заголовок в x64.complete папке ./CodeQL/0.0.0-[codeql-release-bundle-tag] . В предыдущем примере путь к x64.complete файлу должен быть ./CodeQL/0.0.0-codeql-bundle-v2.16.0/x64.completeзавершен.