Денис Колисниченко
Данная статья является переводом статьи Антона Чувакина (Anton Chuvakin). Оригинал статьи доступен по адресу: http://www.linuxsecurity.com/feature_stories/data-hiding-forensics.html. Я не стал переводить статью дословно и добавлял свои комментарии сразу по тексту, поэтому, возможно, вы найдете небольшие расхождения с оригиналом.
Всем известно, что если файл был удален из компьютера, его можно восстановить. Недавний анализ средств защиты Windows NT, проведенный Куртом Шейфредом (Kurt Seifried), показал, что файловая система NTFS позволяет скрывать файлы в "альтернативных потоках данных" (alternative datastreams), которые подсоединены к файлам. Эти потоки данных не разрушаются многими утилитами стирания информации (wipe utilities), которые обещают невозвратимое удаление информации. Стирание файла означает его надежное удаление (в отличие от обыкновенного удаления записей файла из таблицы расположения файлов - FAT) так, чтобы восстановление файла было чрезвычайно дорогим или невозможным.
В своем обзоре "Secure Deletion of Data from Magnetic and Solid-State Memory" Питер Гутманн (Peter Gutmann) показывает, что остается после удаления файла и как можно избежать восстановления информации. Для полного удаления файла автор рекомендует многократную перезапись файла специальными шаблонами, хотя здесь может помочь однократная запись файла, содержащего одни нули.
В операционной системе Linux не предусмотрены альтернативные потоки данных, но удаленные командой /bin/rm файлы все же остаются на диске. Большинство дистрибутивов Linux используют файловую систему файловую систему ext2 (или ее журналируемую версию - ext3). Если рассмотреть структуру файловую систему ext2, то сразу становиться ясно, где могут быть скрыты данные.
Давайте начнем с классического метода скрыть данные в UNIX (даже не используя ext2). Запустите процесс, который сначала открывается файл и, не закрывая, удаляет его. Содержимое файла все еще продолжает оставаться на диске и это пространство не будет запрашиваться другими программами. Обратите внимание на то, что если запустить процесс, стирающий самого себя, его содержимое может быть найдено в файловой системе /proc (в образе памяти). Команда
Сокрытие и восстановление данных в Linux.
cp /proc/$PID/exe /tmp/file
восстановит этот файл в каталоге /tmp.
Если файл был удален программой /bin/rm, его содержимое все еще остается на диске, пока оно не будет перезаписано (поверх) другими файлами. Существуют утилиты, например, e2undel, которые автоматически восстанавливают файлы. Все они основываются на Linux Ext2fs Undeletion mini-HOWTO, которое является хорошим руководством по восстановлению файлов с разделов Linux. Восстановление может также быть выполнено и вручную с помощью утилиты debugfs (как описано в вышеупомянутом руководстве).
В целом, если попытка восстановления файла была предпринята сразу после его удаления и раздел был быстро отмонтирован, шансы полностью восстановить файл очень высоки. Если файловая система интенсивно использовалась, вероятность успешного восстановления данных значительно уменьшается. Однако если мы будем смотреть на проблему с оптимистической точки зрения, возможность восстановления чего-либо (особенно чего-нибудь небольшого) - все еще очень высока. Сообщалось о восстановлении частей файлов, которые были удалены несколько лет назад.
Таким образом, файлы могут быть скрыты в свободном пространстве. Если было удалено много копий одного и того же файла, шансы восстановления вышеупомянутым методом очень высоки. Однако, из-за запутанности файловой системы ext2, процесс восстановления может быть надежен только для маленьких файлов.
Более детальный взгляд на структуру файловой системы ext2 показывает существование "слабых мест". Файловая система адресует части дискового пространства, называемые блоками. Обычно размер блока для файловой системы ext2 равен 1, 2 или 4 Кб. Если размер файла меньше, чем размер блока, оставшееся пространство потрачено впустую. Это и называется "слабым местом". Эта проблема долго мучила пользователей Windows 9x с файловой системой FAT16, которая использовала размеры блока до 32КБ, тратя впустую огромное дисковое пространство при сохранении маленьких файлов.
При использовании раздела объемом 4Гб размер блока составляет 4К (размер блока выбирается автоматически при создании файловой системы утилитой mke2fs). Таким образом, можно надежно скрывать до 4КБ данных на файл при использовании маленького файлов. Данные будут недоступными для дискового использования, невидимыми для файловой системы и не обнаруживаемыми проверочными устройствами целостности файла, использующими алгоритмы вычисления контрольной суммы файла (CRC) и MAC-времена. Ext2-дискета (с размером блока 1КБ) тоже позволяет скрывать данные, хотя и меньшие размеры.
Существующая утилита bmap позволяет записывать данные в "слабые места", использовать эти данные и затирать их, если это необходимо.
Например, эта команда записывает данные в "слабое место", созданное файлом /etc/passwd
# echo "evil data is here" | bmap --mode putslack /etc/passwd
А команда
# bmap --mode slack /etc/passwd
getting from block 887048
file size was: 9428
slack size: 2860
block size: 4096
evil data is here
показывает данные.
Для затирания (удаление информации) "слабого места" используется команда:
# bmap --mode wipeslack /etc/passwd
Сокрытие данных в "слабых местах" может использоваться для хранения секретов и скрывать информацию от проверочных устройств целостности (integrity checkers).
Теперь давайте задумаемся, что же скрывается на обширных пространствах нашего диска? Если мы ищем строки текста, команда strings /dev/hdaX | grep 'string we need' подтвердит присутствие строки на разделе (этот процеcс займет много времени). Использование шестнадцатеричного редактора иногда может пролить свет на содержимое нашего диска, но этот процесс чрезвычайно сложен.
Лучший пакет для поиска данных на диске - "The Coroner's Toolkit" Дена Фармера (Dan Farmer) и набор tctutils утилит для него. Программное обеспечение обеспечивает функциональные возможности для сбора скрытых данных, анализ изменений содержимого жесткого диска (использование файла timestamps), расположение данных на диске (использование узла (inode) и номера блока). Детальное описание пакета выходит за рамки этой статьи.
Сейчас рассмотрим, как можно предотвратить обнаружение личных данных. Для этого существует несколько Linux-утилит. Все, кроме одной, могут использоваться для затирания файлов, реже - для пустого пространства.
Некоторые из них используют случайные множественные проходы, как рекомендуется выше, а некоторые один раз записывают нулевой файл (файл, содержащий нули).
Некоторые из них не работают при некоторых обстоятельствах или для определенной файловой системы. Как сообщено в странице shred: "shred полагается на очень важное предположение: то, что файловая система записывает поверх данных в месте ". Если это условие не выполнено, никакое безопасное стирание не будет произведено (без сообщения об ошибках!).
Чтобы устранять следы старых удаленных файлов, можно вытереть пустое место. Самый простой метод состоит в использовании стандартной Linux-утилиты "dd". Вытереть пустое место на разделе /home можно так:
dd if=/dev/zero of=/home/bigfile
sync
rm /home/bigfile
sync
Эти команды записывают нули в совбодное место. Выполнение этих команд для каталога /tmp может разрушить некоторые приложение, поэтому нужно быть осторожным. Утилита "sfill", входящая в состав пакета THC secure_delete (пакет доступен по адресу http://packetstorm.linuxsecurity.com/groups/thc/), использует более строгий алгоритм.
Должен отметить, что swap-пространство также может содержать части личных данных и также должно быть затерто в целях дополнительной безопасности. Другая утилита (sswap) из пакета THC может быть использована как раз для этой цели.
Обратите внимание, что даже если затерто пустое пространство, "слабые места" остаются неповрежденными. Если файл вытерт (по крайней мере, с помощью текущей версии GNU shred), связанное "слабое место" затерто не будет!