Information Security
Cryptography
Python
Development for Linux
January 2018 26

Стеганография в файловой системе

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


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


Я сделал проект по скрытому хранению информации в файловой системе (далее ФС).
Это можно применить для кражи конфиденциальной информации в образовательных целях.


Image


В виде опытного образца была выбрана весьма старенькая линуксовая ФС ext2.



Реализация


Соображения о реализации


Если хорошо "раздраконить" стандарт ext2, то можно заменить, что в ФС существует так называемый Superblocks, в котором дана основная информация о системе. После мной были найдены Block Bitmap и Inode Table. Почти сразу родилась идея записи информации в пустые на данный момент блоки ФС. Теперь стоило продумать защиту от программиста, вооруженного hex-редактором.


Если хранить скрываемую информацию без шифрования, то, даже несмотря на ее размытость по ФС, она будет все равно слишком бросаться в глаза, особенно если программист будет знать, что следует искать. Поэтому было принято решение шифровать все блоки исходного файла. Я выбрал блочный шифр AES, но как вы понимаете, это не принципиально.


Для отделения нужных блоков от всех остальных при чтении в каждый блок было решено добавить по специальному маркеру в начало блока. Этот маркер шифровался в зависимости от номера блока в исходном файле. Такая уловка сразу позволила не только находить нужные блоки, но и узнавать их правильный порядок.


Общий принцип работы системы.


image


Алгоритм записи


По пунктам:


  • Сначала записать в исходную файловую систему какую-либо информацию;
  • Удалить эту информацию (не обязательно всю);
  • Файл для сокрытия разбить на блоки одинаковой длины, добавив маркер;
  • Зашифровать эти блоки;
  • Поместить зашифрованные блоки в пустые блоки ФС.

Для любителей блок-схем

Ниже представлена блок-схема алгоритма записи. На вход алгоритм получает четыре файла:
-Образ изменяемой файловой системы;
-Файл, подлежащий стеганографии;
-Файл с ключом шифрования для AES;
-Файл с маркером.
image


Сразу стоит отметить, что у данного алгоритма есть один недостаток: после записи файла в ФС, нельзя записывать в ФС что-либо новое, так как любая новая информация может попасть в те блоки, которые мы отвели нашему застеганографированному файлу, правда это же открывает возможность «быстрого заметания следов».


Но достаточно очевидно как это можно исправить: необходимо перезаписать алгоритм записи блоков в ФС. Это понятная, но невероятно трудоёмкая задача.
Для Proof Of Consept я это не реализовывал.


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


Алгоритм чтения


По пунктам:


  • Со знанием ключа и способа построения маркеров составить первые N маркеров, с гарантией что N, умноженное на длину блока файловой системы больше длины застеганографированного файла;
  • Произвести поиск блоков в ФС, начинающихся с маркеров;
  • Расшифровать полученные блоки и отделить маркеры;
  • Собрать полученные блоки в правильном порядке и получить исходный файл.

Для любителей блок-схем

Ниже представлена блок-схема алгоритма записи. На вход алгоритм получает три файла:
-Образ файловой системы;
-Файл с ключом шифрования для AES;
-Файл с маркером.
image


После работы программы появляется файл Read, который и будет извлеченным из стеганографированной ФС файлом, если ключ или маркер были указаны неверно, то файл Read будет пуст.
(для любителей красивостей можно вкраплять не только файл, но "шапку", содержащую метаинформацию: имя файла, права, время последнего изменения и т.д.)


Автоматизация запуска


Для удобства были написаны bash скрипты, автоматизирующие запуск на Linux (тестировалось на Ubuntu 16.04.3 LTS).
Разберем запуск по шагам.
Запись:


  1. sudo Copy_Flash.sh “DEVICE” — получаем образ ФС из DEVICE(флэш);
  2. ./Write.sh “FILE” “KEY” “MARKER” – создаем виртуальное окружение, скачиваем необходимые библиотеки и запускаем скипт на запись;
  3. sudo ./Write_Flash.sh “DEVICE” – записываем измененную ФС снова на DEVICE.

Чтение:


  1. sudo Copy_Flash.sh “DEVICE” — получаем образ ФС из DEVICE(флэш);
  2. ./Read.sh “KEY” ‘MARKER” — создаем виртуальное окружение, скачиваем необходимые библиотеки и запускаем скипт на чтение;
  3. В текущем каталоге открываем файл Read – это и есть застеганографированная информация.

Заключение


Данный метод стеганографии, вероятно, нуждается в доработке, дополнительном тестировании и расширении на более популярные файловые системы, такие как Fat32, NTFS и ext4.
Но целью данной работы было показать принцип, с помощью которого можно осуществить скрытое хранение информации в файловой системе.
С помощью подобных алгоритмов можно безбоязненно хранить информацию, и если при знании ключа такую систему взломать возможно не полным перебором (но весьма долгим алгоритмом), то без знания ключа данная система мне представляется абсолютно стойкой, впрочем это может послужить поводом для отдельной статьи.


Весь код реализован на языке Python версии 3.5.2. Пример работы представлен на моем youtube канале. Полный код проекта выложен на github.
(Да-да, я знаю, что для production версии нужно писать на чём-нибудь "быстром", например на Си ;) )
В данной реализации размер входного файла для стеганографии не должен превышать 1000 кБ.


Хочу выразить благодарность пользователю PavelMSTU за ценные советы при планировании исследования и рекомендации по оформлению статьи.

+15
8.2k 68
Comments 24
Top of the day