Статья Стеганография в изображениях: техники LSB, DCT и palette-манипуляций — от атаки до детекта

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


В деле United States v. Xiaoqing Zheng (индиктмент 2018, расширенное обвинение 2019) сотрудник General Electric, согласно материалам DOJ, прятал конфиденциальные файлы с турбинными расчётами внутри обычной картинки. Не экзотика из учебника - рабочий кейс, который показывает, почему стеганография в изображениях до сих пор остаётся слепой зоной большинства защитных систем. Скрытые данные внутри графического файла не ловятся стандартной контентной фильтрацией. Вообще.

Место стеганографии в цепочке атаки​

Стеганография - не самостоятельная атака, а техника маскировки. Она встраивается в разные этапы kill chain, и по классификации MITRE ATT&CK фигурирует сразу в нескольких тактиках.

Command and Control - Steganography (T1001.002). Атакующий публикует картинку на легитимной площадке - имиджборд, CDN, облачное хранилище. Малварь на заражённом хосте скачивает её, вытаскивает команды C2 из младших битов или DCT-коэффициентов, выполняет инструкцию. Для сетевого мониторинга - обычный GET-запрос к легитимному ресурсу, ничего подозрительного. T1001.002 описывает именно скрытый C2-канал (получение команд), а не выгрузку данных - для эксфильтрации через веб-сервисы применяется T1567 (Exfiltration Over Web Service).

Defense Evasion - Steganography (T1027.003). Вредоносный пейлоад - шеллкод, конфигурация загрузчика, ключи шифрования - зашивается в изображение и доставляется жертве. AV-движки не сканируют пиксельные данные на наличие shellcode; при открытии файла обычным просмотрщиком ничего не происходит, а малварь извлекает полезную нагрузку через Deobfuscate/Decode (T1140).

Exfiltration. Данные, собранные на хосте (T1005), стейджатся локально (T1074.001), маскируются стеганографией (T1027.003), упаковываются в изображение и выгружаются через веб-сервис (T1567) или альтернативный протокол (T1048). Согласно материалам DOJ, именно такой сценарий был реализован в деле Zheng/GE.

Для insider threat скрытие данных в изображениях - отдельная головная боль. Сотрудник с легитимным доступом к конфиденциальным документам отправляет «фотографию с корпоратива» через корпоративную почту, а внутри - финансовая отчётность. DLP видит JPEG с котиком весом 2 МБ. Ничего аномального.

Зачем это атакующему. Стеганография в кибератаках позволяет обойти три класса защиты одновременно: DLP (контентная фильтрация не парсит пиксели), сетевые IDS/IPS (трафик выглядит как легитимные HTTP-запросы), антивирусы (статический анализ не ищет payload внутри графических форматов). Финансовый импакт - от утечки коммерческой тайны до полной компрометации инфраструктуры через скрытый C2.

LSB-стеганография: механика и обнаружение​

1780974862326.webp

Как работает встраивание​

LSB (Least Significant Bit) - замена младших битов в значениях цветовых каналов пикселей на биты скрываемого сообщения. Каждый пиксель RGB-изображения - три байта (красный, зелёный, синий), каждый байт - 8 бит. Замена последнего бита меняет значение канала максимум на 1: 10100101 превращается в 10100100. Разница, абсолютно невидимая глазу.

Ёмкость: чтобы спрятать 1 МБ данных методом LSB (1 бит на канал, 3 бита на пиксель), нужен контейнер примерно из 2.8 млн пикселей - около 8 МБ в несжатом BMP. В PNG размер варьируется, но при заполненном LSB-канале энтропия младших битов растёт и сжимаемость падает. Увеличение размера PNG относительно чистого оригинала - уже индикатор стеганографии.

Критический момент для детектирования: LSB-стеганография работает только с форматами без потерь - PNG, BMP, TIFF. При сохранении в JPEG сжатие с потерями уничтожит младшие биты вместе со скрытым сообщением. Этот факт создаёт характерный артефакт: JPEG после LSB-внедрения и обязательной конвертации в PNG может вырасти в несколько раз (в зависимости от разрешения и содержимого) - при визуально идентичной картинке. Конвертация JPEG->PNG сама по себе увеличивает размер, но аномально большой файл - дополнительный красный флаг.

[Применимо: insider threat расследование, внутренний пентест; legacy-среды без DLP с content-aware inspection]

Детектирование LSB​

Формат-аномалия. Первый индикатор - наличие lossless-изображений там, где ожидается JPEG. Корпоративная почта, мессенджеры, веб-формы - фотографии практически всегда в JPEG. Если сотрудник отправляет PNG размером 5 МБ с фотографией рабочего стола - это повод копнуть глубже.

Статистический анализ. Chi-square тест выявляет характерное распределение значений пар (2k, 2k+1) в каналах изображения. При LSB-внедрении частоты пар выравниваются - стандартная методика стегоанализа изображений, реализованная в zsteg и специализированных фреймворках.

Визуальный побитовый анализ. Изоляция отдельных битовых плоскостей (bit plane 0, 1, 2) позволяет увидеть паттерны. В чистом изображении младший бит выглядит как случайный шум; в стегоконтейнере - как структурированный блок с чёткими границами. Для быстрой визуализации хватит пяти строк на Python:
Python:
from PIL import Image
import numpy as np

img = np.array(Image.open("suspect.png"))
# Извлечение младшего бита красного канала
lsb_plane = (img[:,:,0] & 1) * 255
Image.fromarray(lsb_plane.astype(np.uint8)).save("lsb_red.png")
Если в полученном lsb_red.png виден не равномерный шум, а структурированная область - в файле с высокой вероятностью сидит LSB-пейлоад.

Ограничения: без оригинального изображения или знания метода кодирования гарантированно подтвердить LSB-внедрение невозможно. Статистические тесты дают вероятностную оценку. А учитывая, что существует куча способов реализации LSB (разные каналы, разные bit planes, разный порядок пикселей), автоматический детект без ложных срабатываний - задача нетривиальная.

DCT-стеганография в JPEG​

1780974891893.webp

Скрытие данных в частотной области

В отличие от LSB, DCT-стеганография работает непосредственно с JPEG и не требует конвертации в lossless-формат - для атакующего это серьёзный плюс. Алгоритм JPEG разбивает изображение на блоки 8x8 пикселей и применяет дискретное косинусное преобразование, получая 64 DCT-коэффициента для каждого блока. Скрытые данные встраиваются в младшие биты квантованных DCT-коэффициентов - тех, что отвечают за мелкие детали (высокие частоты).

Техники DCT-встраивания реализованы в steghide (C++, поддерживает JPEG, BMP, WAV, AU; шифрует данные - по умолчанию Rijndael-128, также поддерживает Blowfish, Triple-DES и др.) и ряде специализированных утилит. Ёмкость ниже, чем у LSB, но для передачи C2-команд или ключей шифрования - хватает за глаза.

[Применимо: анализ C2-каналов через публичные хостинги изображений, расследование подозрительных JPEG в корпоративном трафике]

Обнаружение DCT-стеганографии​

Гистограммный анализ DCT-коэффициентов. В чистом JPEG гистограмма DCT-коэффициентов имеет характерную форму с пиками на определённых значениях. После стегоинъекции пики сглаживаются - аномалия, которую ловят специализированные инструменты стегоанализа.

Артефакты двойного сжатия. Если JPEG был открыт, модифицирован (внедрены данные в DCT) и пересохранён - появляются следы повторного кодирования. Анализ таблиц квантования и структуры DCT-блоков выявляет несоответствие между заявленным качеством и фактическим распределением коэффициентов.

Ограничения для атакующего: малая ёмкость (единицы килобайт на типичную фотографию), разрушение пейлоада при повторном сжатии (репост в мессенджерах и соцсетях перекодирует JPEG), детектируемость при наличии оригинала. Ограничения для защитника: без оригинала и при малом объёме внедрённых данных DCT-стеганография практически не детектируется стандартными средствами. Тупик с обеих сторон.

Palette-манипуляции в GIF и indexed PNG​

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

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

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

Обнаружение palette-манипуляций​

Стегоанализ палитры - относительно простая задача:
  • Проверка на неиспользуемые записи (цвета, отсутствующие в пикселях)
  • Анализ порядка палитры: стандартные графические редакторы сортируют палитру предсказуемо; нестандартная сортировка - индикатор манипуляции
  • Поиск пар близких цветов, отличающихся на 1 в одном канале - аналог LSB на уровне палитры
Ёмкость метода ограничена: 256 записей палитры дают максимум несколько сотен байт при однобитовом кодировании. На практике palette-манипуляции встречаются в CTF-задачах и отдельных APT-инструментах, но реже, чем LSB или DCT. Если вы не на CTF - вероятность столкнуться невысока, но знать про это стоит.

[Применимо: CTF-форензика, анализ GIF-файлов в трафике; legacy-среды с активным обменом GIF-анимациями]

Форензик-воркфлоу: от подозрительного файла до заключения​

📚 Часть контента скрыта. Этот материал доступен участникам сообщества с рангом One Level или выше
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме

Правило 1: аномалия формата. Алерт на отправку lossless-изображений (PNG > 1 МБ, BMP, TIFF) через корпоративную почту, если baseline пользователя - только JPEG. Требует интеграции с почтовым шлюзом, извлекающим MIME-тип вложений.

Правило 2: аномалия размера. PNG 400x600 весом 3 МБ - аномалия. Типичный вес для такого разрешения значительно меньше; порог настраивается эмпирически под конкретную инфраструктуру.

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

Правило 4: несоответствие расширения и сигнатуры. Файл с расширением .jpg содержит PNG-сигнатуру в первых байтах. Детектируется на уровне прокси или почтового шлюза.

Каждое правило по отдельности генерирует false positives. Но при корреляции друг с другом и с событиями доступа к критичным данным - формируется осмысленный сигнал. DLP-решения (Symantec DLP, Forcepoint, InfoWatch) сейчас не выполняют стегоанализ содержимого изображений. Они проверяют метаданные, имена файлов, OCR текста на картинке - но не пиксельные данные. Это фундаментальная слепая зона.

В большинстве расследований, в которых я участвовал, стегоанализ не включён в playbook по insider threat. Формально это объяснимо: вероятность использования стеганографии в среднестатистической утечке невысока. Но когда она используется - а в таргетированных атаках и промышленном шпионаже это не редкость - стандартный стек DLP + SIEM + EDR оказывается слеп. EDR (CrowdStrike Falcon, SentinelOne, Elastic 8.x+) не инспектирует содержимое PNG-файлов. DLP не запускает chi-square тест на вложения. SIEM коррелирует события, которых в случае со стеганографией просто нет - нет алертов, нет срабатываний, нет IOC.

На практике вижу два рабочих подхода. Первый - автоматизированный пресканер на почтовом шлюзе, который прогоняет исходящие изображения через zsteg и проверку формат-аномалий. Пишется на Python за день, нагрузка минимальна - анализ одного файла занимает миллисекунды. Второй - включение цифровой форензики изображений в чеклист при расследовании insider threat: если подозреваемый выгружал изображения, каждый файл проходит через семь шагов воркфлоу выше.

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

С ростом генеративных моделей (Midjourney, Stable Diffusion) объём синтетических изображений в корпоративной среде вырастет кратно. Сгенерированная картинка не имеет оригинала для сравнения - а значит, сравнительный анализ, один из самых надёжных методов стегоанализа, становится неприменимым. Кто сейчас не выстроит baseline по форматам и размерам медиафайлов - будет разбирать инциденты вслепую. Если интересно, как другие SOC-команды выстраивают детекцию covert channels в медиафайлах - на codeby.net есть тред с разбором подходов к стегоанализу в корпоративном трафике.
 
Последнее редактирование модератором:
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

Похожие темы

🚀 Первый раз на Codeby?
Гайд для новичков: что делать в первые 15 минут, ключевые разделы, правила
Начать здесь →
🔴 Свежие CVE, 0-day и инциденты
То, о чём ChatGPT ещё не знает — обсуждаем в реальном времени
Threat Intel →
💼 Вакансии и заказы в ИБ
Pentest, SOC, DevSecOps, bug bounty — работа и проекты от проверенных компаний
Карьера в ИБ →

HackerLab