РАЗБОР
Статья
Стеганография текста с LLM: embedding и детект
[ обложка статьи ]
Режим чтения
Arithmetic coding, Discop, ADG - за последний год я прогнал через детекцию основные методы встраивания payload в текст через языковые модели. Black-box метод LLM-Stega выжимает 5.93 бита на слово (по данным оригинальной работы). А стандартные стеганализаторы - LS-CNN, BiLSTM-Dense, BERT-FT - показывают accuracy 49-51%. Это random guess. Монетка. Генеративная стеганография нейросетей обнулила классические методы обнаружения скрытых сообщений ИИ.
Но работа из arxiv (2405.09090) показывает обратное: LLM с instruction fine-tuning детектируют стеготекст там, где классификаторы бессильны. Ниже - полная механика embedding, сравнение режимов встраивания, практика детектирования и операционный контекст для red/blue team.
Механика встраивания: от распределения токенов к скрытым каналам данных LLM
Классическая текстовая стеганография оперирует готовым текстом: замена синонимов, манипуляция пробелами, изменение форматирования. Embedding rate - доли бита на слово, детекция тривиальна. Стеганография текста с LLM работает на другом уровне: payload встраивается не в готовый текст, а в сам процесс генерации - при выборе каждого следующего токена.Языковая модель генерирует текст последовательно. На каждом шаге она выдаёт распределение вероятностей P(t_i|t_1...t_{i-1}) по всему словарю - десятки тысяч кандидатов, у каждого конкретное числовое значение вероятности. Стеганографический алгоритм перехватывает этот момент: вместо стандартного sampling (top-k, nucleus) он выбирает токен, который одновременно достаточно вероятен для естественности текста и кодирует нужные биты секретного сообщения.
Преимущество перед классикой - фундаментальное. Текст генерируется с нуля, без исходного носителя. Нет оригинала для сравнения. Нет артефактов замены. Есть только текст, который выглядит как обычный вывод LLM. Отличие от watermarking LLM текста: watermark встраивает сигнал для авторизованного детектирования (подтверждение происхождения), стеганография - для скрытой передачи данных через текст. Механика пересекается, цели противоположны.
Отдельная история - влияние BPE-токенизации на обнаружимость. Byte-pair encoding разбивает слова на подслова: одно "слово" для модели - это 2-4 токена, каждый из которых несёт payload-биты. С одной стороны, ёмкость канала растёт. С другой - появляется характерный паттерн: частые подслова (корни, суффиксы) имеют стабильно высокую вероятность, а стего-алгоритм вынужден выбирать среди них. Распределение рангов выбранных подсловных единиц может отличаться от нормального текста - малоисследованный, но перспективный вектор для детекции. Я проверял это через сравнение гистограмм sub-token рангов на корпусе обычного текста и стеготекста: при BPW выше 3 аномалия заметна, при BPW 1-2 - на грани шума.
Codebook: арифметическое кодирование и деревья Хаффмана
Лингвистическая стеганография на основе LLM строится вокруг codebook - таблицы соответствия между битовыми последовательностями и токенами на каждом шаге генерации. Три семейства подходов определяют баланс между ёмкостью и скрытностью. И именно здесь вылезает эффект Psic (Perceptual-Statistical Imperceptibility Conflict): оптимизируешь под статистическую неразличимость - ухудшаешь восприятие текста человеком. И наоборот.Деревья Хаффмана. На каждом шаге алгоритм получает распределение вероятностей для токенов-кандидатов. Кандидаты с вероятностью ниже порога τ отсекаются. Из оставшихся строится локальное дерево Хаффмана: более вероятные токены получают короткие битовые коды, менее вероятные - длинные. Следующий фрагмент битового потока секретного сообщения определяет путь по дереву и выбранный токен. Исследование zero-shot подхода на LLaMA2-Chat-7B показывает: при t=0.01 BPW достигает 2-3 бит, но дивергенция Дженсена-Шеннона (JSD) между стеготекстом и обычным текстом растёт. При t=0.1 BPW падает, зато JSD снижается до уровня, где статистическое различение затруднено. Дополнительные механизмы - annealing (динамическая регулировка температуры при малом пуле кандидатов) и штраф за повторение недавно использованных токенов - улучшают естественность, но режут embedding rate.
Арифметическое кодирование (ADG). Вместо дискретного дерева - непрерывный интервал [0, 1], рекурсивно разбиваемый пропорционально вероятностям токенов. Текущее значение битового потока определяет подинтервал. ADG выжимает 5.63 BPW - существенно выше Хаффмана, но за счёт большей статистической заметности.
Distribution preserving (Discop). Метод стремится к нулевой дивергенции: выбор токена производится так, чтобы результирующее распределение стеготекста совпадало с оригинальным распределением модели. Теоретически стеганализ невозможен - нет статистического сигнала. На практике Discop даёт 4.76 BPW с минимальной JSD. Но вот парадокс: слишком идеальный текст - сам по себе аномалия.
Edge Flipping. Техника предварительной обработки битового потока: исходный поток преобразуется путём записи позиций, где последовательные биты отличаются. Это минимизирует количество единичных битов, смещая выбор в сторону более вероятных токенов (более низких рангов в дереве) и повышая естественность текста.
Концептуально встраивание бита в выбор токена:
Python:
# пример для демонстрации концепции
logits = model(input_ids).logits[:, -1, :]
probs = torch.softmax(logits, dim=-1)
sorted_p, indices = probs.sort(descending=True)
candidates = indices[sorted_p > tau]
# упрощение: 1 бит payload делит кандидатов на две группы,
# из выбранной группы берётся наиболее вероятный токен.
# Реальный Huffman рекурсивно дробит группы по битовому потоку.
half = len(candidates) // 2
group = candidates[:half] if secret_bit == 0 else candidates[half:]
next_token = group[0] # всегда top-1 в группе (1 бит на шаг)
White-box и black-box стеганография языковых моделей
Различие, которое русскоязычные источники почти не раскрывают. А зря - white-box и black-box режимы встраивания кардинально различаются по вектору угрозы и порогу входа.
White-box - атакующий имеет полный доступ к модели: веса, словарь, распределение вероятностей на каждом шаге. Все описанные выше методы (Хаффман, ADG, Discop) - white-box. Требуют локального запуска модели (GPT-2, LLaMA, Mistral) и прямого доступа к logits через
model(input_ids).logits. Дают максимальный контроль над кодированием, но предполагают наличие GPU и компетенции в ML.Black-box - атакующий взаимодействует с моделью исключительно через API или интерфейс (ChatGPT, Claude). Доступа к logits нет. Метод LLM-Stega решает задачу через prompt engineering: строится оптимизированный набор ключевых слов, определяется steganographic mapping между секретным сообщением и позицией/числом повторений ключевых слов в промпте, reject sampling обеспечивает корректное извлечение. Результат - 5.93 BPW при detection accuracy 49-51% (по данным авторов метода). В терминах человеческой оценки (fluency, coherence, relevance) LLM-Stega тексты оценивались выше, чем тексты от white-box методов. Prompt-based подход генерирует более естественный стеготекст - даже без доступа к внутренностям модели.
И вот что делает black-box опаснее с операционной точки зрения: не нужен GPU, не нужно локальное развёртывание, не нужна ML-экспертиза. Достаточно API-ключа коммерческой LLM. Порог входа для лингвистической стеганографии в реальных операциях - минимальный.
Shared-parameter steganography - третий вектор, описанный исследователями SPY Lab. Сценарий: две копии одной модели (encoder и decoder) используют общие параметры (обучающее распределение, веса) для координации стеганографического протокола без явного обмена ключами через приватный канал. Эксперименты показывают: o3-mini эффективен в кодировании при наличии внешнего ключа (списка чисел). Но модели из других семейств (DeepSeek, Gemini) декодируют сообщения o3-mini с той же точностью - преимущество shared parameters не подтвердилось для базовых схем.
Ситуация меняется при fine-tuning: GPT-4.1, дообученный на фразах с упоминанием конкретного вида птиц, начинает использовать этот вид как ключ шифрования. Другие модели декодировать такие сообщения не могут - координация становится модель-специфичной. Красиво.
Текущие ограничения фронтирных моделей при самостоятельной стеганографии: ошибки при символьных операциях (XOR, Vigenère) без code execution, систематическое игнорирование предоставленного ключа шифрования, использование тривиальных методов (акростих). При этом compliance - 100%: модели всегда пытаются выполнить стеганографическую задачу. Quality пока низкий, но с ростом capabilities ситуация изменится. Это не вопрос "если", а вопрос "когда".
Детектирование стеганографии в тексте: от статистики к LLM-стеганализу
Встраивание - задача атакующего. Стеганализ - задача защитника. За последние два года здесь произошёл тектонический сдвиг: классические методы упёрлись в потолок, и обнаружение скрытых сообщений ИИ требует принципиально другого инструментария.
Перплексия и энтропия: классические метрики обнаружения
Традиционный стеганализ текста опирается на статистический анализ. Три основные метрики - и почему они больше не работают.Перплексия (PPL). Мера "удивления" языковой модели от текста. Для стеготекста с искажённым выбором токенов PPL теоретически отличается от обычного текста. Но distribution-preserving методы оптимизированы под совпадение PPL. Парадокс из данных LLM-Stega (значения из оригинальной публикации): PPL стеготекста (165.76) ближе к PPL обычных предложений (185.64), чем PPL Discop (46.73). Discop даёт аномально низкую перплексию - текст "слишком гладкий". Если обычный текст имеет PPL ~185, а стеготекст ~46 - это красный флаг. Но работает только при известной baseline PPL целевого домена.
KL-дивергенция. Расхождение между распределениями стеготекста и обычного текста в латентном пространстве (BERT-представления). LLM-Stega показывает минимальную KLD - распределения практически совпадают, различить их статистически невозможно.
Per-token log-likelihood. Для каждого токена вычисляется log-likelihood в контексте предшествующих токенов. У обычного текста характерная дисперсия: "предсказуемые" токены (артикли, предлоги) имеют высокий ll, "неожиданные" (редкие термины) - низкий. У стеготекста с Хаффманом дисперсия может сглаживаться: выбор определяется битовым потоком, а не языковой моделью. Аномально равномерное распределение per-token ll - потенциальный детектирующий сигнал.
Python:
# per-token log-likelihood: ищем аномально ровное распределение
with torch.no_grad():
out = model(input_ids, labels=input_ids)
logits = out.logits[..., :-1, :].contiguous()
labels = input_ids[..., 1:].contiguous()
per_tok = -F.cross_entropy(
logits.view(-1, logits.size(-1)),
labels.view(-1), reduction='none')
# std(per_tok) аномально низкий -> подозрение на стего
# std(per_tok) в пределах baseline -> вероятно чистый текст
LLM-based стеганализ: обнаружение скрытых каналов нового поколения
Исследование arxiv 2405.09090 (Tier-1) предлагает другой подход: задача переформулируется из бинарной классификации (stego/cover) в генеративную парадигму. LLM получает текст и генерирует текстовый ответ - стеганографический ли текст, с объяснением почему.Результаты меняют расклад в AI covert channel detection:
Способность к детектированию стеганографии уже "зашита" в LLM. Instruction fine-tuning лишь активирует её. Модель замечает неестественность формулировок, нарушения связности, семантические аномалии - сигналы, невидимые для статистических классификаторов. Именно то, что distribution-preserving методы не способны подавить: текст с нулевой JSD всё равно может "звучать странно" для человека - и для LLM тоже.
LLM-стеганализатор превосходит все baseline-методы с существенным отрывом. На стеготекстах от distribution-preserving алгоритмов, где accuracy классических нейросетевых подходов варьируется от ~50% (на скрытных методах вроде LLM-Stega) до ~75% (на менее скрытных - ADG, Хаффман), LLM-based детектирование показывает значительное улучшение. Это подтверждается на нескольких датасетах и разных методах генерации стеготекста.
Domain-agnostic: один fine-tuned LLM-стеганализатор работает на текстах из разных доменов (новости, рецензии, техническая документация) без дополнительного обучения. Классические стеганализаторы требуют точного совпадения домена обучающей и целевой выборки. Малейшее расхождение - обучали на новостях, тестируете на рецензиях - и accuracy проседает критически. LLM решает эту проблему за счёт обобщающих способностей. В реальных условиях, где домен перехваченного текста заранее неизвестен, это решающий фактор.
Prompt design критичен: оптимальный промпт включает явную формулировку задачи (
Is the above text steganographic or non-steganographic?), формат ответа и few-shot примеры с обоснованием. Код и обученные модели авторы выложили на GitHub (github.com/ba0z1/Linguistic-Steganalysis-with-LLMs).Скрытая передача данных через текст в операционном контексте
Текущие ограничения. Оценка фронтирных моделей (Claude, GPT, Gemini) показывает зачаточные стеганографические способности. Без доступа к scratchpad/CoT модели почти всегда проваливаются. С доступом к CoT - успех значительно выше, но overseer-модель часто распознаёт подозрительность. Модели понимают необходимость скрытности, но не реализуют её убедительно. При попытке спрятать encoded reasoning в ответ про установку солнечных панелей - результат вызывает подозрение при ручном анализе. Также модели часто игнорируют предоставленный ключ шифрования, применяют тривиальные методы (акростих). Доступ к code execution существенно повышает quality - символьные операции "в весах" (text completion) ненадёжны, через интерпретатор работают стабильно.
Вывод для red team: самостоятельное использование LLM-агентов для стеганографии пока ненадёжно. Специализированный инструментарий (white-box с доступом к logits) работает уже сейчас.
Рекомендации для blue team. Стандартные DLP не обнаружат LLM-стеганографию - они ищут regex-паттерны и ключевые слова, а стеготекст грамматически корректен и семантически осмыслен. Нужен выделенный pipeline: baseline текстовой активности (DE.AE-01 по NIST CSF 2.0), LLM-based стеганализатор на перехваченных текстах, мониторинг аномалий в паттернах генерации (нетипичная длина, нетипичный домен, нетипичная частота). Расследование инцидентов (RS.AN-01) для LLM-стего требует специфической экспертизы - стандартный SOC-аналитик не распознает стеготекст без инструментария.
Стеганография текста с LLM - рабочий примитив для covert channels, реализуемый доступными инструментами уже сегодня. White-box методы дают 2-5 BPW с detection на уровне random guess. Black-box методы работают через API без специальных знаний. LLM-based стеганализ - единственный подход с реальной эффективностью, но он требует fine-tuning и инфраструктуры.
На мой взгляд, через год-два мы увидим первые задокументированные инциденты с использованием LLM-стеганографии в APT-операциях. Не потому что техника новая - а потому что порог входа достиг минимума: black-box через API, zero-shot без обучения модели, embedding rate достаточный для передачи ключей и команд одним абзацем текста. Неудобная правда: большинство организаций этот вектор не рассматривают вообще. Их DLP заточены под regex и ключевые слова, а стеготекст - грамматически безупречный текст без единого триггера. Между наличием open-source кода (ADG, Discop, LLM-Stega, обученные стеганализаторы на GitHub) и интеграцией хотя бы одного из этих инструментов в SOC-процесс - пропасть, которую никто не торопится закрывать.
Пока индустрия относится к стеганографии как к экзотике из CTF-задач, а не как к операционному примитиву для эксфильтрации, защита останется реактивной. Текстовый канал пора рассматривать наравне с сетевым и файловым - и строить детектирование соответственно. Попробуйте прогнать через стеганализатор из arxiv 2405.09090 тексты из вашего корпоративного Slack - результат может удивить. На WAPT эту связку "генерация стеготекста -> детектирование через LLM" разбирают в модуле по covert channels.
AI-выжимка
по разделам
Тезисы статьи скоро
Статья читается полностью. Тезисы со ссылками на разделы появятся позже.
Содержание
Codeby Academy
Практика и мастерство
От основ до продвинутого — программы для практиков Codeby.
Перейти к курсу →
Комментарии
0