Skip to main content

О автофиксе для сканирования кода CodeQL

Узнайте, как GitHub использует ИИ для предложения потенциальных исправлений для оповещений code scanning, обнаруженных CodeQL в запросе на вытягивание.

Кто эту функцию можно использовать?

Автофикс для code scanning доступен только для пользователей GitHub Enterprise Cloud, у которых есть GitHub Advanced Security. Дополнительные сведения см. в разделе Сведения о GitHub Advanced Security.

О автофиксе для CodeQL code scanning

Автофикс Code scanning — это расширение GitHub Copilotс поддержкой code scanning, которое предоставляет пользователям целевые рекомендации по устранению оповещений code scanning в запросах на вытягивание, чтобы они могли избежать появления новых уязвимостей безопасности. Потенциальные исправления создаются автоматически большими языковыми моделями (LLM) с помощью данных из базы кода, запроса на вытягивание и из анализа CodeQL.

Примечание. Хотя автофикс code scanning поддерживается GitHub Copilot, ваше предприятие не нуждается в подписке на GitHub Copilot для использования автофикса. Если у вашей организации есть GitHub Advanced Security, у вас будет доступ к автофиксу.

Автофикс Code scanning создает потенциальные исправления, относящиеся к существующему исходному коду, и преобразует описание и расположение оповещения в изменения кода, которые могут исправить оповещение. Autofix использует внутренние API-интерфейсы GitHub Copilot и частные экземпляры больших языковых моделей OpenAI, таких как GPT-4, которые имеют достаточные возможности для создания предлагаемых исправлений в коде и пояснительных текстах для этих исправлений.

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

Режим разработчика

Пользователи GitHub Advanced Security уже могут видеть любые оповещения системы безопасности, обнаруженные code scanning с помощью CodeQL для анализа запросов на вытягивание. Однако разработчики часто имеют мало обучения безопасности кода, поэтому исправление этих оповещений требует значительных усилий. Сначала они должны прочитать и понять расположение и описание оповещений, а затем использовать это понимание для изменения исходного кода для устранения уязвимости.

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

После фиксации предлагаемого исправления или изменения разработчик всегда должен убедиться, что непрерывное тестирование интеграции (CI) для базы кода продолжает передаваться и что оповещение отображается как разрешенное перед слиянием запроса на вытягивание.

Поддерживаемые языки

Автофикс Code scanning поддерживает создание исправлений для подмножества запросов, включенных в набор запросов по умолчанию для C#, Go, Java, JavaScript/TypeScript, Python и Ruby. Дополнительные сведения о наборе запросов по умолчанию см. в разделе "Наборы запросов CodeQL".

Процесс создания автофикса

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

GitHub отправляет LLM различные данные из запроса на вытягивание и из анализа CodeQL.

  • CodeQL оповещений в формате SARIF. Дополнительные сведения см. в разделе "Поддержка SARIF для проверки кода".
  • Код из текущей версии ветви запроса на вытягивание.
    • Короткие фрагменты кода вокруг каждого исходного расположения, расположения приемника и любого расположения, на которое ссылается оповещение или включены в путь потока.
    • Первые 10 строк из каждого файла, участвующих в любом из этих расположений.
  • Текст справки для запроса CodeQL, который определил проблему. Примеры см. в разделе "Справка по запросу "CodeQL".

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

Процесс создания исправлений не собирает или не использует данные клиента за пределами область, описанных выше. Поэтому использование этой функции регулируется существующими условиями, связанными с GitHub Advanced Security. Кроме того, данные, обрабатываемые автофиксом code scanning, строго не используются для обучения LLM. Дополнительные сведения об условиях GitHub Advanced Security см. в разделе "Условия GitHub для дополнительных продуктов и функций".

Качество предложений автофикса

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

Тестовая ремня включает набор из более чем 2300 оповещений из разнообразного набора общедоступных репозиториев, где выделенный код имеет тестовое покрытие. Предложения автофикса для этих оповещений проверяются, чтобы узнать, насколько они хороши, то есть сколько разработчику потребуется изменить перед фиксацией их в базе кода. Для многих тестовых оповещений автоматические исправления, созданные LLM, могут быть зафиксированы как есть, чтобы исправить оповещение, продолжая успешно передавать все существующие тесты CI.

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

Как GitHub проверяет предложения автофикса

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

  1. Было ли оповещение code scanning исправлено предложением?
  2. В исправлении появились новые оповещения code scanning ?
  3. Исправление ввело какие-либо синтаксические ошибки, которые могут обнаруживать CodeQL?
  4. Изменило ли исправление выходные данные любого из тестов репозитория?

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

Эффективность других проектов

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

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

Однако каждый проект и база кода уникальны, поэтому разработчикам может потребоваться изменить больший процент предлагаемых исправлений перед фиксацией. Автофикс предоставляет ценные сведения для решения оповещений code scanning, но в конечном счете она остается вашей ответственностью за оценку предлагаемого изменения и обеспечение безопасности и точности кода.

Примечание. Исправление создания поддерживаемых языков зависит от операционной емкости LLM. Кроме того, каждое предлагаемое исправление проверяется перед добавлением в запрос на вытягивание. Если предложение недоступно или если предлагаемое исправление завершается сбоем внутреннего тестирования, то не отображается предложение автофикса.

Ограничения предложений автофикса

При просмотре предложения автофикса необходимо всегда учитывать ограничения искусственного интеллекта и изменять изменения по мере необходимости, прежде чем принимать изменения. Перед включением автофикса для code scanningследует также обновить тестирование и управление зависимостями CI для репозитория. Дополнительные сведения см. в разделе "Устранение ограничений предложений автофикса".

Ограничения предложений кода автофикса

  • Языки программирования: поддерживается подмножество языков программирования. Поддержка дополнительных языков будет добавлена, но нет намерения обеспечить поддержку для всех языков CodeQL.
  • Человеческие языки: система в основном использует английские данные, в том числе запросы, отправленные в систему, код, видимый LLM в своих наборах данных, и тестовые варианты, используемые для внутренней оценки. Предложения, созданные LLM, могут иметь более низкую скорость успешного выполнения для исходного кода и комментариев, написанных на других языках и использующих другие наборы символов.
  • Синтаксические ошибки: система может предложить исправления, которые не синтаксически исправляют изменения кода, поэтому важно выполнить синтаксические проверка для запросов на вытягивание.
  • Ошибки расположения: система может предложить исправления, которые синтаксически правильный код, но предлагаются в неправильном расположении, что означает, что если пользователь принимает исправление без редактирования расположения, которое они будут вводить синтаксическую ошибку.
  • Семантические ошибки: система может предлагать исправления, которые синтаксически допустимы, но изменяют семантику программы. Система не понимает намерения программиста или базы кода в том, как должен вести себя код. Наличие хорошего покрытия тестов помогает разработчикам убедиться, что исправление не изменяет поведение базы кода.
  • Уязвимости системы безопасности и вводящие в заблуждение исправления: система может предложить исправления, которые не исправляют базовую уязвимость безопасности и /или вводят новые уязвимости безопасности.
  • Частичные исправления. Система может предложить исправления, которые только частично устраняют уязвимость безопасности или только частично сохраняют предполагаемые функции кода. Система видит только небольшое подмножество кода в базе кода и не всегда создает глобально оптимальные или правильные решения.

Ограничения предложений зависимостей автофикса

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

  • Новые или обновленные зависимости: система может предложить добавление или обновление зависимостей программного обеспечения в рамках предлагаемого исправления. Например, предлагая изменить package.json файл для проектов JavaScript, чтобы добавить зависимости из npm.
  • Неподдерживаемые или небезопасные зависимости: система не знает, какие версии существующей зависимости поддерживаются или защищены.
  • Структура зависимостей: система имеет неполные знания о зависимостях, опубликованных в более широкой экосистеме. Это может привести к предложениям, которые добавляют новую зависимость от вредоносного программного обеспечения, которое злоумышленники опубликовали под статистически вероятным именем зависимости.

Устранение ограничений предложений автофикса

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

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

Следующие шаги