Общие сведения о результатах CodeQL

Завершено

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

Результаты интерпретированного запроса автоматически отображаются в исходном коде в расширении CodeQL для Visual Studio Code. Выходные результаты, создаваемые CodeQL CLI, могут быть представлены в различных форматах для использования с различными инструментами.

Вы можете управлять отображением результатов анализа в исходном коде, изменив инструкцию select запроса. Вы можете сделать результаты понятными и простыми для других пользователей при разработке запроса, чтобы их было легче понять. При написании собственных запросов в консоли запросов или в расширении CodeQL для Visual Studio Code нет ограничений на то, что можно выбрать.

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

Процессы устранения с Copilot Autofix

После того как CodeQL идентифицирует проблему, наиболее важным шагом является его разрешение. GitHub интегрирует обнаружение с исправлением, позволяя перейти непосредственно из оповещения в предлагаемое исправление.

Устранение оповещений с помощью Copilot Autofix

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

Для поддерживаемых оповещений вы также увидите Copilot Autofix.

Copilot Autofix анализирует оповещение и предлагает исправление. Сюда входит следующее:

  • Изменение кода, разрешающее проблему
  • Объяснение причины возникновения проблемы
  • Руководство по устранению проблемы

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

Типичный рабочий процесс выглядит следующим образом:

  1. CodeQL выполняется в рабочем процессе и создает оповещение.
  2. Вы открываете оповещение и просматриваете затронутый код.
  3. Copilot Autofix создает рекомендуемое исправление.
  4. Вы просмотрите объяснение и предложенные изменения.
  5. Вы применяете исправление, в результате чего создается запрос на включение изменений.
  6. Пул-реквест проходит проверки и ревью перед слиянием.

Этот рабочий процесс подключает обнаружение непосредственно к исправлению без выхода из интерфейса GitHub.

Copilot Autofix не вносит изменения автоматически. Вы несете ответственность за проверку и утверждение исправления. Это гарантирует, что:

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

Автофикс наиболее эффективен для:

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

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

Предлагаемые исправления в оповещениях

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

Эти предложения:

  • Выделите часть кода, которая должна измениться.
  • Укажите рекомендации по устранению проблемы.

Эти предложения можно использовать в качестве отправной точки при написании исправления.

Исправление зависимостей с помощью Dependabot

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

Dependabot помогает автоматически устранять следующие проблемы:

  • Обнаружение уязвимых зависимостей.
  • Создание запросов на включение изменений с обновлёнными версиями.
  • Позволяет просматривать и объединять исправления.

Эти запросы на слияние используют тот же рабочий процесс, что и Autofix:

  1. Предлагается изменение.
  2. Выполняются проверки.
  3. Обновление проверено и объединено.

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

Автоматизация рабочих процессов исправления

Вы можете использовать GitHub Actions для автоматизации обработки исправлений.

Например, рабочие процессы могут:

  • Запустите тесты для pull request от Autofix или Dependabot.
  • Применяйте метки в зависимости от степени серьезности.
  • Требовать утверждения для изменений с высоким риском.
  • Автоматическое слияние обновлений с низким риском.

Эти рабочие процессы гарантируют, что устранение выполняется следующим образом:

  • Единообразие во всей команде.
  • Проверено перед слиянием.
  • Интегрирована в процесс разработки.

От обнаружения до разрешения

В полном рабочем процессе:

  1. CodeQL обнаруживает уязвимость.
  2. Copilot Autofix предлагает исправление.
  3. Создан pull request.
  4. GitHub Actions проверяют изменение.
  5. Исправление проверяется и объединяется.

Сочетая анализ CodeQL с Copilot autofix, Dependabot и автоматизацию рабочих процессов, вы создаете систему, которая не только находит проблемы, но и помогает эффективно устранять их.

Реагирование на предупреждения сканирования кода

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

Анализ CodeQL по умолчанию в GitHub может содержать больше свойств для уведомлений, чем результаты из инструментов, не принадлежащих Microsoft, или из пользовательских запросов. В рабочем процессе по умолчанию сканирование кода периодически выполняется в ветви по умолчанию и при pull-запросах.

Каждое оповещение содержит следующие сведения:

  • Проблема с кодом и названием средства, которое его идентифицировало.
  • Строка кода, активировающая оповещение.
  • Свойства оповещения, такие как серьезность.
  • Уровень серьезности безопасности.
  • Момент, когда возникла проблема.
  • Характер проблемы.

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

Снимок экрана: оповещения о результатах анализа CodeQL в GHAS.

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

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

Автоматизация исправления зависимостей с помощью Dependabot

Типичный рабочий процесс автоматизации следует этому шаблону:

  1. Dependabot создает запрос на включение изменений, чтобы обновить уязвимую зависимость.
  2. В событии pull_request активируется рабочий процесс GitHub Actions.
  3. Рабочий процесс проверяет, был ли запрос на включение изменений создан dependabot[bot].
  4. Метаданные об обновлении (например, тип зависимостей или изменение версии) можно использовать для определения следующего действия.
  5. Рабочий процесс выполняет проверки, применяет метки или включает автоматическое слияние для обновлений с низким риском.

В следующем примере показан простой рабочий процесс GitHub Actions, который выполняется только для pull request, созданных Dependabot. Он проверяет обновление и может включить автоматическое слияние после прохождения проверок.

name: Dependabot remediation

on:
  pull_request:
    branches:
      - main

permissions:
  pull-requests: write

jobs:
  dependabot:
    if: github.event.pull_request.user.login == 'dependabot[bot]'
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Run tests
        run: npm test

      - name: Enable auto-merge for approved updates
        if: ${{ success() }}
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          PR_URL: ${{ github.event.pull_request.html_url }}
        run: gh pr merge --auto --merge "$PR_URL"

Этот подход помогает командам сократить усилия вручную, обеспечивая проверку обновлений зависимостей перед объединением.

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

Уведомление команд о действиях по исправлению

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

В дополнение к уведомлениям GitHub можно использовать следующее:

  • Интеграции со Slack или Microsoft Teams для информирования команды.
  • Вебхуки GitHub для пользовательских интеграций и конвейеров автоматизации.

Например, рабочий процесс или вебхук может уведомить команду, когда:

  • Открыт pull request Dependabot.
  • Проверки валидации завершаются сбоем.
  • Обновление безопасности объединено.

Эти уведомления помогают командам быстро реагировать, когда исправление требует внимания.

Оповещения о потоках данных

Анализ потока данных находит потенциальные проблемы безопасности в коде, в том числе:

  • Использование данных таким образом, чтобы поставить безопасность под угрозу.
  • Передача опасных аргументов в функции.
  • Утечка конфиденциальной информации.

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

Уровни серьезности

Все результаты сканирования кода с уровнем серьёзности Error по умолчанию приводят к сбою проверки.

Уровни серьезности оповещений:

  • Error
  • Предупреждение
  • Note

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

Уровни серьезности безопасности

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

Уровни серьезности безопасности:

  • Критически важно
  • High
  • Средний
  • Низкий

GitHub использует данные системы оценки распространенных уязвимостей (CVSS) для вычисления серьезности безопасности оповещения.

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

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

Вы можете закрыть оповещение двумя способами:

  • Исправлена проблема в коде.
  • Закройте или удалите оповещение.

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

Отключение оповещения — это способ закрытия оповещения, которое, по вашему мнению, не требует исправления. Например, вы можете закрыть оповещение об ошибке в коде, используемом только для тестирования. Вы также можете закрыть оповещение, если усилия, необходимые для устранения ошибки, больше, чем потенциальное преимущество улучшения кода.

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

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

При закрытии оповещения:

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