Стеганография

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

Давайте предположим, что вы шпион и (как у любого уважающего себя шпиона) у вас на жестком диске имеется много секретной информации. Вам нужно её спрятать так, чтоб никто её не нашел. Причем в случае если вас поймают, то ваш компьютер отдадут на обследование и тот кто будет искать эту информацию будет на 99% уверен, что такая информация на жестком диске есть.

Так какие же способы спрятать информацию есть в нашем распоряжении…


Способ 1 — Банальный


Самый простой способ — это переименовать файл. К примеру у вас есть картинка, которую надо спрятать. Вы просто переименовываете расширение файла и картинка больше не определяется системой как картинка. Но, понятное дело, что это защита от дурака. Если вы, к примеру, переименуете файл JPG в RAR, то такой RAR архив нельзя будет открыть, WinRar поругается на то, что этот архив битый, что вызовет подозрение и более глубокое изучение данного файла.

Способ 2 — Банальный, продвинутый


Ещё один простой способ, но всё же более продвинутый — это склеивание двух разных файлов в один. Простейший пример: добавление RAR архива в конец JPEG изображения. Такое изображение будет без проблем открываться в любой программе для просмотра/редактирования картинок, а также будет открываться и в программе WinRar. Дело в том, что почти все программы для работы с архивами рассчитаны на то, что архив начинается не с начала файла, так как возможно, что архив заключен в самораспаковывающуюся оболочку. Но недостатки данного способа в том, что такое склеивание можно легко заметить. К примеру если картинка имеет размер 200х200 и при этом весит 2 мегабайта, то тут же возникают подозрения. К тому же все форматы (контейнеры) обычно имеют четкую структуру и если вдруг в файле имеется какая то избыточная информация, то это легко обнаружить.

Поэтому нам нужен способ скрытия информации, который не нарушает структуру файла выбранного формата.

Способ 3 — LSB


Как уже писалось ранее, данный способ очень прост в реализации, при этом он не нарушает правила контейнера и файл не хранит избыточную информацию. Но данный способ имеет и не мало минусов. Во-первых он применим лишь к малому количеству контейнеров. К примеру его нельзя применить к формату JPG, MP3 или AVI. А ведь как правило файлы именно этих форматов хранятся сотнями на наших компьютерах и именно там удобнее всего прятать информацию. Лично я сразу заподозрил бы не ладное, найдя на компьютере большую библиотеку картинок в формате BMP. Также этот способ выдает себя с потрохами на изображениях с однородной поверхностью. А попробуйте применить данный метод к MP3 файлу. Изменение всего одного бита раз в 2 и даже более байтов, приведет к неминуемой порче аудио данных.

Для желающих поиграться с этим способом могу предложить плагин для Total Commander'a который позволяет прятать данные в некоторых контейнерах картинок, а также в WAV (при условии, что аудио данные закодированы кодеком PCM).

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

Способ 4 — Мета данные


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

MP3

Только недавно на хабре появился пост Прячем текст в MP3 где описывается реализация на PHP хранении своей информации в тэге ID3v1. Но дело в том, что тэг ID3v1 имеет очень жесткие ограничения и много информации там не сохранить. К тому же в любом нормальном медиа-проигрывателе все ваши данные видны как на ладони. Совсем другое дело тэг ID3v2.4 который позволяет хранить данные гораздо больших размеров, а также позволяет сохранять какие либо не стандартные данные. К примеру некоторые программы хранят там настройки громкости и нормализации для каждого отдельного файла. Медиа-плееры обычно не отображают не известные им параметры.
Раз уж мы говорим об MP3, то стоит упомянуть и про малоизвестный тэг Lyrics3, который был создан для хранения в файле текста песен, а также как расширение тэга ID3v1 (к примеру позволял сохранять более длинное название песни), но выход стандарта тэга ID3v2 так и не дал тэгу Lyrics3 получить широкое распространение. Но как не странно, большое количество MP3 файлов которые сейчас можно найти на просторах интернета, содержат в себе этот тэг (хотя кроме название песни там больше ничего не хранится).

JPEG

У JPEG формата есть поддержка EXIF тэга. Данные в этом тэге хранятся парами ключ=значение. В теории нет никаких проблем добавить туда какой то не стандартный ключ содержащий ваши зашифрованные данные. Программа работающая с этим тэгом, наткнувшись на этот ключ, скорей всего просто проигнорирует его и не отобразит.

AVI

Не многим известно, что файлы формата AVI также имеют поддержку мета-данных, причем хранить там можно много всего. Как и в MP3 и JPEG можно создать какой то свой ключ, который будет просто проигнорирован программами работающими с мета-данными. Могу порекомендовать хорошую программу для просмотра мета-данных AVI файлов: abcAvi Tag Editor

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

Способ 5


Ну и напоследок хочу рассказать про один замечательный способ хранения секретных данных в MP3 файлах. Реализован он в программе MP3Stego. К сожалению автор данной программы не обновлял проект с 2006 года. Идея заключается в том, что данные сначала шифруются, а затем в сердце процесса кодирования MP3 файла (из WAV) подмешиваются в конечный результат. В итоге получается обычный MP3 файл, без заметных для слуха искажений, однако хранящий в себе закодированные данные.
Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 38

    +10
    Было бы неплохо, если бы автор к теоретическому описанию давно известных способов добавил практические реализации, софтварные решения (>3) и прочие кошерные вещи.
      +2
      В принципе, идея поста была просто ознакомить читателя с возможными вариантами.
      Кстати, скажите, реализацию какого из пунктов вам хотелось бы видеть? Возможно позже распишу примеры реализации интересующих народ способов стеганографии.
        0
        В идеале — по всем бы привести пример. Тем паче, что первые два решаются скриптами в шелле.
      +1
        +3
        >> А попробуйте применить данный метод к MP3 файлу. Изменение всего одного бита раз в 2 и даже более байтов, приведет к неминуемой порче аудио данных.
        Если тупо брать любой байт и менять младшие биты — логично, что все испортится. А если покопаться в формате и менять с умом, то lsb и в случае с mp3 прекрасно работает. И приведенная Вами в пример mp3Stego это подтверждает. А вообще как-то всё очень поверхностно расписано. И как минимум еще одна задача стеганографии — незаметная передача информации (помимо хранения).
          –1
          Возможно вы правы в том плане, что требуется более глубокое изучение формата… только вот мне кажется тогда это уже будет не совсем LSB. Могу только сказать, что в своё время писал эксперементальную программу, где байты менялись очень аккуратно, игнорируя заголовки и CRC, но всё это привело к порче аудио данных.
            +2
            >> это уже будет не совсем LSB
            Уже не совсем это как «чуть-чуть беременна». Если меняются младшие малозначащие биты — это и есть LSB, и неважно, что для их замены надо сначала разобрать Хаффмана или ДКП.
            • UFO just landed and posted this here
            +1
            Ещё можно хранить текст в Gif файлах. Делается это так:
            1. Пишем в графическом редакторе текст каким-нибудь цветом (например, красный).
            2. В таблице цветов Gif файла меняем красный цвет на цвет фона этого текста.
            3. Сохраняем полученную картинку.
            В итоге получаем Gif картинку без видимого текста, который можно прочитать только изменив определенный цвет в таблице цветов на любой другой :)
              +1
              Хм, интересная и очень простая идея. В принципе применима не только к GIF, но к любым изображением с индексированной таблицей цветов.
              0
              Для WAV, AVI, EXE (и многих подобных chunked-форматов) есть гораздо более секретный способ: хранить свои данные между чанками. Там во всех заголовках указаны смещения к полезным данным. Данные можно отодвинуть, а после заголовка положить что надо.
                +1
                Наличие такие данных между описанными в формате файла кадрами очень легко проверить, что существенно увеличивает вероятность обнаружения вложения. Любые методы, основанные на измененном размере контейнера, как правило не являются стойкими к обнаружению. Именно поэтому LSB хорош — размер файлов не меняется.
                +7
                Все это конечно хорошо, но стеганография подразумевает, что доказать наличие скрытого контента должно быть невозможно, если нет соответствующего ключа. Все остальное — детские игрушки.

                Но за статью спасибо, причитал с интересом!
                  +3
                  Это не совсем точное определение. Стеганография это лишь скрытие самого факта существования секретных данных. В любом случае криптографию никто не отменял. Хорошей практикой считается сначала данные сжимать, потом шифровать, а уж затем прятать.
                    0
                    Стеганография (по крайней мере компьютерная) от криптографии отличается в конечной (не всегда достижимой) цели:
                    В криптографии — невозможность расшифровать сообщение без ключа,
                    в стеганографии — невозможность обнаружить скрытый контент без ключа.

                    В обоих случаях важен ключ, а не алгоритм. Если для некоторого алгоритма стеганографии существует способ обнаружения скрытого контента, не имея ключа, то такой способ в серьезных условиях использовать бессмысленно. Точно так же многие алгоритмы шифрования (в криптографии), например, простой xor с паролем, бессмысленно использовать сегодня, т.к. он не выдержит даже простых атак.

                    Но с другой стороны, вы правы — стеганография в широком смысле подразумевает любые способы прятать информацию. На сколько они надежны — это уже другой вопрос
                  0
                  Насчет MP3 файлов: где-то год назад сделал программку для записи данных в заголовки блоков на которые делятся такие файлы. Там есть неиспользуемые зарезервированные биты, правда объем записанной информации получается совсем маленький…
                    0
                    Я бы мог описать хороший алгоритм внедрения в mp3 с использованием lsb данных (не служебной информации), но не позволяет размер комментариев. А для полноценной статьи не позволяет карма =)
                    0
                    >>переименуете файл JPG в RAR, то такой RAR архив нельзя будет открыть, WinRar поругается на то, что этот архив битый
                    Зачем переименовывать в то, что можно открыть? Переименовывать нужно в какой-нибудь системный файл, с правдоподобным именем и запихивать в нутро ОС, куда-нибудь в самые потроха.
                      0
                      Вроде, можно юзать PNG: низвестные программе блоки должны просто игнорироваться. А пересобрать PNG-файл с добавкой пары своих блоков не так и сложно.
                        +1
                        Спрятать еще можно в *.mkv, вроде больше подходит, нежели *.avi :)
                          0
                          В ctf'ах такие задания очень популярны, и порой придумывают такое, что… В общем, способов гораздо больше :)
                            +1
                            В тему — http://lifehacker.com/#!5771142/embed-a-truecrypt-volume-in-a-playable-video-file
                            Вкратце, запихиваем том TrueCrypt в абсолютно рабочий mp4 файле. Учитывая размеры BDRemux'ов и невозможность определить реальный бит-рейт просто посмотрев фильм на небольшом экране, этот способ весьма неплох.
                              0
                              а скрытый раздел в томе turecrypt не достаточно?
                              0
                              писал диплом наподобие 5 го способа.
                              только внедрял wav (цифровая подпись) в wav.
                              если не ошибаюсь автор stereoMP3 аналогичный метод использовал (метод эхо-эффекта) могу конечно ошибаться но такого результата помоему только этим методом добиться можно. давненько писал то :).
                                0
                                Я когда в своё время баловал со всякими взломами форумов и прочими мелкими пакостями, дампы с паролями прятал при помощи стеганографии в порно картинках =) Т.е. как и у любого подростка у меня были глубоко в файловой системе в скрытой папке куча порно картинок, ни кто бы не догадался что в них скрываются дампы информации по пользователям.
                                Программа для действий называлась Steganos Security Suite, если кому интересно.
                                  0
                                  А ещё можно использовать ntfs-потоки ☺
                                    0
                                    Чуть ниже я объяснил почему не написал про ntfs потоки
                                    0
                                    К примеру у вас есть картинка, которую надо спрятать. Вы просто переименовываете расширение файла и картинка больше не определяется системой как картинка.


                                    Не совсем так. Многие программы в linux-системах для определения типа файла используют magic bytes вместо расширения. Например, mplayer.
                                      0
                                      > картинка больше не определяется системой как картинка.
                                      Смотря какой системой…

                                      Честно говоря, ожидал от статьи куда большего, а тут даже альтернативные потоки ntfs (как выше уже напомнил Philosoft) не упомянуты.
                                      К примеру какое-нибудь зло в духе «хранение информации особой уличной фрагментацией файлов на винчестере» (не особо претендует на реальность) :)

                                        0
                                        Про ntfs потоки, я специально ничего не писал, так как считаю это плохим способом скрытия информации. Вопервых эти потоки не такие уж и скрытые, а вовторых они являются лишь особенностью файловой системы NTFS и стоит файл скопировать, к примеру, на флешку с FAT, как вся информация теряется.
                                        0
                                        Для видео есть замечательный плагин для VirtualDub — StegoVideo.
                                        Вобщем-то все способы кроме последнего к заголовку топика не имеют отношения.
                                        • UFO just landed and posted this here
                                            0
                                            К примеру его нельзя применить к формату JPG, MP3 или AVI
                                            Что? EXIF секцию жпега можно растянуть до бесконечности, от mp3 файла можно оставить только заголовок (id3 + 4 байта заголовок mp3) — все остальное заполнить тем же RAR архивом, или вообще записать информацию в ID3-тэг. В AVI можно сделать нерабочую звуковую дорожку.
                                            На сколько хватит воображения — к стольким форматам можно дописать дополнительную информацию.
                                            Есть очень мало форматов, в которые совсем ничего нельзя дописать так, что оно будет правильно восприниматься.
                                              0
                                              Не дочитал
                                            • UFO just landed and posted this here
                                                0
                                                Данный проект имеет открытый код, можно свободно скачать исходники и доработать их.
                                                • UFO just landed and posted this here
                                                0
                                                Вообще правильно «не складывать яйца в одну корзину», и секретное хранить не в одном файле а распределенно по N-му количеству файлов. Тогда например коллекция mp3 может тихо в себя вмещать несколько мегабайт скрытой информации в id3 тэгах. Главное при этом знать правило по которому эта информация может быть из этой коллекции получена. Например:

                                                id3 тэг имеет base64 сжатый блок байт, первые 4 байта — номер этого блока в одном большом блоке данных. Вычленив все интересующие нас тэги и расставив их в правильном порядке получим скрытую информацию.

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

                                                таким образом в многогигабатной коллекции медиабарахла можно абсолютно незаметно спрятать несколько сот мегабайт секретов.

                                                Only users with full accounts can post comments. Log in, please.