Стеганография — это искусство и наука передавать сокрытые данные внутри других, не сокрытых данных.
Подробнее можно прочитать здесь.
Часто, когда говорят о стеганографии, не выходят за рамки 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».
Проанализировав этот чанк, мы заметили, что можем с помощью набора шестнадцатеричных значений изменять время создания и редактирования, при этом оставив саму аудиодорожку целой.
Можно было бы выбрать и другие чанки. Также можно совместить с “классической” стеганографией в аудио файлах, путём небольшого их изменения. См. работы о принципе LSB.
Так как требуется передать всего 4 байта, изменение аудио будет незначительным.
Для более глубокого изучения чанков файла .m4a оставим ссылку, где мы подробно описали все чанки.
Алгоритм работы
Первым делом нужно вкраплять сообщение в стегоконтейнер.
Шаг 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
Риски и недостатки
У нашего проекта та же есть свои риски в использовании:
-
Использование сторонних сервисов. Любой из перечисленных выше сервисов, которые мы используем, может отключиться или просто перестать работать. В это время не будет и работать наше решение. Это можно решить, вкрапляя информацию сразу в несколько сервисов и\или разработав свои сервисы для ссылочной стеганографии.
-
Случайное изменение даты в метаданных файла. Простым примером является команда touch. Touch — Команда Unix, предназначенная для установки времени последнего изменения файла или доступа в текущее время. Это может сильно повредить ссылку или просто её изменить из-за чего прочитать спрятанное сообщение уже будет невозможно никому. Это можно решить, вкрапляя информацию в несколько мест метаданных.
Как можно обнаружить стегоконтейнер в файле?
Важно понимать, что обнаружение стегоконтейнеров в мультимедийных файлах, особенно с использованием словарей и временных меток, является сложной задачей, требующей специализированных алгоритмов и глубокого анализа, необходимых инструментов. Реализация точного и надежного алгоритма может потребовать дополнительных исследований и опыта в области стеганографии.
Мы думаем, что количество музыкальных файлов довольно велико. Так же, современные нейронные сети могут генерировать файлы (Имя им легион: https://www.riffusion.com/, https://mubert.com/render, … и многое другое ), по этой причине не видим особых способов обнаружить стеганографию. Возможно мы не правы, будем рады услышать критику в комментариях.
Исходники
У нас не было задачи сделать полноценное решение, всё реализовано ради исследовательских целей. Готовы к жёсткой, но конструктивной критике.
Работа была выполнена на пару с @nurovAm . Благодарим @PavelMSTU за консультации и помощь.