Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #101, МАЙ 2007 г.

Пришел, увидел, наследил!

Хвостатый гуру

Хакер, номер #101, стр. 034

Вся правда о надежном удалении файлов

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

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

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

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

Проблемы удаления, или осколки файлов

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

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

Файловая система NTFS (поддерживаемая Windows NT/2000/XP) позволяет устанавливать размер кластера в 512 байт, что соответствует длине сектора. При этом потери дискового пространства в незаполненных хвостах кластеров сводятся к минимуму, но вместе с тем растет фрагментация, вызывающая значительное падение производительности. Файловые системы UNIX'а в этом смысле намного более продвинуты и активно используют деление кластера на зоны, убивая одним выстрелом двух зайцев: уменьшая фрагментацию и сокращая потери дискового пространства.

Впрочем, мы отвлеклись. Вернемся к нашим баранам. После удаления файла, принадлежащие ему кластеры возвращаются в пул свободного пространства, откуда его черпают вновь создаваемые и увеличивающиеся в размерах файлы, постепенно затирающие содержимое своих предшественников. Однако стратегия выделения свободного пространства построена так, что удаленный файл может валяться на диске годами. Даже если до отказа забить диск всяким stuff'ом (типа музыки или видео), это все равно не гарантирует полного затирания удаленного файла. Почему?! Да потому, что если размер записываемого файла не кратен длине одного кластера, то хвост кластера остается незатертым! Конечно, крошечный обрывок файла - это уже не весь файл, но иногда хватает и его (особенно если он содержит номера телефонов, банковских счетов, и т.д.)

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

Необходимость (и целесообразность) многократной перезаписи мы рассмотрим во врезке «Искусство затирания», а сейчас обратим внимание на то, что операционные системы семейства NT/UNIX предоставляют доступ к диску на секторном уровне только администраторам. Это ограничение можно обойти, установив специальный драйвер (например, ASPI32 от компании Adaptec), но установка драйвера также требует прав администратора, и на чужом компьютере выполнить ее, скорее всего, не удастся.

Хуже того, работа с диском на секторном уровне требует хорошего знания всех особенностей файловой системы, которая меняется от версии к версии, в результате чего существует риск потери всего дискового тома, превращающий шредеры в потенциальные диск-дестроеры! Ну и кому такое удаление нужно?!

К тому же шредеры обычно не обращают внимания на файловую запись, оставляя нетронутыми имя файла, его длину, дату создания/модификации/последнего обращения и прочие атрибуты, раскрытие которых может иметь далеко идущие последствия, особенно если файл назывался 12-yo-asian-gal-fucked-by-black-rapists.avi.

Еще один тонкий момент. Файловая система NTFS поддерживает два типа файлов: резидентные и нерезидентные. Нерезидентные хранятся в кластерах на диске (и таких файлов большинство), а резидентные размещаются прямо внутри файловой записи, что ускоряет доступ к файлу, но при этом размер файла не должен превышать размер хвоста файловой записи, обычно составляющий 1-2 килобайт. Причем если файл был создан как резидентный, а затем увеличивает свою длину, файловая система превращает его в нерезидентный, но не удосуживается подчистить резидентную копию, которая останется болтаться в файловой записи даже после ее удаления. Естественно, файловые записи, принадлежащие удаленным файлам, освобождаются, повторно используясь при создании новых файлов. Но если файловая запись, содержащая незатертую копию резидентного файла, выделяется нерезидентному файлу, резидентная копия остается в целости и сохранности!

Вот, оказывается, какое непростое дело — удаление файлов. Хотя если как следует разобраться и раскинуть мозгами, расширив свое сознание до границ адресного пространства 64-разрядных процессоров, станет ясно, что спускаться на секторный уровень совершенно необязательно и того же самого эффекта можно добиться путем перезаписывания файлов через стандартные функции ввода/вывода. Достоинства этого подхода в том, что он работает с любой файловой системой, не требует наличия прав администратора, абсолютно безопасен в плане разрушения дискового тома и т.д. и т.п.

Важно не забывать о файловых атрибутах. После затирания файла нулями необходимо переименовать его случайным именем максимально возможной длины (для Windows это 256 символов вместе с путем), чтобы гарантированно затереть хвост старого, затем усечь длину файла до нуля и закрыть его. Затем открыть, записать 512 байт нулей (для затирания резидентной части) и вновь закрыть. Потом опять открыть, дописать еще 512 байт и делать так 6 раз, пока файл гарантированно не превратится в резидентный, после чего его можно смело удалять. Пусть теперь кто-нибудь попытается восстановить хотя бы кусочек данных! А ведь восстановит, гад! А все потому…

А все потому, что мы совершенно забыли о копиях файла, которые создают многие программы как в текущем каталоге, так и в каталогах, обозначенных в переменных окружения TEMP/TMP. А если за время своего существования файл менял размер, увеличиваясь или сокращаясь, на диске останется множество следов, которые при затирании файла останутся нетронутыми! Дефрагментаторы, перемещая файл с одного места на другое, могут оставлять множество осколков, зачастую расположенных весьма упорядоченным образом (очень часто дефрагментатор сначала собирает файл по кусочкам в свободном месте, а затем копирует его на новое место обитания).

Избавиться же от осколков очень сложно. Забивание диска файлами с размером, кратным 512 байтам, чтобы гарантированно затереть все хвосты секторов, не только трудоемко, но еще и нецелесообразно. При форматировании дискового тома файловая система NTFS резервирует для $MFT-файла (скрытого служебного файла, предназначенного для хранения файловых записей) 10% от его объема для предотвращения его фрагментации. Однако, по мере исчерпания свободного пространства, половина оставшегося резерва высвобождается в пул общего пользования. Затем (при нехватке пространства) - еще половина. И так продолжается до тех пор, пока резерв полностью не истощится.

Ок, диск до отказа забит файлами, что же происходит после их удаления? Резерв не пополняется, $MFT-файл оказывается фрагментирован, и при дальнейшем использовании диска эта фрагментация будет неуклонно нарастать, вызывая существенное падение производительности. То есть если NTFS-том хотя бы однажды был заполнен более чем на 90%, $MFT-файл с высокой степенью вероятности фрагментирован. Причем ни один известный нам дефрагментатор не может собрать его по частям в единое целое (O&O Defrag Pro утверждает, что умеет это делать, но со своей работой не справляется).

Таким образом, для сохранения прежней производительности следует всегда оставлять хотя бы 10% емкости NTFS-тома. С другой стороны, если диск никогда не заполнялся более чем на 90%, то в зарезервированной под $MFT области никаких осколков удаляемого файла заведомо не окажется! Но чтобы удалить файл наверняка, диск все-таки приходится заполнять до отказа. Иначе нельзя. Как же тогда бороться с фрагментацией?! Нет ничего проще! Создаем огромное количество (несколько тысяч и больше) файлов нулевого размера, для хранения каждого из которых расходуется одна файловая запись, расположенная в $MFT. Затем забиваем диск до отказа файлами, размер которых кратен 512 байтам и превышает 4 Кб, чтобы они не оказались резидентными. Дождавшись исчерпания дискового пространства, удаляем все файлы, освобождая принадлежащие им записи в $MFT. Другими словами, создание файлов нулевой длины увеличивает размер $MFT-файла до его фрагментации, а поскольку при удалении файлов усечения размеров $MFT не происходит, он остается нефрагментированным, если, конечно, не был уже фрагментирован ранее.

Кстати говоря, на языке Си несложно написать программу, открывающую файл на запись и позиционирующую указатель на величину, равную размеру свободного пространства. Теперь, если закрыть файл, мы сможем прочитать все, что находилось на диске (в том числе и содержимое ранее удаленных файлов!). Хороший трюк для похищения конфиденциальной информации с чужих компьютеров, не правда ли? Особенно в свете того, что он не требует прав администратора и работает с любой операционной системой, будь то Linux, Windows или BSD. Соответственно, если забить этот файл нулями, мы очистим все дисковое пространство. Или практически все. Останутся только хвосты кластеров, принадлежащие еще не удаленным файлам, и резидентные копии внутри $MFT. К сожалению, на прикладном уровне их удалить невозможно, но ведь не спускаться же на уровень голых секторов?!

Существует хитрый трюк, позволяющий очистить хвосты и на прикладном уровне. Перебираем все файлы один за другим. Если размер файла не кратен размеру кластера (или 512 байтам, как наименьшей возможной длине), открываем его на запись, дописываем в хвост нули, а затем усекаем до прежнего размера. Естественно, заблокированные файлы (файл подкачки, реестр) таким образом обработать не получится, во всяком случае без загрузки с другого носителя (LiveCD или второго жесткого диска). Конечно, загрузка с LiveCD напрягает, но это все-таки не секторный уровень, на котором риск угробить весь дисковый том целиком слишком велик.

Практические советы по удалению файлов

Ладно, оставим теорию и перейдем к практике. В FAR'е для необратимого удаления файлов достаточно нажать <ALT-DEL>, при этом FAR забьет файл нулями, после чего переименует его в случайно сгенерированное имя, усечет длину до нуля и благополучно удалит его с диска. В большинстве случаев этого более чем достаточно, однако следует помнить, что на диске могут оставаться неудаленные копии файла, и для надежности желательно забить все свободное пространство по методике, описанной выше.

Полная дефрагментация также затирает все неудаленные копии, однако тот дефрагментатор, что входит в штатный комплект поставки Windows 2000/XP, для этой цели категорически не годится, поскольку дефрагментирует лишь наиболее фрагментированные файлы и не изменяет положения остальных. Дефрагментатор O&O Defrag Pro поддерживает несколько стратегий дефрагментации, позволяя упорядочивать файлы по дате, типу и времени последнего доступа. Достаточно очевидно, что если мы сначала выберем стратегию упорядочивания файлов по типу/имени, а затем — по времени доступа, то дефрагментатор совершит множество перемещений файлов, в результате чего все осколки ранее удаленных файлов с высокой степенью вероятности окажутся затертыми. И хотя некоторый шанс на их восстановление все-таки есть, в обыденной жизни им можно пренебречь.

Также полезно держать секретные файлы в сжатом состоянии («Файл -> Свойства -> Атрибуты -> Другие -> Сжимать содержимое для экономии места на диске»). Это сделает невозможным прямой секторный поиск осколков файла по его содержимому. С другой стороны, при затирании сжатого файла нулями реально затирается лишь небольшая часть, поскольку нули очень хорошо сжимаются, так что, прежде чем нажимать <Alt-Del> в FAR'е, следует обязательно сбросить атрибут сжатия.

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

Где еще могут храниться удаленные файлы? Прежде всего, в файле подкачки. Ведь при любом действии с файлом (открытии/копировании), он загружается в оперативную память, а оттуда с некоторой вероятностью попадает в файл подкачки, который закрыт для записи даже администратору. Правда, загрузившись с другого носителя, мы можем нажать <ALT-DEL> в FAR'е и без доли сомнения удалить этот файл к чертям. Волноваться не стоит — при следующей загрузке операционная система его создаст заново. Также можно запустить прожорливое приложение, поглощающее всю свободную память.

Папка Recent в Documents and Settings хранит имена последних открываемых документов, и хранит она их много. Аналогичным образом поступает и FAR, сохраняя список последних копируемых файлов в реестре, в ветке FAR. Конечно, имена файлов — это еще не сами файлы, но в некоторых случаях знания имени файла вполне достаточно если не для вынесения приговора, то для порчи репутации.

Обзор шредеров

Acronis Privacy Expert Suite 9.0 — продвинутый коммерческий шредер, работающий на секторном уровне и поддерживающий практически все системы линейки Windows. Имеет богатый ассортимент методов необратимого удаления данных, реализуя следующие национальные стандарты: DoD 5220.22-M, NAVSO P-5239-26/RLL, NAVSO P-5239-26/MFM (американские), VSITR (немецкий), ГОСТ P50739-95 (отечественный), а также ряд нестандартных алгоритмов: метод Питера Гутмана (35 проходов), метод Брюса Шнайера (7 проходов) и некий «простой, но эффективный в большинстве случаев быстрый метод». Ни в одном из этих методов очистка файловых записей в $MFT и подчистка кластерных хвостов не выполняется, и возникает дурацкий вопрос, какого черта елозить головкой целых 35 проходов, когда рядом лежат нетронутые осколки неудаленных данных?! К тому же Acronis печально известен своими конфликтами как с программным, там и с аппаратным обеспечением.

RedBut — условно бесплатная программа, представляющая собой довольно навороченное средство для предотвращения утечек информации и умеющая (в том числе) необратимо удалять файлы, если, конечно, верить разработчикам. Однако о полной очистке дискового пространства от возможных осколков RedBut не заботится, а потому восстановление информации оказывается не только возможным, но и тривиальным. Достаточно запустить любой дисковый редактор - и вперед! Желающие познакомиться с этим «добром» могут посетить сайт http://liepass.com.ru/download.htm, заплатить $20 за «офисную» версию или $140 за «профессиональную», получив в результате ту же самую надежность, которую дает бесплатный (для граждан СНГ) FAR по <Alt-Del>.

BCWipe от компании Jetico — довольно известная утилита, выпущенная для всего зоопарка операционных систем, от древней Windows 3.1 и до Linux. BCWipe придерживается американского стандарта DoD 5200.28-STD, однако чисткой хвостов не занимается, со всеми вытекающими отсюда последствия.

Заключение

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

Искусство затирания

Интуиция подсказывает: чем большее количество раз перезаписано содержимое сектора, тем труднее его восстанавливать. Согласно стандарту 5220.22 (http://en.wikipedia.org/wiki/DOD_5220.22-M), подготовленному Министерством обороны США (United States Department of Defense), удаляемый файл должен быть перезаписан как минимум трижды. В противном случае данные могут быть восстановлены за счет остаточного намагничивания и вихляний магнитной головки вдоль дорожки.

В народе ходят легенды о существовании аппаратуры, восстанавливающей файлы даже после нескольких циклов перезаписи, однако не известно ни одного прецедента восстановления файла по остаточной намагниченности. Теоретически такая операция может быть осуществлена с помощью сканирующего зондового микроскопа, процесс работы которого, кстати, подробно описан в статье «Методы сканирующей зондовой микроскопии для исследования поверхностей накопителей информации и восстановления данных» (www.epos.kiev.ua/pubs/spm.htm). Однако, учитывая плотность записи современных носителей, выудить полезную информацию таким образом невозможно. Сканирующий микроскоп - это что! К нему еще потребуется прикрутить анализатор прочитанной информации, учитывающий систему модуляции конкретной модели жесткого диска, алгоритм кодирования битов, механизм трансляции секторов и кучу всего…

Возможно, Министерство обороны США и располагает подобной техникой (хоть это и мало вероятно), тщательно скрывая ее существование от народа, но в общем случае восстановление данных даже после однократной перезаписи невозможно! Однозначно! За это не возьмется ни одна фирма, специализирующаяся на спасении информации. Исключения составляют случаи, когда данные вытягиваются из незатертых копий файлов, разбросанных по всему дисковому пространству. Но к остаточному намагничиванию это никакого отношения не имеет, поэтому будем считать, что вопрос о количестве циклов перезаписи закрыт раз и навсегда. Однократной перезаписи вполне достаточно!

WWW

DVD

На диске ты найдешь несколько полезных шредеров, а также бесплатный для граждан xUSSR файловый менеджер FAR. Последний, кстати говоря, может заменить собой с десяток других полезных утилит.

Содержание