<<
>>

Алгоритмы выделения

В этом разделе я привожу собственные наблюдения и результаты анализа исходного кода ядра Linux в области выделения метаданных ExtX. В другой ОС или измененном коде ядра Linux могут использоваться другие алгоритмы выделения.

Результаты были получены в стандартной системе Fedora Core 2.

Выделение индексных узлов

Когда для хранения файла или каталога требуется выделить новый индексный узел, Linux прежде всего учитывает группу блоков, в которой должен находиться индексный узел. Если индексный узел не относится к каталогу, Linux выделяет его в той же группе блоков, в которой находится родительский каталог. Это делается для того, чтобы вся информация каталога находилась более или менее в одной зоне. Если группа не содержит свободных индексных узлов или свободных блоков, поиск производится в другой группе. Для выбора случайной группы Linux использует квадратичное хеширование: этот алгоритм начинает с текущей группы блоков и последовательно прибавляет к ней степени 2 (1, 2, 4, 8, 16 и т. д.). Если в полученной таким образом группе присутствует свободный индексный узел, он используется системой. Если алгоритм не находит группу со свободным индексным узлом, проводится линейный поиск, начиная с текущей группы. В обоих случаях применяется поиск первого свободного индексного узла.

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

используются значения общего количества свободных индексных узлов и блоков, хранящиеся в суперблоке. Затем Linux проводит поиск в каждой группе, начиная с 0, и использует первую группу, у которой эти значения меньше средних. Если найти группу, у которой оба параметра меньше вычисленных, не удается, используется группа с наименьшим количеством каталогов и наибольшим количеством свободных индексных узлов.

Оба значения хранятся в дескрипторах групп.

При выделении индексного узла его содержимое стирается, а М-, А- и С-время приводятся в соответствие с текущим временем; D-время обнуляется. Счетчик ссылок (количество имен файлов, содержащих ссылки на данный индексный узел) задается равным 1 для файлов. Для каталогов счетчик ссылок задается равным 2 из-за присутствия псевдоссылки «.» в данном каталоге. Linux также обновляет поле поколения текущим значением счетчика.

При удалении файла в Linux количество ссылок на него в индексном узле уменьшается на 1. Если счетчик ссылок уменьшается до нуля, индексная запись освобождается. Если файл все еще открыт каким-либо процессом, он причисляется к зависшим файлам и помещается в список, хранящийся в суперблоке. После закрытия файла процессом или перезагрузки системы индексный узел освобождается.

В Ext2 и Ext3 используются разные реализации удаления файлов. Ext3 обнуляет размер файла и стирает указатели на блоки в индексном узле и косвенных блоках. С другой стороны, Ext2 не стирает эти данные, что упрощает восстановление. М-, А- и С-время приводятся в соответствие с моментом удаления. Если файл был удален из-за перемещения на другой том, его A-время приводится в соответствие с моментом чтения содержимого. Данное обстоятельство помогает отличить удаленные файлы от перемещенных.

Обновление временных штампов

В индексных узлах ExtX хранятся четыре временных штампа, и мы должны выяснить, когда обновляются их значения. В моих экспериментах система Linux обновляла A-время при чтении содержимого файла или каталога. Для файла это происходило при чтении содержимого, при копировании файла и его перемещении на другой том. Если перемещение производится в пределах тома, то содержимое остается на прежнем месте, поэтому временной штамп не изменяется. Для каталогов A-время обновляется при чтении содержимого, при открытии файлов и подкаталогов. Как будет показано позднее, содержимым блоков каталога считаются имена файлов в каталоге.

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

С-время описывает момент последнего изменения индексного узла; это происходит при изменении метаданных файлов или каталогов — в частности, при создании файлов и каталогов, смене разрешений или владельца файла. При перемещении файла С-время обновляется. D-время задается только при удалении файла и стирается при повторном выделении индексного узла. Во многих удаленных файлах М- и С-время совпадает с D-временем.

Подведем итоге: при создании файла М-, А- и С-время обновляется текущим временем создания, D-время обнуляется, а у родительского каталога обновляется М- и С-время. При копировании файла A-время обновляется для исходного файла и родительского каталога; у приемного файла обновляется М-, А- и С-время; а у приемного родительского каталога обновляется М- и С-время. При перемещении файла у родительского каталога исходного файла обновляется М-, А- и С- время, у родительского каталога приемного файла — М- и С-время, а приемный файл сохраняет М- и A-время оригинала с обновлением С-времени. Если перемещение происходит в пределах тома, то для приемника используется тот же индексный узел, но при перемещении на другой том исходный индексный узел освобождается с обновлением М-, А-, С- и D-времени.

Методы анализа

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

В ExtX эта задача сводится к поиску и обработке структур данных индексных узлов. Чтобы найти конкретный узел, необходимо сначала определить, к какой группе блоков он принадлежит. Затем обработка дескриптора этой группы дает таблицу индексных узлов группы. После этого остается лишь определить, в какой записи таблицы хранится нужный индексный узел, и обработать его.

За исключением косвенных указателей и расширенных атрибутов, структура данных индексного узла вполне самостоятельна и содержит все метаданные. Чтобы идентифицировать все блоки, выделенные файлу или каталогу, следует прочитать 12 прямых указателей на блоки. Если файлу выделено большее количество блоков, далее следует обработать указатели первого, второго и третьего уровня на блоки, в которых хранятся адреса блоков с содержимым. Если указатель блока содержит адрес 0, файл является разреженным, а блок не выделяется на диске, потому что его пришлось бы заполнить нулями.

Чтобы проверить состояние выделения индексного узла, следует проанализировать битовую карту индексных узлов группы. Адрес битовой карты задается в дескрипторе группы. Если соответствующий бит равен 1, индексный узел выделен.

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

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

Этот блок содержит набор пар «имя-значение», задаваемых пользователем.

Факторы анализа

Благодаря стратегиям выделения, используемым в файловых системах UFS, в группах с малым объемом операций свободные индексные узлы могут существовать в течение более долгого времени. Значения М-, С- и D-времени также могут показать, когда файл был удален.

В Linux и в большинстве версий UNIX пользователь может легко менять М- и A-время файла командой touch, поэтому при оценке надежности временных штампов существующих файлов желательно найти независимые источники информации (такие, как журналы или сетевые пакеты). Кроме того, временные штампы хранятся в формате UTC, поэтому для точного вывода значений программе анализа должен быть известен часовой пояс, в котором находится компьютер.

Резервное пространство относится к числу функций, зависящих от операционной системы, но Linux заполняет неиспользуемые байты блоков нулями. Таким образом, данные из удаленных файлов могут существовать только в свободных блоках. Чтобы узнать, просматривает ли ваша программа резервное пространство файловой системы Ext3, можно воспользоваться тестовыми образами с сайта DFTT (Digital Forensic Tool Testing).

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

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

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

Один из методов сокрытия файлов состоит в том, что процесс открывает файл для чтения или записи, а затем удаляет имя файла. В этом случае счетчик ссылок индексного узла равен 0, но узел не является свободным. Когда это происходит,

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

Сценарий анализа

В процессе расследования инцидента в Linux обнаружен каталог с подозрительным именем. Наша задача — определить, какая учетная запись пользователя использовалась для создания находящихся в нем файлов. Идентификатор пользователя хранится в индексном узле файла, а информация о соответствии идентификатора и имени хранится в файле /etc/passwd.

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

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

У двух файлов в каталоге /usr/man/.Ci зарегистрировано время изменения 08:51:56, при этом указан идентификатор пользователя 1010. Обычно программа построения временной диаграммы преобразует идентификатор в имя пользователя, как в двух нижних строках, где идентификатор 0 преобразован в строку root. В процессе поиска в системе обнаруживается tar-файл с подозрительным каталогом. Идентификатор пользователя, ассоциированный с файлом, может быть сменен командой chown; впрочем, даже если идентификатор пользователя присутствует в файле паролей, это еще не доказывает, что файл был создан именно этим пользователем. Если мы хотим знать, кто создал подозрительный каталог, следует проанализировать разрешения родительского каталога. В данном случае родительским каталогом является каталог /usr/local/, принадлежащий привилегированному

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

<< | >>
Источник: Кэрриэ Б.. Криминалистический анализ файловых систем. 2007

Еще по теме Алгоритмы выделения:

  1. Алгоритмы выделения
  2. 6.3.5.3. Разделение и выделение акционерных обществ
  3. Вопрос 55 ДЛЯ ЧЕГО НЕОБХОДИМО ВЫДЕЛЕНИЕ ФУНКЦИЙ МЕНЕДЖМЕНТА?
  4. Выделение профессиональнойрекламы из проторекламных текстов
  5. 89. ВЫДЕЛЕНИЕ ЗЕМЕЛЬ ЗАПАСА
  6. Алгоритмы поведения и критерии их выбора
  7. Глава I ВЫДЕЛЕНИЕ СОЗНАНИЯ КАК КРИТЕРИЯ ПСИХИКИ
  8. Тестирование с целью выделения психотипов по темпераменту и стилям мышления
  9. 2.2. Подходы к менеджменту на основе выделения различных школ
  10. Насколько реальны выделенные нами культурные зоны?
  11. АЛГОРИТМ КОНСУЛЬТИРОВАНИЯ
  12. АЛГОРИТМ СТРАТЕГИЧЕСКОГО ПЛАНИРОВАНИЯ
  13. 7.2. Алгоритм аудиторской проверки
  14. 8.2. Алгоритм аудиторской проверки
  15. 9.2. Алгоритм аудиторской проверки