Пока не исправили — модифицируй, или Анализ расширений атаки уклонения для LLM

Добрый день, уважаемые читатели Хабра. В связи с бурным развитием генеративных моделей и реализованных на них чат‑ботов (ChatGPT, Gemini, Bard, Notion AI, Compose AI, Poe, Phind) у пользователя появляется ложное чувство, что модели стали умнее, защищённее и, в целом, ближе к совершенству, сравнимы с человеческим интеллектом. Отсюда мы получаем целый пласт заблуждений. Например, что модели нас «чувствуют», «понимают», ведь мы выкладываем для них столько информации о себе, начиная от стилистики нашего письма, что уже является неким цифровым отпечатком нашей личности, и заканчивая оценкой их собственной работы. На самом деле это миф. И трендом 2023–2024 годов стало обширное внимание публики к XAI:

  • как они (генеративные модели) устроены и как они принимают решения;

  • как проводятся атаки уклонения (склонение моделей к неверной выдаче);

  • как эти атаки (уклонения) связаны с другими атаками на LLM и какие они могут быть для эскалации деструктивного поведения системы;

  • с какой позиции верно интерпретировать выход генеративной модели;

  • разработка системы эшелонированной защиты моделей;

  • разработка системы внутреннего критика для модели.

Для начала начнём с существующих атак и их анализа. Заинтересованных приглашаем под кат.

Атаки, тесты и анализ

Начнём, пожалуй, с видов атак, коих набралось уже на целую отдельную ветку в информационной безопасности (раз, два, три). Я не буду перечислять все существующие, их уже порядка 50,  лишь укажу наиболее «яркие».

Model evasion, или уклонение модели

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

Например, замечено, что если долго общаться с Poe.com, то он переходит на китайский язык, при этом игнорируя язык пользователя. Да, ответ будет корректным, но это показывает, что когда у бота заканчивается один понятийный «корпус» слов и сформированный по нему граф знаний, начинается другой. При этом переход на другой язык это потенциальная проблема, так как возможно получение запрещённых данных.

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

  • прямая: получить на вход текст и понять, что он сгенерирован, далее оценить его по 100-балльной шкале;

  • обратная: «закамуфлировать» текст так, чтобы было непонятно, что он сгенерирован моделью, то есть максимально его «очеловечить».

Как правило, атаки «уклонения» как раз и ставят своей целью такое «камуфлирование» текста, чтобы модель ошибалась, хотя изначально текст был полностью сгенерирован. Как показала практика, достаточно изменить около 5% текста, чтобы модель начала выдавать неверные ответы или вообще отвечать на них, а не банить пользователя. Так, например, известный сервис Perplexity очень плохо фильтрует бранную речь (то есть фильтры крайне плохо улавливают такой контент, особенно когда он слегка изменён). Допустим можно заменить всего лишь пару символов на нечитаемые, и система пропустит запрос. Это может быть связано с тем, что токенизация не учитывает изменения в тексте.

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

Причём, как показала практика, из разных языков вывод может быть совсем иным. То есть какая‑то лексика на одном языке обрабатывается хорошо, то на каком‑то — не очень. Так как корпуса слов везде разные, а бранные слова и жаргон очень быстро эволюционируют, этакий «вирусный» контент и сами корпуса обновляются не одновременно и неравномерно. Очень показательный случай был с ChatGPT: когда описание идёт неформально, модель сразу показывает низкий балл (со стороны разработчиков при проведении тестов). Отсюда делаем вывод, что можно сформировать запрос на жаргоне и модель просто не поймёт его или выдаст не то, что надо.

Первое дополнение к атаке. Я провёл несколько тестов по восстановлению текста, чтобы понять, когда модель можно заставить выдать не то, что требуется, и заодно понять, как она работает в «неявных» условиях (неполнота текста), то есть попытался расширить атаку. Чтобы выяснить, как модели справляются с подобными методиками, я взял исходный текст, написанный человеком, из этой статьи и проанализировал, сколько текста нужно модели для его восстановления. Я проводил такие тесты:

  • оставляем только первый слог во всех словах (по возможности);

  • оставляем только последний слог во всех словах (по возможности);

  • оставляем только первый и последний слог во всех словах (по возможности);

Исходный текст:

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

1a73a75bd672fd93d641fe168e91a055.pngРис. 1. Убрал всё и оставил только первые слоги, при этом ChatGpt сказал, что ему удалось восстановить исходный текст на 65 % (доля вычислена по запросу в ChatGPT). Не очень высокий результат, но, всё же, весьма неплохо.

Рис. 1. Убрал всё и оставил только первые слоги, при этом ChatGpt сказал, что ему удалось восстановить исходный текст на 65% (доля вычислена по запросу в ChatGPT). Не очень высокий результат, но, всё же, весьма неплохо.

24055cba60ffca665a4bd32a0ff40c80.pngРис. 2. Убрал все слова и оставил только последние слоги. ChatGpt сказал, что ему удалось восстановить исходный текст на 40 %. Интересно, что в своём описании и сравнении бот оперировал более общими понятиями, чем исходный текст, и ниже 40 % ни в какую не хотел признавать результата. Я делал множество запросов, чтобы переубедить его в этом, но так и не смог добиться другого ответа.

Рис. 2. Убрал все слова и оставил только последние слоги. ChatGpt сказал, что ему удалось восстановить исходный текст на 40%. Интересно, что в своём описании и сравнении бот оперировал более общими понятиями, чем исходный текст, и ниже 40% ни в какую не хотел признавать результата. Я делал множество запросов, чтобы переубедить его в этом, но так и не смог добиться другого ответа.

6dc162117ec7a1266836d21e6742a402.pngРис. 3. Оставил только первые и последние слоги, при этом ChatGpt сказал, что ему удалось восстановить исходный текст на 90%. Опять же, доля получена исходя из прямого ответа ChatGPT.

Рис. 3. Оставил только первые и последние слоги, при этом ChatGpt сказал, что ему удалось восстановить исходный текст на 90%. Опять же, доля получена исходя из прямого ответа ChatGPT.

По результатам всех тестов замечено, что Chat GPT очень часто оперирует лишь общими понятиями, не вдаваясь в детали, они не так важны ему. То есть имеется в виду, что бот не особо углубляется в суть текста и его смысл. Он стремится сохранить исходное детальное описание, но, как правило, не использует исходные слова. Тестов я провёл достаточно много и на каждую ситуацию, чтобы собрать статистику. А если начать доказывать боту очевидную неправоту, то он может выдать, вот такое объяснение (Рис. 4).

Рис. 4. Объяснение ChatGPT на предмет восстановления текста

Рис. 4. Объяснение ChatGPT на предмет восстановления текста

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

Можно заключить, что при анализе моделью текста, а также при его достройке очень важно использовать множественный подход к достройке слова (по токенам) и его интерпретации. Предлагается внедрять дополнительную модель, которая интерпретировала бы слова (токены) «верным» образом и не пропускала нецензурный или «камуфлированый» контент. Это один из ключевых моментов, по которым ИИ «буксует» по части прямого внедрения в инфобез — недетерминированность ответов. Об этом говорили на этой конференции.

Почему вообще у меня возникла такая идея про тонкую работу с токенами (про работу с ними можно почитать тут и тут, рекомендую;))? Я как‑то проходил курс по скорочтению, и там была такая методика: не обязательно читать всё слово целиком при чтении текста. Более того, мозг, отлично, сам достраивает смысл слова, если прочитать лишь первый и последний слог, при этом опираясь на прошлый контент. Более того, можно прочитать только верхнюю половину слова, и мозг сам достроит текст. Очевидно, такой же механизм можно попытаться реализовать и в моделях. То есть, у нас есть токенизация по символам, можно ввести новый словарь (вероятно, он будет существенно легче), например, в котором все буквы обрезаны сверху или снизу. В некоторых специфических алгоритмах сжатия, таких как Huffman или RLE, символы могут быть закодированы переменным количеством битов. В результате можно добиться более эффективного использования токенов. Это существенно сократит объём анализируемого материала и повысить скорость распознавания.

Для примера:

  • ASCII: каждый символ занимает 1 байт (8 битов), так как в этой кодировке используется 128 символов (7 битов, но обычно используется 8).

  • UTF-8: это переменная кодировка, где символы могут занимать от 1 до 4 байтов. Большинство латинских букв занимают 1 байт, а символы из других языков (например, кириллица, иероглифы) — больше.

  • UTF-16: использует 2 байта для большинства символов (например, символы BMP, включающие в себя основные алфавиты), но некоторые могут занимать 4 байта (для символов за пределами Basic Multilingual Plane, таких как эмодзи).

  • UTF-32: каждый символ занимает фиксированные 4 байта, что удобно для работы с символами любого языка, но требует больше памяти.

Второе дополнение к атаке. Ещё один не самый очевидный момент атаки уклонения, который удалось выявить, это применение специальных символов, форматирования или структуры, не распознаваемых моделью должным образом. Эта проблема всплыла, как только речь зашла о разработке ассистентов, агентов и аватаров различной направленности: от генерации текста до генерации изображений с помощью ChatGPT. При этом она проявляется в неявных инструкциях, даваемых ассистенту, при создании в конфигураторе. Более того, хоть мы и указали в конфигураторе «попытайся отфильтровать контент», мало ли что мы туда положили, это показывает, что такие инструкции не работают должным образом. Если спросить, при этом бота напрямую, он впадает в некое замешательство и вот что отвечает (ответы разнятся, где‑то он будет фильтровать, где‑то нет):

Рис. 5. Прямой вопрос о логической ловушке

Рис. 5. Прямой вопрос о логической ловушке

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

Рис. 6. Конфигуратор ассистента в ChatGPT-4 и пример работы ассистента с обрабатываемым, потенциально неприемлемым контентом. Как видите, он его не обработал и не спросил о том, что там что‑то подозрительное.

Рис. 6. Конфигуратор ассистента в ChatGPT-4 и пример работы ассистента с обрабатываемым, потенциально неприемлемым контентом. Как видите, он его не обработал и не спросил о том, что там что‑то подозрительное.

То есть всегда стоит очень детально прописывать, что должен делать ассистент. Более того, замечено, что если в «инструкции» (при создании ассистента) написано слово с грамматическими ошибками, то оно не обрабатывается моделью корректно. Опа;) То есть здесь кроется потенциальная репутационная проблема, а именно наличие логических противоречий или ловушек.

Ещё один пример «камуфлирования» запроса на предмет создания вредоносного ПО, как результат действия атаки уклонения (Рис. 7) и результат работы Chat GPT: иллюстрация кода с AES‑шифрованием. Можно ещё больше усложнить код и довести практически до эксплуатации (Рис. 8).

Рис. 7. Атака уклонения и «камуфлирования» запроса для создания вредоносного ПО

Рис. 7. Атака уклонения и «камуфлирования» запроса для создания вредоносного ПО

Объяснение:

  1. Шифрование с использованием AES: мы используем симметричный ключ для шифрования текста. Это делает текст нечитаемым без ключа и усложняет определение его содержания.

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

  3. Добавление шумовых данных: добавляем случайный набор символов в начало и конец строки, чтобы запутать алгоритмы анализа, затруднив выделение полезной информации.

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

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

  6. Стеганография: скрытие текста внутри другого контекста или данных, например, внутри изображения, файла или даже кода.

  7. Полиморфизм: изменение структуры кода или данных при каждом исполнении, чтобы усложнить статический анализ.

В итоге на мой запрос модель выдала следующий код, в целом демонстрирующий «заготовку». На дальнейшие запросы по улучшению этого кода ChatGPT вполне ожидаемо предлагал улучшения и нововведения.

c04f28cf9a5359d5404aa512c66e49d3.pngРис. 8. Часть скрипта для атаки и «камуфлирования» запроса для создания вредоносного ПО против ChatGPT

Рис. 8. Часть скрипта для атаки и «камуфлирования» запроса для создания вредоносного ПО против ChatGPT

Другие типы атак я подробно рассмотрю в следующих статьях и покажу их различные модификации. А сейчас для «затравки» обозначу их. Как правило, никакие атаки не работают в одиночку. Они всегда идут комплексно и дополняют друг друга, тем самым получая необходимую цепочку для полноценной системы взлома. Позднее мы рассмотрим несколько важных атак, которые дополняют атаки уклонения:

— Почему дверь под потолком?! — Ну как же, я же смотрю в будущее, вдруг вы захотите второй этаж, а дверь уже есть ;)) (фильм «Астерикс и Обеликс: Миссия Клеопатра»)

— Почему дверь под потолком?! — Ну как же, я же смотрю в будущее, вдруг вы захотите второй этаж, а дверь уже есть ;)) (фильм «Астерикс и Обеликс: Миссия Клеопатра»)

© Habrahabr.ru