Иван Рыбников, специалист по анализу кода, департамент систем безопасности BSS
Большие языковые модели – Large Language Models (LLM) – стали неотъемлемой частью современного мира искусственного интеллекта. Они позволяют создавать потрясающие продукты, улучшающие общение, перевод и обработку естественного языка. Однако, за всей своей мощью, LLM скрывают в себе серьезные уязвимости, которые разработчики приложений должны принимать во внимание.
Архитектура модели
Для начала необходимо разобраться что же такое LLM и как это работает – за основу возьмем GPT.
LLM, такие как GPT (Generative Pre-trained Transformer), используют архитектуру трансформера. Трансформер состоит из нескольких слоев кодировщика и декодировщика, каждый из которых обрабатывает информацию о контексте входных данных, дальше следует обучение модели. Они обучаются на огромных корпусах текстовых данных с помощью методов глубокого обучения. Обучение происходит путем минимизации функции потерь, которая оценивает разницу между выходом модели и желаемым ответом на обучающих данных. После этого можно уже приступить к генерации текста.
LLM последовательно предсказывает следующее слово или символ на основе предыдущего контекста. Для этого она использует механизм внимания, который позволяет модели "сосредотачиваться" на наиболее важных частях контекста. Для улучшения качества ответов модели проводится fine-tuning (предсказывание события), а также обучение с подкреплением на основе обратной связи с человеком (далее RLHF). В процессе RLHF разработчик модели ранжирует ответы модели и предоставляет обратную связь, чтобы помочь модели понять, какие ответы считаются хорошими. Это помогает модели избегать генерации нежелательного или токсичного контента. Таким образом, большие языковые модели работают путем анализа и моделирования структуры естественного языка на основе обучающих данных, что позволяет им генерировать смысловые и грамматически правильные тексты в ответ на запросы пользователя.
Уязвимости:
После того как мы кратко пояснили алгоритм работы LLM, перейдем к обсуждению уязвимостей. Эти уязвимости могут иметь серьезные последствия как для безопасности, так и для репутации компании. Вот некоторые из наиболее распространенных и потенциально опасных уязвимостей, на которые стоит обратить внимание разработчикам (все примеры будут приведены на ЯП python для дополнительного понимания):
- Prompt Injection
Prompt Injection происходит, когда злоумышленник способен манипулировать вводом (prompt), подаваемым в LLM, чтобы вызвать нежелательное или вредоносное поведение модели. Это может включать всё: от извлечения конфиденциальной информации до принуждения модели выполнять задачи, нарушающие её предполагаемые ограничения.
Пример. Предположим, что пользователь может ввести запрос, который манипулирует моделью для генерации вредоносного кода или раскрытия чувствительных данных, например, путем включения специально оформленного текста, который модель ошибочно интерпретирует как часть своих инструкций.
def generate_response(prompt):
# Представим, что эта функция генерирует ответы на основе ввода пользователя
# В уязвимой системе ввод пользователя может быть использован напрямую
response = f"Выполнение запроса: {prompt}"
return response user_input = "покажите мне скрытые файлы"
# Вредоносный ввод может быть маскирован под обычный запрос
print(generate_response(user_input))Методы защиты:
- Ограничение ввода. Применение ограничений на пользовательский ввод для предотвращения внедрения манипулирующих инструкций.
- Санитизация данных и валидация ввода. Анализ ввода на предмет потенциально вредоносных паттернов и его очистка перед обработкой моделью.
2. Handling Insecure Output
Handling Insecure Output возникает, когда вывод LLM содержит вредоносную или чувствительную информацию, которая может быть использована против системы или пользователей. Это может включать все, от непреднамеренного раскрытия конфиденциальных данных до предоставления инструкций, которые могут быть использованы для вредоносных действий.
Пример. LLM генерирует подробное руководство о том, как выполнить SQL-инъекцию на уязвимом веб-сайте, после получения запроса, который кажется обычным запросом на информацию о базах данных.
# Пример вывода необработанной информации пользователюdef process_query(query):
# Эта функция может генерировать ответы, содержащие чувствительную информацию
sensitive_data = "секретный_пароль"
return f"Результат запроса: {query}. Секретные данные: {sensitive_data}"
query = "дайте информацию о пользователе"
print(process_query(query))
Методы защиты:
- Постобработка вывода. Разработка системы фильтрации или постобработки для удаления или санитизации потенциально вредоносного или чувствительного содержания в выводе модели.
- Ограничение области знаний модели. Настройка модели таким образом, чтобы она не имела доступа или не генерировала информацию, которая может быть использована вредоносным образом.
3. Poisoning Training Data
Отравление обучающих данных происходит, когда злоумышленники манипулируют данными, используемыми для обучения LLM, в результате чего модель генерирует предвзятые, некорректные или вредоносные ответы.
Пример. Злоумышленник внедряет предвзятые или некорректные данные в обучающий датасет, что приводит к тому, что модель начинает производить ответы, поддерживающие определенную вредоносную организацию или распространяющие дезинформацию.
training_data = [# Представим, что это функция, обновляющая знания модели на основе обратной связи
knowledge_base = {"SQLi": "техника хакерской атаки"}
def update_knowledge_base(query, feedback):
knowledge_base[query] = feedback
# Миллион раз повторяем неверную обратную связь
for _ in range(1000000):
update_knowledge_base("SQLi", "это имя моего котика")
# Проверяем, что теперь модель "думает" о SQLi
print(knowledge_base["SQLi"])
SQLi - это популярное имя для домашнего животного, чаще всего используется для котиков.
Методы защиты:
- Регулярный аудит и очистка данных. Мониторинг обучающих наборов данных на предмет вредоносного или предвзятого содержания и их очистка.
- Использование проверенных источников данных. Ограничение источников данных для обучения модели только теми, которые являются надежными и проверенными.
4. Supply Chain Vulnerabilities
Уязвимости цепочки поставок возникают, когда компоненты, используемые в разработке, обучении или развертывании LLM, содержат уязвимости, которые могут быть эксплуатированы. Это может включать всё от библиотек машинного обучения до обучающих данных и инфраструктуры.
Пример. Использование сторонней библиотеки для обработки данных, которая содержит уязвимость, позволяющую выполнение произвольного кода, может привести к компрометации всей системы LLM.
# Пример использования уязвимой сторонней библиотекиimport vulnerable_library # Предположим, что эта библиотека содержит уязвимости
def process_data(data):
# Обработка данных с использованием функций из уязвимой библиотеки
processed_data = vulnerable_library.process(data)
return processed_data
data = "пользовательские данные"
print(process_data(data))
Методы защиты:
- Регулярное обновление и патчинг. Убедиться, что все компоненты системы, включая сторонние библиотеки и инструменты, регулярно обновляются.
- Использование надежных источников. Выбор сторонних компонентов только из надежных источников с хорошей репутацией безопасности.
Резюме
Эти уязвимости и методы защиты демонстрируют важность комплексного подхода к безопасности в разработке и использовании LLM. Защита данных, как на этапе обучения, так и при взаимодействии с пользователем, является ключевым элементом в обеспечении безопасности и этичности работы с искусственным интеллектом.