Файловые системы Ext2 и Ext3, которые я далее буду обозначать общим термином ExtX, используются по умолчанию во многих дистрибутивах операционной системы Linux. Ext3 представляет собой серверную версию Ext2 с поддержкой журналов файловой системы, но сохраняет базовую архитектуру Ext2. Системы ExtX базируются на системе UFS (UNIX File System). Из ExtX были исключены многие компоненты UFS, ставшие ненужными; эти системы проще понять, поэтому мы начнем именно с них. В отличие от других операционных систем, Linux поддерживает большое количество файловых систем, и для каждого дистрибутива можно выбрать свою файловую систему по умолчанию. На момент написания книги в большинстве дистрибутивов использовалась файловая система Ext3, но файловая система Reiser тоже получила широкое распространение, а ее архитектура не имеет ничего общего с ExtX. В этой главе рассматриваются принципы работы ExtX, а в главе 15 будут описаны структуры данных. Эту и следующую главы можно читать как параллельно, так и последовательно.

Введение

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

Базовая информация о строении ExtX хранится в структуре данных суперблока, находящейся в начале файловой системы, Содержимое файлов хранится в блоках, которые представляют собой группы смежных секторов. Метаданные каждого файла и каталога хранятся в структуре данных, называемой индексным узлом (i-узлом); эта структура обладает фиксированным размером и находится в индексной таблице. Для каждой группы блоков существует одна индексная таблица. Имя файла хранится в структуре записи каталога, которая находится в блоках, выделенных родительскому каталогу файла. Записи каталогов представляют собой простые структуры данных, содержащие имя файла и указатель на индекс ную запись файла. Отношения между записями каталогов, индексными узлами и блоками изображены на рис. 14.1.

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

Системы ЕхіХ обладают дополнительными функциями, разделенными натри категории в зависимости от того, что должна делать операционная система, обнаружив файловую систему с функциями, которую она не поддерживает. К первой категории относятся функции совместимости. Даже если ОС не поддерживает какие-либо из этих функций, она все равно может смонтировать файловую систему и продолжить работу в обычном режиме. В частности, к этой категории относятся методы выделения, журналы файловой системы и расширенные атрибуты. Также существуют несовместимые функции; столкнувшись с ними, ОС не должна монтировать файловую систему. Примером несовместимой функции является сжатие. Наконец, функция может быть совместимой в режиме только для чтения. Если ОС встречает одну из этих функций, которые ею не поддерживаются, файловая система должна монтироваться в режиме только для чтения. Примерами могут послужить поддержка больших файлов и сортировка каталогов с применением В-деревьев вместо несортированных списков.

Системы ЕхЬХ содержат многочисленные экспериментальные компоненты и функции, не реализованные в крупных дистрибутивах Ьіпих. Кроме того, на анализируемом компьютере некоторые подсистемы могут быть не установлены. В Ьіпих локальный администратор может включить любые подсистемы ядра по своему желанию, поэтому эксперт не должен делать никаких предположений относительно ОС. Если вы исследуете систему Ьіпих, которая использовалась в качестве корпоративного сервера, вероятно, она будет иметь более стандартную сборку. С другой стороны, система Ьіпих на настольном компьютере злоумышленника, подозреваемого во взломе других систем, может содержать экспериментальные подсистемы. Анализ ядра и его модификаций относится к области прикладного анализа и выходит за рамки книги. Флаги используемых функций могут показать, что в файловой системе задействованы экспериментальные функции, не описанные в книге.

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

Категория данных файловой системы

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

Общие сведения

В ExtX для хранения данных категории файловой системы используются две структуры: суперблок и дескриптор группы. Суперблок находится в начале файловой системы и содержит базовую информацию о размере и конфигурации. Суперблок является аналогом структур данных загрузочного сектора в файловых системах NTFS и FAT. Как упоминалось ранее, файловая система делится на группы блоков, и с каждой группой связывается специальная структура данных, описывающая ее строение - дескриптор группы. Дескрипторы групп хранятся в таблице дескрипторов групп, которая находится в группе, следующей за суперблоком. В файловой системе создаются резервные копии суперблока и таблицы дескрипторов групп, используемые в случае повреждения основной копии.

Суперблок

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

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

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

Суперблок определяет активные функции файловой системы. Как говорилось в разделе «Введение», функции делятся на три категории: совместимые, несовместимые и совместимые только для чтения. Для простоты подробное описание каждой функции будет приводиться в соответствующем разделе главы. Здесь я ограни чусь описанием только одной функции, совместимой только для чтения: так называемого «разреженного суперблока». При использовании этой функции резервные копии суперблока и таблицы дескрипторов групп хранятся только в некоторых группах блоков. В тестовой файловой системе я обнаружил, что резервные копии находятся в группах 1, 3, 5, 7 и 9, а следующие копии встретились только в группах 25 и 27. При создании файловой системы Ех1Х в Ппих режим разреженного суперблока включен по умолчанию. Эта функция не должна влиять на ход расследования - разве что эксперт не должен предполагать, что каждая группа содержит зарезервированное пространство для резервной копии суперблока.

Рис. 14.2. Строение файловой системы ExtX с пятью группами блоков

В Linux метка тома в суперблоке может использоваться для идентификации файловой системы. Например, стандартный способ ссылки на файловую систему в Linux основан на использовании имени устройства - скажем, /dev/hda5. Также на файловую систему можно сослаться по метке тома, а системные конфигурационные файлы могут использовать метку вместо имени устройства. Например, файл /etc/fstab в Linux содержит перечень монтируемых файловых систем; если файловой системе присвоена метка rootfs, то вместо ссылки на устройство вида/dev/ hda4 в нем может использоваться конструкция LABEL=rootfs

За описанием структуры данных и примером суперблока обращайтесь к следующей главе. Результат выполнения программы fsstat в файловой системе будет приведен далее в этом разделе.

Таблица дескрипторов групп

В блоке, следующем за суперблоком, хранится таблица дескрипторов групп. В таблице хранятся структуры данных дескрипторов групп для всех групп блоков в файловой системе. Резервная копия таблицы существует в каждой группе блоков (если только в системе не активизирована функция разреженного суперблока). Помимо содержимого файлов, группы блоков содержат административные данные - резервные копии суперблока и таблицы дескрипторов групп, таблицы индексных узлов, битовые карты индексных узлов и блоков. Дескриптор группы описывает местонахождение этих данных. Базовое строение группы блоков показано на рис. 14.3.

Рис. 14.3. Строение группы блоков

Битовая карта блоков описывает состояние выделения блоков группы, а ее начальный адрес блока задается в дескрипторе группы. Размер карты в байтах вычисляется делением количества блоков в группе на 8. При создании файловой системы Linux определяет количество блоков в группе равным количеству бит в блоке. Таким образом, для хранения битовой карты блоков требуется ровно один блок.

Битовая карта индексных узлов описывает состояние выделения индексных узлов в группе, а ее начальный адрес блока также задается в дескрипторе группы. Размер карты в байтах вычисляется делением количества индексных узлов в группе на 9. Как правило, количество индексных узлов в группе меньше количества блоков, но пользователь может выбрать эти значения при создании файловой системы. Наконец, начальный адрес блока таблицы индексных узлов содержится в дескрипторе группы, а ее размер вычисляется умножением количества индексных узлов в группе на размер каждого узла (128 байт).

В дескрипторе группы также содержится количество свободных блоков и индексных узлов в группе блоков, а в суперблоке - общее количество свободных блоков и индексных узлов во всех группах. Структура данных дескриптора группы приведена в главе 15.

Загрузочный код

Если файловая система ExtX содержит ядро ОС, в ней может храниться загрузочный код. Все остальные файловые системы, не являющиеся загрузочными, не содержат загрузочного кода. Если загрузочный код существует, он размещается в 1024 байтах, предшествующих суперблоку (то есть в первых двух секторах). Загрузочный код выполняется в результате передачи управления из кода записи MBR (Master Boot Record) в секторе 0 диска. Как правило, загрузочный код ExtX знает, какие блоки были выделены ядру, и загружает их в память.

Во многих системах Linux загрузочный код не хранится в файловой системе с ядром. Вместо этого в MBR находится загрузчик (boot loader), которому известно, в каких блоках находится ядро. В этом случае ядро загружается кодом MBR, а необходимость в дополнительном загрузочном коде файловой системы отпадает. Пример образа

В этой главе рассматриваются примеры, основанные на тестовом образе файловой системы. Я приведу результат выполнения программы fsstat из пакета TSK

(The Sleuth Toolkit) для этого образа. Некоторые из представленных значений встретятся нам в последующих примерах. Этот же образ будет использоваться для ручного разбора в следующей главе.

# fsstat -f linux-ext3 ext3.dd FILE SYSTEM INFORMATION

File System Type: Ext3 Volume Name:

Volume ID: e4636f48c4ec85946e489517a5067a07

Last Written at: Wed Aug 4 09:41:13 2004

Last Checked at: Thu Jun 12 10:35:54 2003

Last Mounted at: Wed Aug 4 09:41:13 2004

Unmounted properly Last mounted on:

Source OS: Linux Dynamic Structure Compat Features: Journa,

InCompat Features: Filetype, Needs Recovery,

Read Only Compat Features: Sparse Super, Has Large Files,

Journal ID: 00 Journal Inode: 8

METADATA INFORMATION

Inode Range: 1 - 1921984 Root Directory: 2 Free Inodes: 1917115

CONTENT INFORMATION

Block Range: 0 - 3841534 Block Size: 4096 Free Blocks: 663631

BLOCK GROUP INFORMATION

Number of Block Groups: 118 Inodes per group: 16288 Blocks oer group: 32768

Group: 0:

Inode Range: 1 - 16288 Block Range: 0 - 32767 Layout:

Super Block: 0 - 0 Group Descriptor Table: 1 - 1 Data bitmap: 2 - 2 Inode bitmap: 3 - 3 Inode Table: 4 - 512 Data Blocks: 513 - 32767 Free Inodes: 16245 (99%)

Free Blocks: О (ОХ)

Total Directories: 11

Group: 1:

Inode Range: 16289 - 32576 Block Range: 32768 - 65535 [...]

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

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

Анализ данных категории файловой системы подразумевает обработку ключевых структур данных для определения строения файловой системы, а эта задача напрямую ведет к более сложным и полезным методам анализа. В ExtX анализ начинается с поиска суперблока; сделать это нетрудно, потому что суперблок всегда хранится со смещением 1024 байта от начала файловой системы. Когда суперблок будет обнаружен, можно переходить к его обработке. Структура суперблока играет ключевую роль в любых расследованиях, потому что в ней хранятся сведения о размерах и местонахождении важнейших структур данных. На случай повреждения суперблока в системе должны существовать его резервные копии. Флаги функций указывают, обладает ли файловая система уникальными возможностями, не поддерживаемыми программой анализа или ОС. Размер файловой системы вычисляется по размеру блока и количеству блоков в файловой системе.

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

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

Как и во всех остальных файловых системах, в ExtX эта категория содержит важнейшую информацию, описывающую строение файловой системы. Тем не менее в ней относительно мало пользовательских данных, содержащих доказательства возникновения некоторых событий. Суперблок содержит большой объем неиспользуемого пространства, которое может использоваться для хранения скрытых данных. После знакомства с главой 15 и главами, посвященными UFS, вы увидите, что суперблок ExtX гораздо проще суперблока UFS; это обстоятельство упрощает выявление значений, используемых для сокрытия данных. 1024 байта перед началом суперблока зарезервированы для хранения загрузочного кода; если они не используются, в них могут храниться скрытые данные. Также стоит сравнить размер файловой системы с размером тома - по результатам сравнения можно узнать, нет ли неиспользуемых секторов после файловой системы.

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

Если суперблок поврежден или его не удается найти, проведите поиск резервных копий. Один из способов основан на поиске сигнатуры 0xef53 в байтах 56-57. Также можно попытаться определить границы групп блоков на основании предполагаемого размера блока и того факта, что размер группы блоков часто зависит от количества битов в одном блоке. Следовательно, если умножить размер блока на 9 и прибавить 1, вы получите адрес сектора с резервной копией. Например, если в файловой системе используются 1024-байтовые блоки, а каждая группа состоит из 8192 блоков, то резервная копия суперблока должна находиться в блоке 8192 (при отсутствии зарезервированных блоков). Резервные копии структуры данных могут использоваться для выявления изменений, вносимых вручную в основную копию.

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

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

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

Суперблок ExtX обладает сигнатурой 0xef53, хранящейся в байтах 56-57. Мы проведем поиск этого значения, чтобы найти начало файловой системы. Можно ожидать, что в процессе поиска будет найдено много ложных совпадений, поскольку сигнатура имеет малую длину. Для проверки истинности совпадения можно проверить другие величины, которые должны присутствовать в суперблоке (например, можно убедиться в том, что размер блока является разумной величиной). Также можно воспользоваться тем фактом, что в каждой группе блоков должна храниться резервная копия, так что при обнаружении настоящего суперблока ExtX должна быть выявлена серия совпадений, разделенных равными интервалами. Кроме того, размер группы блоков обычно определяется на основании размера блока, так что в случае использования стандартной процедуры создания расстояние между суперблоками должно быть равно 8192,16384 или 32768. Также следует учитывать, что в системе может действовать функция разреженного суперблока; в этом случае резервная копия не будет включаться в каждую группу блоков.

Для обнаружения сигнатур можно воспользоваться любой программой с возможностью поиска шестнадцатеричных значений. Такая программа, как grep, в данном случае не подойдет, потому что она поддерживает только поиск по ASCII-кодам. В нашем примере будет использоваться программа sigfind из пакета TSK.

Шестнадцатеричная сигнатура хранится на диске в прямом порядке байт, поэтому необходимо либо выбрать соответствующую конфигурацию программы, либо изменить порядок байт сигнатуры при вводе (то есть использовать последовательность 0x53ef). Результат работы sigfind выглядит так:

# sigfind -о 56 -1 ef53 disk-8.dd Block size: 512 Offset:56 Block: 298661 (-)

Block: 315677 (+17016)

Block: 353313 (+37636)

Block: 377550 (+24237)

Программа sigfind выводит сектор, в котором обнаружена сигнатура, и расстояние от предыдущего совпадения. Пока расстояния не равны степеням 2, а совпадения не удалены на одинаковые расстояния, поэтому мы их проигнорируем (вероятно, программа автоматизированного поиска таблицы разделов провела бы анализ их содержимого). Тем не менее позднее в выходных данных обнаруживаются интересные данные:

[...]

Block: 2056322 (+274327)

Block: 2072706 (+16384)

Block: 2105474 (+32768)

Block: 2148242 (+32768)

Block: 2171010 (+32768)

Block: 2203778 (+32768)

Обратите внимание: последние четыре совпадения находятся на одинаковых расстояниях, а предшествующее совпадение удалено от предыдущего на 16 384 сектора. Все эти расстояния достаточно характерны для групп блоков. Таким образом, начальная гипотеза состоит в том, что первый суперблок находится в секторе 2 056 322, а резервные копии находятся в секторах 2 072 706, 2 105 474 и т. д. Вероятно, группа блоков состоит из 16 384 секторов, а в системе действует режим разреженного суперблока, поэтому резервные копии суперблока присутствуют не во всех группах.

Чтобы проверить эту гипотезу, мы читаем 1024 байта, начиная с сектора 2 056 322, отображаем их на структуру данных суперблока и анализируем ее различные поля. Анализ показывает, что размер блока равен 1024 байтам, а в системе активна функция разреженного суперблока. Файловая система состоит из 104 422 блоков, по 8192 блока в группе. Следовательно, резервная копия суперблока должна быть удалена на 16 384 сектора (потому что один блок состоит из двух секторов) - пока все совпадает.

Последняя проверка должна определить, является ли суперблок в секторе 2 056 322 первым в файловой системе, или это одна из резервных копий. Одно из полей суперблока идентифицирует группу блоков, к которой он принадлежит; в нашем примере оно равно 0. У суперблока в секторе 2 072 706 это поле равно 1. Следовательно, мы можем предположить, что файловая система начинается в секторе 2 056 320 (за 2 сектора до суперблока) и следует до сектора 2 265 164.

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

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

Block: 2265167 (+61389)

Block: 2265733 (+566)

Block: 2265985 (+252)

Block: 2266183 (+198)

Block: 2266357 (+174)

Block: 2266457 (+100)

[...]

На основании положения сектора 2 265 167 по отношению к концу предыдущего раздела можно было бы предположить, что он начинает новую файловую систему. С другой стороны, из-за разных расстояний между последующими совпадениями непохоже, чтобы они были резервными копиями; программа находит более 200 совпадений, многие из которых разделены всего 20 секторами. Пожалуй, их тоже можно проигнорировать. Пропустим пару сотен совпадений:

[...]

Block: 2278273 (+2800)

Block: 2281551 (+3278)

Block: 2282617 (+1066)

Block: 2314319 (+31702)

Block: 2347087 (+32768)

Block: 2379855 (+32768)

Block: 2412623 (+32768)

Теперь мы видим равномерные интервалы, характерные для резервных копий. Просмотр сектора 2 314 319 показывает, что это файловая система Ext3 с 1024-байтовым размером блока и 8192 блоками в группе. Также мы видим, что копия принадлежит к группе блоков 3. А это означает, что группа блоков началась 49 152 секторов назад, то есть в секторе 2 265 167 сразу же за концом предыдущей файловой системы.

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

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

Рис. 14.4. Результаты поиска сигнатуры суперблока (с многочисленными совпадениями в журнале файловой системы)

Категория содержимого

К этой категории относится непосредственное содержимое файлов и каталогов. Этот раздел посвящен категории данных содержимого в ExtX и способам их анализа.

Общие сведения

В ExtX единицей данных является блок - группа смежных секторов. Блоки ExtX можно рассматривать как аналоги кластеров в FAT и NTFS. В этом разделе рассматриваются размеры блоков и способы их адресации, а также способы проверки состояния выделения.

Файл $usnjrnl | Криминалистический анализ файловых систем | Блоки


Криминалистический анализ файловых систем



Новости за месяц

  • Апрель
    2020
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31