Перейти к содержанию

Как искусственный интеллект улучшает статический анализ исходного кода (SAST)

Это перевод статьи.

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

В опросе, проведенном на GitHub в 2023 году, разработчики сообщали, что их главной задачей, уступающей только написанию кода (32%), является поиск и устранение уязвимостей (31%).

По мере того как разработчики реализуют принцип "shift left", внедряя все более ранние проверки в жизненный цикл разработки ПО (SDLC), они становятся первой линией обороны.

К сожалению, мы обнаружили, что "shift left" в большей степени связан с переносом ответственности по обеспечению безопасности на разработчиков, а не с выгодами для них. Но при использовании ИИ есть перспективы: 45% разработчиков считают, что они выиграют от использования ИИ для упрощения проверки кода, и они не ошибаются.

Мы побеседовали с Тиферет Газит (Tiferet Gazit), ведущим специалистом по ИИ в GitHub Advanced Security, и Китом Худлетом (Keith Hoodlet), главным специалистом по безопасности в GitHub, чтобы обсудить проблемы безопасности разработки, ценность использования средств защиты на базе ИИ и то, как это может улучшить статический анализ исходного кода (SAST).

Почему разработчики недовольны безопасностью?

Прежде чем поделиться идеями Gazit и Hoodlet, послушаем разработчиков.

В конце 2019 года команда Microsoft One Engineering System встретилась с несколькими разработчиками, чтобы разобраться в их недовольстве по отношению к соблюдению правил безопасности и соответствия требованиям. Хотя это было несколько лет назад, их проблемы не исчезли и по сей день:

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

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

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

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

Без вмешательства в такое положение дел, со временем эти проблемы будут только нарастать. По прогнозам Gartner, к 2028 году 75% инженеров-программистов на предприятиях будут использовать помощников по программированию с использованием ИИ. Это означает, что по мере того, как разработчики будут повышать свою производительность и писать больше кода с помощью инструментов ИИ, таких как GitHub Copilot, нужно будет проверять еще больше кода.

Эксперты по безопасности тоже работают на пределе возможностей

Есть сведения о том, что на каждые 100 разработчиков приходится один эксперт по безопасности, который в конечном итоге становится последней линией обороны и отвечает за настройку и применение политик безопасности. Хотя точные цифры могут варьироваться, ISC2 (Международный консорциум по сертификации безопасности информационных систем) сообщил в своем исследовании рабочей силы на 2023 год о потребности в дополнительных четырех миллионах специалистов по безопасности.

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

"ИИ может помочь с проверкой безопасности кода для большей уверенности в том, что увеличение нагрузки на специалистов не приведет к увеличению уязвимостей", - говорит Газит.

Как ИИ улучшает SAST

Инструменты SAST - это не единственный, но один из самых популярных способов обеспечения безопасности. Давайте посмотрим, как ИИ может помочь при использовании инструментов SAST.

Улучшенное обнаружение уязвимостей

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

Вот тут-то и пригодится искусственный интеллект.

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

Посмотрите, как Ник Лиффен (Nick Liffen), директор GitHub Advanced Security, и Нирошан Раджадурай (Niroshan Rajadurai), вице-президент по стратегии GTM для ИИ и DevSecOps, демонстрируют, как ИИ может моделировать неизвестные пакеты.

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

Автоматическое исправление при сканировании кода - это пример функции безопасности на базе ИИ, которая сочетает в себе инструмент SAST — в данном случае CodeQL от GitHub — с возможностями ИИ GitHub Copilot.

С помощью функции автоматического исправления при сканировании кода разработчики получают исправление предложенное ИИ вместе с предупреждением в "pull request". Кроме этого они получают четкое объяснение уязвимости и рекомендации по исправлению, относящиеся к их конкретному случаю. Чтобы просматривать и применять предложения по автоматическому исправлению непосредственно в интерфейсе командной строки, они могут включить расширение GitHub CLI.

Сейчас функция автоматического исправления при сканировании кода анализирует и предлагает исправления в JavaScript, TypeScript, Python, Java, C# и Go. С его помощью можно устранить более 90% типов уязвимостей, и более двух третей из этих исправлений могут быть внесены практически без редактирования вручную. В будущем будет поддерживаться больше языков, таких как C++ и Ruby.

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

Укрепленный SDLC

Разработчики используют SAST для защиты своего кода в SDLC.

Как только разработчики подключат решение для сканирования кода, такое как CodeQL, инструмент SAST просканирует ваш исходный код, включив проверки безопасности в свой рабочий процесс CI/CD.

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

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

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

Смотрите раздел Автоматическое исправление при сканировании кода в действии

"Автофиксация делает CodeQL более удобным для разработчиков, предлагая исправления и предоставляя контекстные объяснения уязвимости и ее устранения", - говорит Газит. "Использование ИИ снижает порог входа для разработчиков, которые занимаются устранением уязвимостей".

Предположим, злоумышленник вводит SQL-инъекцию, которая оказывает воздействие на код через поле пользовательского ввода, и если код, содержащий эту инъекцию, использует непреднамеренные уязвимости, злоумышленник получает несанкционированный доступ к конфиденциальным данным в вашем приложении.

SQL-инъекции - это распространенный тип уязвимостей, которые часто обнаруживаются с помощью инструментов SAST.

Ниже приведен пошаговый обзор того, как функция автоматического исправления при сканировании кода, основанная на GitHub Copilot, обнаруживает SQL-инъекцию, а затем выдает предупреждение с исправлением, предложенным ИИ.

Шаг 1: Обнаружение уязвимости. Сканирование кода с помощью CodeQL можно бесплатно включить во всех публичных репозиториях и запланировать его автоматический запуск. Процесс сканирования состоит из четырех основных этапов, связанных с вашим исходным кодом: токенизация, абстрагирование, семантический анализ и анализ вредоносных программ. Вот подробное описание каждого из этих шагов.

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

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

Шаг 2: Запрос для исправления. Для всех языков, поддерживаемых CodeQL, разработчики увидят предупреждение об SQL-инъекции, появляющееся в запросе на обновление в их репозитории, вместе с описанием уязвимости на естественном языке и контекстной документацией. Эти предупреждения также будут содержать предлагаемое исправление, которое разработчики могут принять, отредактировать или отклонить.

Вот что содержится в приглашении, отправляемом на GitHub Copilot для создания расширенного предупреждения:

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

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

Чтобы определить формат ответа, наши инженеры по машинному обучению советуют:

Ограничьте модель GitHub Copilot для редактирования только кода, содержащегося в приглашении.

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

Настройте указание блоков кода "до" и "после", демонстрирующих фрагменты, которые требуют изменений (включая некоторые контекстные строки), и необходимые правки.

Настройте модель перечислить все внешние зависимости, используемые в исправлении, такие как библиотеки.

Шаг 3: Проверка. Фрагменты кода, которые содержат около 150 символов общедоступного кода на GitHub, затем фильтруются на основе предложений, сгенерированных ИИ. Уязвимый код и не относящийся к теме, вредоносный или оскорбительный контент также отфильтровываются.

Вы можете ознакомиться с Центром доверия Copilot (GitHub Copilot Trust Center), чтобы узнать больше о фильтрах и ответственной обработке данных.

Шаг 4: Последние штрихи. Прежде чем разработчики увидят предлагаемое исправление на GitHub Copilot, генератор исправлений обрабатывает и уточняет выходные данные LLM, чтобы обнаружить и исправить любые мелкие ошибки.

Генератор исправлений делает это с помощью:

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

Использование синтаксического анализатора для проверки на наличие синтаксических ошибок.

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

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

Шаг 5: Объяснение уязвимости и предложение способа ее устранения. Заключительный шаг - отправить разработчикам предупреждение CodeQL в запросе на обновление. С помощью функции автоматического исправления при сканировании кода исходное предупреждение CodeQL дополняется исправлением, предложенным ИИ, объяснением уязвимости на естественном языке и предлагаемым исправлением, а также исправлением diff. Разработчики могут принять предлагаемую правку как есть, доработать ее или отклонить.

Как разработчики могут извлечь выгоду из инструментов SAST на базе ИИ

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

"Когда вы относитесь к безопасности как к функции SDLC, ваши приложения становятся более устойчивыми к все более сложным атакам, что экономит ваше время и деньги", - говорит Худлет. "Вы можете направить сэкономленные средства на другие улучшения и эксперименты с новыми функциями. Результат? Организации завоевывают репутацию разработчиков безопасных продуктов, высвобождая ресурсы для инноваций". Кроме того, команды по обеспечению безопасности могут сосредоточиться на стратегических инициативах, которые заслуживают их опыта.

Организации, внедряющие инструменты SAST, улучшенные с помощью ИИ, могут помочь разработчикам чувствовать поддержку и продуктивность в своей работе по обеспечению безопасности, чтобы разработчики могли:

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

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

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