Стеганография - это искусство и наука передавать сокрытые данные внутри других, не сокрытых данных.

Подробнее можно прочитать здесь.

Часто, когда говорят о стеганографии, не выходят за рамки LSB в картинках (хотя и в картинках можно сделать нечто более оригинальное ). 

В данном посте мы хотим рассказать о ссылочной стеганографии (принцип ссылочной стеганографии можно почитать тут) в формате .m4a(.mp4).

Общий принцип

Для начала на “пальцах” распишем, как это в целом работает. Любой файл можно зашифровать и представить в base64 текстовом виде. Далее его можно отправить на сервис одноразовых сообщений (например https://onetimesercet.com/ )

Отправив сообщение мы получаем ссылку вида https://onetimesecret.com/secret/jqr1s0o5bvlts8cyice71fvwv0o0ltx 

Затем мы отправляем саму ссылку на сервис сокращения ссылок, и получаем сокращённую ссылку; например для goo.su: https://goo.su/SAsb.

Как видим у нас всего 4 байта, если мы заранее знаем какой сервис используем (в реальной стеганографии разумнее использовать свой сервис), если мы заранее имеем ключ расшифрования (обмен ключей – отдельная задача), то нам достаточно переслать всего 4 байта для передачи искомого файла. 

Это и есть принцип ссылочной стеганографии – мы передаем ссылку на сообщение, а не само сообщение.

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

Жизненный цикл

Подробный алгоритм стеганографии

m4a или mp4

Правильно говорить m4a, так как под mp4 скрывается множество других форматов (M4A, M4V, M4R, M4B и другие). Далее мы будем писать m4a

Разбор метаданных 

Метаданные — это набор следующих стандартизированных сведений о файле:  

  • имя автора, 

  • разрешение,  

  • цветовое пространство,  

  • авторские права,  

  • ключевые слова  

  • и т.д.  

Метаданные в M4A является сложной структурой, содержащей множество контейнеров и чанков (chunks). 

Количество структур в метаданных M4A может изменятся. Основные из них на схеме, представленной выше. 

Мы остановилась на чанке «moov»

Структура чанка moov в m4a

Проанализировав этот чанк, мы заметили, что можем с помощью набора шестнадцатеричных значений изменять время создания и редактирования, при этом оставив саму аудиодорожку целой.

Можно было бы выбрать и другие чанки. Также можно совместить с “классической” стеганографией в аудио файлах, путём небольшого их изменения. См. работы о принципе LSB.

Так как требуется передать всего 4 байта, изменение аудио будет незначительным.

 Для более глубокого изучения чанков файла .m4a оставим ссылку, где мы подробно описали все чанки. 

Алгоритм работы

GIF-визуализация принципов работы стеганографии. Красным жирным текстом – измененная информация в полях creation_time и modification_time. 

Первым делом нужно вкраплять сообщение в стегоконтейнер.

Шаг 1. Написать сообщение

Для того чтобы написать сообщение, мы использовали сервисы одноразовых записок (onetimesecret.com или safenote.co)

Шаг 2. Укоротить ссылку

Вся ссылка одноразового сообщения не поместится в стегоконтейнер, поэтому мы воспользовались сторонним сервисом goo.su по укорачиванию ссылок, при использовании которого мы получаем 4-7 символов после последнего слэша (https://goo.su/SAsb данными символами в этом примере будут “SAsb”).

Шаг 3. Вставить символы

Символы из данного примера мы разбиваем на список [S, A, s, b] и при помощи специальных словарей переводим в дни, часы, минуты и секунды. Затем мы их вставляем в специальные подчанки: mvhd-create-date, mvhd-modify-date, tkhd-create-date и tkhd-modify-date.

Сообщение спрятано

Извлечение стегосообщения

Извлечение стегосообщения

Шаг  1. Извлечь символы

Через обратные словари мы извлекаем символы которые записали во временные подчанки.

Шаг 2. Перейти по ссылке

Извлеченные символы мы вставляем в ссылку goo.su/  после слэша и переходим по ней.

Сообщение прочитано 

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

Исходники вкрапления и извлечения можно загрузить по ссылке: https://github.com/kib-sources/stego-mp4-link 

Риски и недостатки

У нашего проекта та же есть свои риски в использовании:

  1. Использование сторонних сервисов. Любой из перечисленных выше сервисов, которые мы используем, может отключиться или просто перестать работать. В это время не будет и работать наше решение. Это можно решить, вкрапляя информацию сразу в несколько сервисов и\или разработав свои сервисы для ссылочной стеганографии.

  2. Случайное изменение даты в метаданных файла. Простым примером является команда touch. Touch - Команда Unix, предназначенная для установки времени последнего изменения файла или доступа в текущее время. Это может сильно повредить ссылку или просто её изменить из-за чего прочитать спрятанное сообщение уже будет невозможно никому.  Это можно решить, вкрапляя информацию в несколько мест метаданных.

Как можно обнаружить стегоконтейнер в файле?

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

Мы думаем, что количество музыкальных файлов довольно велико. Так же, современные нейронные сети могут генерировать файлы (Имя им легион: https://www.riffusion.com/, https://mubert.com/render, … и многое другое ), по этой причине не видим особых способов обнаружить стеганографию. Возможно мы не правы, будем рады услышать критику в комментариях.

Исходники

  1. Описание всех чанков

  1. Ссылка на алгоритм кода написанного нами

  1. Ссылка на репозиторий с исходным кодом

У нас не было задачи сделать полноценное решение, всё реализовано ради исследовательских целей. Готовы к жёсткой, но конструктивной критике.

Работа была выполнена на пару с @nurovAm . Благодарим @PavelMSTU за консультации и помощь.