Привет, Хабр!

В прошлый раз мы написали свой стегоанализатор и научились находить следы простого 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-канале!

А что вы думаете о сложностях стегоанализа? С какими неочевидными методами сокрытия сталкивались вы? Ждем ваших историй и вопросов в комментариях.

Комментарии (0)


  1. Dobr
    22.09.2025 07:06

    А насколько это законно? Ну то есть если т-щ Майор тем или иным образом найдет программу для скрытия данных, будут ли последствия? Разумеется метод ТРКА в расчет не берем – он точно будет при обнаружении данного ПО.


    1. Lomakn Автор
      22.09.2025 07:06

      Спасибо за интересный вопрос. Хотим дать развернутый ответ на ваш важный вопрос о философии и целях проекта.

      ChameleonLab — это в первую очередь образовательный и исследовательский инструмент.

      Наша главная миссия — не создание утилиты для сокрытия данных, а построение "лаборатории" для их поиска и анализа. Мы убеждены, что лучший способ понять уязвимости и научиться защищаться от цифровых угроз — это досконально изучить методы, которые могут быть использованы для их создания.

      В рамках этих исследований мы видим, что у технологии огромный потенциал. Например, мы считаем, что стеганография в будущем может стать надежной и более емкой альтернативой QR-кодам, особенно в таких сферах, как медицина, где нужно безопасно привязать большой объем данных (например, историю болезни) к одному изображению (фотографии пациента). Это действительно уникальный подход к хранению и передаче информации.


      1. Dobr
        22.09.2025 07:06

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


    1. Shaman_RSHU
      22.09.2025 07:06

      Если по закону, то при условии отнесения всего этого к криптографии привлекут, т.к. ФСБ у нас регулятор в этой области. С точки зрения математики сложно отнести к криптографии (но ведь если будет цель, то не будет здравого смысла).


  1. petropavel
    22.09.2025 07:06

    PDF-документы: Один из самых коварных контейнеров. Вместо того чтобы прятать данные в сложных структурах, их можно просто "написать" на странице, сделав текст невидимым. ... Такой текст будет проиндексирован и скопирован, но абсолютно незаметен при чтении. Для аналитика это проблема: данные являются частью обычного текстового слоя, и найти их можно, только целенаправленно ища аномалии в атрибутах текста.

    Блииин. То есть самый коварный контейнер и проблема для аналитика — это текст, который индексируют поисковики и копирует Ctrl-C ? Аналитик не знаком с pdftotext?


    1. Lomakn Автор
      22.09.2025 07:06

      Спасибо за комментарий. Безусловно, pdftotext извлекает текстовые потоки. Но суть проблемы в том, что он игнорирует метаданные рендеринга.

      Скрытый текст — это не отдельный слой, а те же текстовые объекты, но с атрибутами, делающими их невидимыми (например, режим render mode 3, цвет фона или размещение за пределами видимой области). Простой парсер смешает их в общую массу, теряя критически важный контекст. Для чистоты анализа необходимо парсить не только контент, но и состояние графики, чтобы отсеять такие аномалии.