Привет, Хабр!
В прошлый раз мы написали свой стегоанализатор и научились находить следы простого LSB-внедрения. На первый взгляд может показаться, что задача решена: есть алгоритм, есть анализатор, запускаем проверку и получаем ответ. Но в реальности всё гораздо сложнее. Стегоанализ — это не спринт, а бесконечная гонка вооружений, в которой тот, кто прячет, почти всегда на шаг впереди.

Сегодня мы поговорим о фундаментальных сложностях стегоанализа. О тех причинах, по которым обнаружение скрытых данных превращается из тривиальной проверки в сложную, почти криминалистическую дисциплину. Давайте разберёмся, почему защищающийся (аналитик) находится в заведомо проигрышном положении по сравнению с атакующим (стеганографом).
Сложность №1: Асимметрия усилий
Представьте себе крепость со ста воротами. Атакующему, чтобы проникнуть внутрь, достаточно найти одни-единственные незапертые ворота. Защитнику же, чтобы обеспечить безопасность, нужно постоянно проверять и держать на замке все сто.
В стеганографии этот принцип работает в полной мере.
Стеганограф (атакующий) может использовать любой из сотен существующих алгоритмов или даже написать свой собственный, слегка изменив уже известный. Ему нужна всего одна успешная попытка, чтобы его метод остался незамеченным.
Стегоаналитик (защитник), напротив, должен уметь противостоять всем известным техникам. Его инструментарий должен включать детекторы для LSB, для атак на JPEG, для контейнерных методов и так далее. Если он не проверит хотя бы один из векторов, он рискует пропустить скрытое сообщение.
Эта асимметрия — ключевая проблема. Аналитик всегда находится в роли догоняющего.
Сложность №2: Бесконечное разнообразие контейнеров
Времена, когда стеганография была связана исключительно с LSB в картинках, давно прошли. Сегодня скрытые данные могут поджидать нас в самых неожиданных местах.
Изображения: Классический LSB в форматах без потерь (
.png
,.bmp
).Офисные документы: Современные
.docx
или.odt
по своей сути являются ZIP-архивами. Данные можно спрятать внутри этой структуры как "файл-призрак", невидимый для Word или LibreOffice.PDF-документы: Один из самых коварных контейнеров. Вместо того чтобы прятать данные в сложных структурах, их можно просто "написать" на странице, сделав текст невидимым. Например, задав ему тот же цвет, что и у фона, или установив микроскопический размер шрифта. Такой текст будет проиндексирован и скопирован, но абсолютно незаметен при чтении. Для аналитика это проблема: данные являются частью обычного текстового слоя, и найти их можно, только целенаправленно ища аномалии в атрибутах текста.
Вот как просто это может быть реализовано на Python с помощью библиотеки PyMuPDF
. Этот код добавляет секретное сообщение на страницу, делая его полностью невидимым для глаза.
import fitz # PyMuPDF
def hide_text_in_pdf(input_pdf: str, output_pdf: str, secret_text: str):
"""
Вставляет секретный текст на первую страницу PDF, делая его невидимым.
"""
try:
# Открываем исходный документ
doc = fitz.open(input_pdf)
if not doc.page_count:
print("Ошибка: В PDF нет страниц.")
return
page = doc[0]
# Задаем точку для вставки текста (например, в углу)
insertion_point = fitz.Point(10, 10)
# КЛЮЧЕВОЙ МОМЕНТ:
# render_mode=3 делает текст невидимым (он не закрашивается и не обводится).
# Это более хитрый способ, чем просто делать его белым.
# fontsize=1 делает его еще и физически крошечным.
page.insert_text(
insertion_point,
secret_text,
fontsize=1,
render_mode=3 # 0: fill, 1: stroke, 2: fill & stroke, 3: invisible
)
# Сохраняем результат
doc.save(output_pdf)
doc.close()
print(f"Текст успешно спрятан в файле: {output_pdf}")
except Exception as e:
print(f"Произошла ошибка: {e}")
# Пример использования:
# hide_text_in_pdf("original.pdf", "stego.pdf", "This is a top secret message.")
Любые другие файлы: Наконец, никто не мешает просто дописать байты скрытого сообщения в конец любого файла, будь то видео, аудио или исполняемый файл.
Сложность №3: Шифрование — стена для аналитика
Это, пожалуй, самая главная трудность. Допустим, наш статистический тест «Хи‑квадрат» показал p‑value 0.99
. Мы с огромной уверенностью можем сказать: «Здесь аномалия!». И что дальше?
Если скрытые данные были предварительно зашифрованы (а так поступают почти всегда), то при извлечении мы получим лишь псевдослучайный набор байт. Мы не можем прочитать сообщение и не можем доказать, что это именно сообщение, а не просто шум или артефакт.
Представьте, что криминалист находит в доме подозреваемого сейф. Он может доказать, что сейф не пустой. Но пока у него нет ключа, он не может утверждать, что внутри лежат краденые бриллианты. Для многих практических задач простого обнаружения аномалии недостаточно.
Сложность №4: Адаптивные алгоритмы-хамелеоны
Простые LSB-алгоритмы оставляют грубые статистические «шрамы». Продвинутые стеганографические методы гораздо умнее. Их называют адаптивными.
Их суть в том, что они не вносят изменения слепо. Перед внедрением они анализируют сам контейнер, находят наиболее «шумные», текстурные участки изображения и вносят изменения преимущественно туда, где они будут наименее заметны для статистики. Обнаружить такого «хамелеона» с помощью простых статистических тестов практически невозможно.
Заключение
Как мы видим, стегоанализ — это не нажатие кнопки «Проверить». Это сложная, многогранная дисциплина, где аналитик всегда находится в менее выгодном положении. Асимметрия усилий, разнообразие контейнеров, шифрование и умные адаптивные алгоритмы делают «охоту на невидимку» невероятно трудной и интересной задачей. Это вечная гонка вооружений, и именно это делает эту область такой захватывающей для исследования.
Следите за нашими экспериментами и обновлениями проекта на нашем официальном сайте и Telegram-канале!
А что вы думаете о сложностях стегоанализа? С какими неочевидными методами сокрытия сталкивались вы? Ждем ваших историй и вопросов в комментариях.