Как автоанализ кода с помощью ИИ повышает безопасность приложений

В данной статье предлагается обзор инструментов генеративного искусственного интеллекта (Generative Artificial Intelligence, Gen AI), позволяющих масштабировать рабочие процессы анализа кода и моделирования угроз для обеспечения безопасности приложений (Application Security, AppSec).

Важные замечания

  • Мнения, изложенные авторами статьи, не обязательно выражают мнения их прошлых, настоящих или будущих работодателей.
  • Упоминаемые книги, инструменты, сайты и/или продукты/услуги не пользуются официальной поддержкой, и авторы не получали никаких стимулов для их упоминания.
  • Рекомендации основаны на прошлом опыте и не являются отражением будущего.
  • Искусственный интеллект (ИИ)  —  это быстро развивающаяся область, поэтому любые рекомендации, мнения и примеры основаны на текущих знаниях и могут быть изменены.
  • При использовании общедоступных инструментов, основанных на ИИ, не рекомендуем размещать в них конфиденциальную информацию. Следует ознакомиться с политикой вашей организации в отношении их использования и всегда проверять достоверность получаемых результатов.

Введение

Инженеры по безопасности приложений (AppSec-инженеры) ходят по натянутому канату. Зачастую им приходится балансировать: будучи универсальными специалистами по всему спектру приложений, в то же время оставаться экспертами по ряду флагманских приложений.

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

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

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

Именно при таких обстоятельствах, по нашему мнению, инструменты Gen AI способны помочь масштабировать работу AppSec-инженеров и сделать ее более эффективной. В этой статье подробно расскажем и покажем, как такие инструменты, как ChatGPT, повышают эффективность AppSec-инженеров.

AppSec & GenAI

Начнем с главного

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

Чтобы не быть голословными, углубимся в детали и посмотрим, как это осуществить на практике. Обратим внимание на важнейшие сферы применения ИИ:

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

И последнее уточнение: для иллюстрации рабочих процессов будем использовать ChatGPT (3.5). Стоит отметить, что между версиями 3.5 и 4 существуют различия, поэтому советуем рассмотреть и альтернативные варианты.

Итак, приступим к делу!

Непрерывный анализ изменений в приложениях и функциях

Балансирование на канате для AppSec-инженеров

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

Появились решения с ИИ для работы с репозиториями и кодом. Эти продукты предлагают программисту, работающему в паре с ИИ, рекомендации по форматированию кода в процессе его написания. Обычно они встроены в IDE, например VS Code, поэтому их можно задействовать, начав писать код или создав комментарий на естественном языке с описанием того, что надо сделать в коде. Они могут анализировать контекст редактируемого и смежных файлов и вносить предложения в IDE.

С помощью протестированных нами решений, таких как Sourcegraph Cody, GitHub Copilot и AWS Code Whisper, можно выполнять резюмирование целых файлов в течение нескольких секунд. Создадим реальный сценарий, чтобы посмотреть, каким крутым помощником может оказаться ChatGPT.

Пример рабочего процесса

Предположим, команда разработчиков создает новую функцию для приложения электронной коммерции. Она планирует интегрировать новый сторонний платежный шлюз под названием SuperCoolPay. Будучи AppSec-инженером, вы не знакомы с API SuperCoolPay и связанными с ним потенциальными проблемами безопасности. Перед вами стоит задача изучить новый сервис и обеспечить безопасное взаимодействие с ним приложения. Вот где понадобятся способности генеративного ИИ к резюмированию.

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

Пример рабочего процесса AppSec-инженера с использованием ИИ: автоматизированное моделирование угроз путем анализа кода

Ограничения ИИ/больших языковых машин

  1. Не всегда генерируется наиболее точная и подробная информация, связанная с новым сервисом. Это объясняется тем, что ИИ работает на основе шаблонов и аналогий.
  2. Разработчику придется копировать и вставлять код, чтобы создать конкретный контекст для приложения или интерфейсов SuperCoolPay. Ограничение размера промптов и отсутствие конкретных эмбеддингов для кода еще больше мешают получить общую картину того, как конкретный код используется во всем приложении. Для истинного интроспективного анализа репозитория необходимо искать другие инструменты.
  3. Внешние зависимости от других API/сервисов, которые могут стать частью модели угроз, созданной человеком, скорее всего, будут пропущены, поскольку сам репозиторий используется исключительно для получения контекста.

Дополнительные инструменты

Виртуальные ассистенты с ИИ, помогающие писать код, такие как Copilot и CodeWhisper, могут стать дополнительными инструментами. Они способны резюмировать API-интерфейсы SuperCoolPay непосредственно из кодовой базы, разбивая сложные структуры на удобные для восприятия фрагменты. Они могут просмотреть документацию нового сервиса по API, предоставив вам полный контекстный обзор каждой конечной точки с описанием методов, ожидаемых входов/выходов и связанных с ними потоков авторизации. Примечание: резюмирование зависит от качества документации по новому коду, опубликованной разработчиком.

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

Примеры промптов для AppSec-инженеров:

  • Кратко опиши репозиторий по примерам использования.
  • Кратко опиши технологии, используемые в репозитории.
  • Какие внешние и/или внутренние функции импортируются и используются?
  • Отследи вызов функции, которая <вставить действие>. Добавь фрагменты кода из 10 строк до и после вызова функции.
  • Имеются ли управляемые пользователем входные данные? Если да, то подвергаются ли они должной проверке или очистке?
  • Имеются ли функции, вызывающие потенциально небезопасные библиотеки или другие функции?
  • Какие методы или функции аутентифицированы, а какие нет?
  • Если используются какие-либо JWT, то проверены ли они? Как долго длятся JWT-сессии?
  • Какие HTTP-методы используются в данном репозитории, есть ли недостающие настройки безопасности для куки?
  • Какие вызовы API выполняются? Сгруппируй их по внутренним и внешним параметрам на основе <вставить внутренний контекст DNS>.

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

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

В число преимуществ виртуальных ассистентов с ИИ, помогающих писать код, входит способность обучаться на миллионах строк кода, предлагая лучшие практики и предостерегая от распространенных подводных камней. Однако эти решения имеют и свои недостатки. Большим языковым моделям не свойственно понимание контекста и цели кода, что приводит к потенциальным ошибкам в интерпретации. Это связано в первую очередь с тем, что модели обучаются на больших объемах текста, а GPT3.5 в своем исходном виде не приспособлен для решения этой задачи. Кроме того, ИИ не может заменить человеческую изобретательность, особенно когда речь идет о распознавании уникальных векторов угроз. Поиск логических ошибок  —  распространенная область, с которой большая языковая модель справится с большим трудом.

Сочетание диалогового ИИ, такого как ChatGPT, и помощников по написанию кода с ИИ, таких как Copilot и CodeWhisper, может значительно упростить процесс ознакомления и обеспечения безопасности новых сервисов в среде приложения. По мере дальнейшего развития эти инструменты, несомненно, станут бесценными союзниками как для AppSec-инженеров, так и для разработчиков, помогая ориентироваться в постоянно меняющемся ландшафте безопасности приложений.

Советы от профессионалов:

  • Вот пример замечательного рабочего процесса: возьмите swagger.yml из коммита “a” и swagger.yml из коммита “b” и попросите ChatGPT резюмировать изменения. Понимание того, как изменились API бэкенда с момента последнего просмотра, приведет к значительному увеличению производительности. С json-файлами формата OpenAPI такое понимание, как правило, очень значительное.
  • Ознакомьтесь с анализом пользовательских историй с помощью GenAI Security Analyst. Он поможет выявить проблемы безопасности в то время, как владельцы продуктов сосредоточены на разработке их функций.

Автогенерация кода для минимизации угроз с использованием контекста

Контекст имеет значение

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

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

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

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

Добавление контекста, позволяющего Gen AI выдавать более качественный ответ

Искусственный интеллект и большие языковые модели помогают в обоих аспектах, но только при наличии контекста. Рассмотрим на примере, как это может быть реализовано. Допустим, AppSec-инженер предоставляет шаблон промптов, примерный псевдокод которого (или псевдопромпт) выглядит следующим образом:

----------START CHATGPT prompt
---------------------------
SECURITY Context:
---------------------------
DESCRIPTION: An SQL Injection is a code injection technique that attackers use to insert malicious SQL code into input from client to application. This vulnerability exists when the application includes unfiltered user input in an SQL query.
(ОПИСАНИЕ: SQL-инъекция - это техника инъекции в код, которую злоумышленники используют для вставки вредоносного SQL-кода во входные данные, поступающие от клиента к приложению. Данная уязвимость возникает, когда приложение включает нефильтрованный пользовательский ввод в SQL-запрос).
THREAT: This can lead to data breaches, unauthorized access, or potential damage to your database.
(УГРОЗА: это может привести к утечке данных, несанкционированному доступу или потенциальному повреждению базы данных).
MITIGATION: Use parameterized queries or prepared statements to mitigate this threat. Always sanitize and validate user inputs before using them in your SQL statements.
(ПРОТИВОДЕЙСТВИЕ: для защиты от этой угрозы используйте параметризованные запросы или подготовленные операторы. Перед использованием в SQL-запросах пользовательских данных всегда выполняйте их очистку и валидацию).
---------------------------
DEVELOPER Context
---------------------------
1. API REQUEST HANDLER:
// **Напиши сюда код для обработки параметров запроса или тела POST**
[YOUR REQUEST HANDLING CODE HERE]

// Пример:
/*
const express = require('express');
const app = express();
app.use(express.json());
app.post('/user', (req, res) => {
const { username, password } = req.body;
// Остальной код...
});
*/

2. BUSINESS LOGIC FUNCTION:
// **Напиши здесь код для передачи этих переменных в функцию для выполнения бизнес-логики**
[YOUR BUSINESS LOGIC FUNCTION CODE HERE]

// Пример:
/*
function createUser(username, password) {
// Остальной код...
}
*/
3. SQL STATEMENT CREATION:
// **Напиши здесь код для создания SQL-оператора**
[YOUR SQL STATEMENT CREATION CODE HERE]
// Пример:
/*
let sql = `INSERT INTO users (username, password) VALUES ('${username}', '${password}')`;
*/
-----------------------
Remediation
-----------------------
Please now combine both the security and developer context to recommend changes to the developers code to best mitigate the security threat.
Теперь объедини контекст безопасности с контекстом разработчика, чтобы рекомендовать изменения в коде разработчика с целью оптимального снижения угрозы безопасности.
----------END CHATGPT prompt

А вот пример ответа от ChatGPT, демонстрирующий гибридный подход, который предоставляет контекстные решения для поиска модели угроз:

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

AppSec-инженер также может заполнить шаблон от имени разработчика. Затем они будут клонировать репозиторий, создавать новую ветку, внедрять эти изменения и открывать MR. Таким образом, AppSec-инженер и разработчик смогут рассмотреть как модель угроз, так и предлагаемое решение по коду. Иными словами, происходит переход от совещания по отчетам к совещанию по решениям. Это должно принести очки AppSec-команде за то, что она способствует развитию, а не блокирует его.

Подведение итогов

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

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

Советы от профессионалов:

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

Не ограничивайтесь только кодом

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

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

Здесь также можно призвать на помощь Gen AI. Разбирая этот контент, он позволит решить ряд ключевых задач:

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

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

Выводы

  1. Сочетание диалогового ИИ, такого как ChatGPT, и помощников по созданию кода, таких как Copilot и CodeWhisper, значительно упрощает процессы изучения и защиты новых сервисов в среде приложения.
  2. Инструменты на основе ИИ помогают масштабировать работу AppSec-инженеров и повышают ее эффективность. Но пока их следует рассматривать как инструменты, а не как конечную цель. Всегда используйте дополнительные методы обеспечения безопасности, такие как регулярные проверки безопасности кода, автоматическое сканирование уязвимостей и поддержание культуры разработки, ориентированной на безопасность.
  3. Использование промптов, специально разработанных для разработчиков и AppSec-инженеров, приводит к созданию подробных и контекстно-зависимых моделей угроз и средств их устранения. Проблема заключается в наличии знаний и контекста для их создания.
  4. Инструменты на основе ИИ будут развиваться и, несомненно, станут бесценными союзниками как для инженеров по безопасности, так и для разработчиков, помогая ориентироваться в постоянно меняющемся AppSec-ландшафте. LLMfuzz  —  отличный пример этого.
  5. Существует множество других областей, которые нам еще предстоит изучить и где инструменты на основе ИИ способны помочь как службам безопасности, так и командам по продуктам и разработчикам. Анализ, резюмирование и передача знаний на ранних этапах SDLC (инженерного цикла разработки ПО)  —  одна из областей, требующей пристального внимания исследователей, как и поиск уязвимостей на более поздних этапах.

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

Читайте также:

Читайте нас в Telegram, VK и Дзен


Перевод статьи James Chiappetta: How Automated AI Code Analysis Can Scale Application Security

Предыдущая статьяCosmo Route  —  молниеносный маршрутизатор с открытым исходным кодом и поддержкой Federation V1/V2
Следующая статьяКак с легкостью создать установщик пакетов Android