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

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

Предпосылки

Категория Требования
Разрешения — Чтобы просмотреть сводку всех оповещений для репозитория, нужны разрешения участника для репозитория.
— Чтобы отклонить оповещения в Advanced Security: администратор проекта разрешения.
— Для управления разрешениями в Расширенной безопасности: быть членом группы Администраторов коллекции проектов или иметь разрешение Расширенная безопасность: управление параметрами установлено на Разрешить.

Дополнительные сведения о разрешениях расширенной безопасности см. в разделе Управление разрешениями расширенной безопасности.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Код 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]).

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

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

Чтобы включить заданную маршрутизацию результатов, задайте переменную среды конвейера advancedsecurity.publish.repository.infer: true, чтобы определить репозиторий для публикации из рабочего каталога.

trigger:
  - main

resources:
  repositories:
    # PipelineRepo: The repository containing the pipeline definition.
    # This is optional and only needed if you plan to reference files or scripts from this repo.
    - repository: PipelineRepo
      type: git
      name: DevOpsPipelineRepo
      ref: refs/heads/main
      trigger:
        - main
    # SourceRepo: The repository where scanning and publishing will occur.
    - repository: SourceRepo
      type: git
      name: code-to-analyze-repo
      ref: refs/heads/main
      trigger:
        - main

jobs:
  - job: "CodeQLScan"
    displayName: "CodeQL Scanning with Inferred Publishing"
    variables:
      # Enable repository inference
      advancedsecurity.publish.repository.infer: true
    steps:
      # Checkout the SourceRepo
      - checkout: SourceRepo

      # Initialize CodeQL
      - task: AdvancedSecurity-Codeql-Init@1
        displayName: "Initialize CodeQL"
        inputs:
          languages: "python,javascript" # Adjust based on repository languages

      # Perform CodeQL analysis
      - task: AdvancedSecurity-Codeql-Analyze@1
        displayName: "Analyze Code with CodeQL"

Ручная установка пакета 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.23.5, имя папки будет названо ./CodeQL/0.0.0-v2.23.5/x64/. Дополнительные сведения о каталоге средств агента.
  3. Создайте пустой файл под названием x64.complete в папке ./CodeQL/0.0.0-[codeql-release-bundle-tag]. Воспользовавшись предыдущим примером, конечный путь к вашему файлу x64.complete должен быть ./CodeQL/0.0.0-v2.23.5/x64.complete.

Как явно определить репозиторий для публикации оповещений сканирования кода?

  • Используйте переменную среды конвейера advancedsecurity.publish.repository.infer: true, чтобы определить репозиторий для публикации из репозитория в рабочем каталоге.
  • В качестве другой опции, если вы не выполняете явную выкачку репозитория или не используете псевдоним для его выкачки, используйте переменную advancedsecurity.publish.repository: $[ convertToJson(resources.repositories['YourRepositoryAlias']) ].

Дополнительные сведения см. в заметках о выпуске.