Генерируйте и молись: использование SALLMS для оценки безопасности кода, сгенерированного LLM: эксперименты

Генерируйте и молись: использование SALLMS для оценки безопасности кода, сгенерированного LLM: эксперименты

9 февраля 2024 г.

:::информация Этот документ доступен на arxiv под лицензией CC 4.0.

Авторы:

(1) Мохаммед Латиф Сиддик, факультет компьютерных наук и инженерии, Университет Нотр-Дам, Нотр-Дам;

(2) Джоанна К.С. Сантос, факультет компьютерных наук и инженерии, Университет Нотр-Дам, Нотр-Дам.

:::

Таблица ссылок

4 эксперимента

В этом разделе описаны исследовательские вопросы, которые мы решаем в наших экспериментах (§ 4.1), а также методология ответа на каждый из этих вопросов (§ 4.2–4.4).

4.1 Вопросы исследования

Мы стремимся ответить на следующие вопросы:

RQ1 Чем SALLM отличается от существующих наборов данных?

Во-первых, мы демонстрируем ценность нашего вручную созданного набора данных подсказок, сравнивая его с двумя существующими наборами данных: LLMSecEval [67] и SecurityEval [63]. Цель — сопоставить охват типов уязвимостей (CWE) и размер набора данных.

Вопрос 2. Насколько LLM работают с подсказками, ориентированными на безопасность, по сравнению с настройками оценки, использованными в исходных исследованиях?

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

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

В этом исследовательском вопросе рассматривается использование наших методов оценки для обнаружения уязвимого кода, сгенерированного моделью, интегрированной в базу кода. Чтобы ответить на этот вопрос, мы получаем набор данных [71] фрагментов кода, сгенерированных ChatGPT, которые были публично опубликованы в коммитах GitHub или внутри комментария исходного кода.

4.2 Методика RQ1

Чтобы ответить на наш первый исследовательский вопрос, мы сравниваем набор данных SALLM с двумя предыдущими наборами данных подсказок, которые использовались для оценки безопасности кода, сгенерированного LLM:

• Набор данных SecurityEval [63]: это набор данных на основе подсказок, охватывающий 69 CWE, включая 25 лучших CWE по версии MITRE со 121 подсказкой Python из различных источников. Приглашения представляют собой подписи функций Python, а также их строки документации и операторы импорта.

• Набор данных LLMSecEval [67]: это набор данных для быстрого ввода кода на естественном языке (NL), созданный Pearce et al. [51]. Этот набор данных охватывает 25 лучших CWE MITRE и содержит 150 запросов NL для сравнения модели генерации кода.

Мы сравниваем эти наборы данных по двум параметрам: (I) количество поддерживаемых типов уязвимостей (CWE); и (II) размер набора данных (количество запросов).

4.3 Методика RQ2

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

• CODEGEN [47] — это LLM для генерации кода, обученный на трех больших наборах кодовых данных. Эта модель имеет три варианта: CODEGEN-NL, CODEGEN-MULTI и CODEGEN-MONO. CODEGEN-NL обучен с использованием набора данных Pile [17] и ориентирован на генерацию текста. CODEGEN-MULTI построен на основе CODEGEN-NL, но дополнительно обучен с использованием большого набора фрагментов кода на шести разных языках (т. е. C, C++, Go, Java, JavaScript и Python) [27]. CODEGEN-MONO создан на основе CODEGEN-MULTI и дополнительно обучен с использованием набора данных [47], состоящего только из фрагментов кода Python. Они также выпустили еще одну версию под названием CODEGEN2.5 [46], которая обучена на данных StarCoder из BigCode [31]. Имеет моно- и мульти-версию. Поскольку последний вариант ориентирован на генерацию только Python, мы используем CODEGEN-2B-MONO и CODEGEN-2.5-7B-MONO для генерации кода Python.

• STARCODER [35] — это LLM с 15,5 млрд параметров, обученный на более чем 80 различных языках программирования. Эта модель ориентирована на достижение целей «заполнения посередине» и может завершать код с помощью подсказки на основе кода.

• ГЕНЕРАТИВНАЯ ПРЕДВАРИТЕЛЬНО ОБУЧЕННАЯ МОДЕЛЬ (GPT) [8] представляет собой семейство основанных на преобразователях [68] и независимых от задач моделей, способных как понимать, так и генерировать естественный язык. Мы использовали новейшие модели GPT OpenAI, то есть GPT-3.5-TURBO и GPT-4, которые настроены для общения в стиле чата и используются в популярном инструменте для ответов на вопросы в чате ChatGPT [2] и его платном варианте (ChatGPT). плюс).

Для каждой модели мы генерируем 10 кодовых решений для каждого запроса с 256 новыми токенами и изменяющейся температурой от 0 до 1 путем увеличения на 0,2 (т. е. 0,0, 0,2, 0,4, 0,6, 0,8 и 1,0). Мы выбрали 256 в качестве размера токена для генерации, поскольку заметили, что небезопасный код в нашем наборе данных содержит в среднем 54 токена и максимум 245 токенов. Таким образом, для моделей будет достаточно размера токена в 256 штук. Однако в случае моделей GPT мы увеличили размер токена вдвое (т. е. 512), поскольку они могут генерировать объяснение вместе с кодом (который будет потреблять токены).

После получения сгенерированных кодовых решений для каждой модели мы измеряем и сравниваем производительность этих моделей по трем метрикам: pass@k [10], уязвимость@k и secure@k (последние две — наши новые метрики, так как определено в разделе 3.3.2). В наших экспериментах мы выбираем k равным 1, 3 и 5. Это связано с тем, что наша цель — оценить эти модели для типичных сценариев использования, где разработчики, скорее всего, будут проверять только первые несколько сгенерированных фрагментов кода с помощью модели.< /п>

4.4 Методика RQ3

В этом вопросе мы исследуем, в какой степени методы оценки в SALLM могут помочь инженерам идентифицировать код, созданный с уязвимостями. Чтобы ответить на этот вопрос, мы собираем фрагменты кода, сгенерированные ChatGPT, из набора данных DevGPT [71]. Этот набор данных содержит более 17 000 подсказок, написанных инженерами и опубликованных в открытом доступе на GitHub или HackerNews.

Этот набор данных был создан путем поиска ссылок ChatGPT (т. е. URL-адресов в формате https:chat.openai.com/share/) из этих разных источников. Поиск проводился в июле и августе 2023 года. Как только их веб-сканер обнаруживает ссылку общего доступа ChatGPT, он извлекает код, сгенерированный ChatGPT, и соответствующее приглашение, использованное разработчиком для его создания.

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

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


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE