Thứ Năm, 5 tháng 6, 2014

[File System Forensics] NTFS concepts

Everthing is a File
Một trong các khái niệm quan trọng cần biết để hiểu về thiết kế của NTFS đó là dữ liệu quan trọng được cấp phát cho các files. Dữ liệu này bao gồm dữ liệu quản trị file system cơ bản (basic file system administrative data) mà thường được ẩn trong các file systems khác. Thực tế, các files mà chứa administrative data có thể được đặt ở bất cứ đâu trong volume, giống như bất cứ file bình thường nào. Do đó, một NTFS file system không có một layout cụ thể giống như các file systems khác. Toàn bộ file system được xét như là một data area, và bất cứ sector nào cũng có thể được cấp phát tới một file. Chỉ có một layout nhất quán là các sectors đầu tiên chứa boot sector và boot code.

MFT Concepts
Master File Table (MFT) là trái tim của NTFS bởi vì nó chứa thông tin của tất cả các files và các thư mục. Mọi file và thư mục có ít nhất một entry trong bảng này, và chính các entries cũng thực sự đơn giản. Chúng có kích thước 1KB, nhưng chỉ 42 bytes đầu tiên có một mục đích được định nghĩa sẵn. Các bytes còn lại lưu các thuộc tính (attributes), đây là những cấu trúc dữ liệu nhỏ mà có một mục đích rất cụ thể. Ví dụ, một thuộc tính được sử dụng để lưu tên file, và một thuộc tính khác được sử dụng để lưu nội dung của file. Hình 11.1 biểu diễn layout cơ bản của một MFT entry ở đó có một vài thông tin header và 3 thuộc tính.
Microsoft gọi mỗi entry trong bảng là một file record, nhưng trong bài viết chúng ta gọi mỗi entry là MFT entry. Mỗi entry được gán cho một địa chỉ dựa trên vị trí của nó trong bảng, bắt đầu từ 0. Đến nay, tất cả các entries có kích thước là 1024 bytes, nhưng kích thước chính xác được định nghĩa trong boot sector.

Giống như mọi thứ trong NTFS, MFT là một file. Vậy thì MFT cũng có một entry cho chính nó. Entry đầu tiên trong bảng được đặt tên là $MFT, và nó mô tả vị trí trên đĩa của MFT. Thực tế, đó là nơi duy nhất mà ở đó vị trí của MFT được mô tả. Vị trí bắt đầu của MFT được xác định trong boot sector mà thường xuyên được đặt trong sector đầu tiên của file system. Bạn có thể nhìn thấy trong Hình 11.2 ở đó boot sector được sử dụng để tìm MFT entry đầu tiên, entry này cho ta thấy MFT được phân mảnh và đi từ clusters 32 tới 34 và 56 tới 58. Giống như FAT, NTFS sử dụng clusters để nhóm các sectors liên tiếp lại với nhau.
Theo Microsoft, MFT khởi đầu nhỏ nhất có thể và mở rộng khi nhiều entries được cần tới. Theo lý thuyết, một OS có thể tạo một lượng "cứng" các entries khi file system được tạo, nhưng Microsoft cho phép dễ dàng tạo file system lớn hơn khi nhiều không gian được thêm vào từ việc mở rộng volume (volume spanning). Microsoft không xóa đi các MFT entries mà chúng đã tạo.

MFT Entry Contents
Kích thước của mỗi MFT được định nghĩa trong boot sector, nhưng tất cả các versions của Windows sử dụng kích thước là 1024 bytes. 42 bytes đầu tiên của cấu trúc dữ liệu chứa 12 fields, và 982 bytes còn lại là không được cấu trúc và có thể được fill với các attributes. Bạn có thể nghĩ MFT entry như là một cái hộp lớn được sử dụng để lưu tài sản của bạn. Phía bên ngoài hộp là thông tin cơ bản, ví dụ như là tên của bạn và địa chỉ. Thông tin cơ bản tương đương với các trường được gán cứng của MFT entry. Phía bên trong hộp ban đầu thì trống rỗng, nhưng nó có thể được sử dụng để lưu bất cứ thứ gì miễn là nó ở trong một container nhỏ hơn hộp. Điều này tương tự như cách một MFT entry có một kiến trúc bên trong và nó chứa một vài attributes mà chứa thông tin xác định.

Trường đầu tiên trong MFT entry là signature, và một standard entry sẽ có một chuỗi ASCII "FILE.". Nếu một lỗi được tìm ra trong entry này, nó có thể có một chuỗi là "BAAD." Cũng có một trường flag để nhận diện xem entry đang được sử dụng và entry là cho một thư mục. Trạng thái cấp phát của MFT entry có thể được xác đinhj từ $BITMAP attribute trong $MFT file.

Nếu một file không thể fit các attributes của nó trong một entry, nó có thể sử dụng nhiều entries. Khi điều này xảy ra, entry đầu tiên được gọi là base file record, hay là base MFT entry, và mỗi entries phía sau chứa địa chỉ của base entry trong một trong các trường gán cứng của nó.

MFT Entry Addresses
Mỗi MFT entry được đánh địa chỉ tuần tự sử dụng một giá trị 48-bit, và entry đầu tiên có địa chỉ là 0. Địa chỉ MFT cực đại thay đổi theo sự lớn lên của MFT và được xác định bang cách chia kích thước của mỗi entry cho $MFT. Microsoft gọi địa chỉ tuần tự này là file number.

Mỗi MFT entry còn có một số tuần tự (sequence number) 16-bit và được tăng lên khi entry này được cấp phát. Ví dụ, xét MFT entry 313 với một sequence number là 1. File mà cấp phát entry 313 bị xóa, và entry này được tái cấp phát tới một file mới. Khi entry này được tái cấp phát, nó có một sequence number mới là 2. MFT entry và sequence number được kết hợp, với sequence number là 16 bits cao , để tạo nên một file reference address có độ dài 64-bit, như trong Hình 11.3
NTFS sử dụng file reference address để refer tơis các MFT entries bởi vì sequence number là cho việc xác định xác định khi một file system trong trạng thái lỗi (corrupt state) dễ dàng hơn. Ví dụ, nếu hệ thống crash tại một vài điểm trong khi các cấu trúc dữ liệu khác nhau cho một file đang được cấp phát, sequence number có thể xác định một cấu trúc dữ liệu có chứa một MFT entry address hay không bởi vì file trước đó đã sử dụng nó hoặc nó là một phần của file mới. Chúng ta cũng có thể sử dụng nó để khôi phục nội dung bị xóa. Ví dụ, nếu chúng ta có một cấu trúc dữ liệu chưa được cấp phát với một file reference number trong nó, chúng ta có thể xác định MFT entry được tái cấp phát từ khi cấu trúc dữ liệu này sử dụng nó. Sequence number có thể hữu dụng trong suốt quá trình điều tra.

File System Metadata Files
Bởi vì mọi byte trong volume đều được cấp phát tới một file, có sự tồn tại của các files lưu dữ liệu quản trị file system (filesystem's administrative data). Microsoft gọi những files này là metadata files, nhưng điều này có thể gây ra nhầm lẫn bởi vì chúng ta có refer tới file metadata. Chúng ta sẽ tạm gọi những files mang dữ liệu quản trị này là file system metadata files.

Microsoft dành riêng 16 MFT entries đầu tiên cho các file system metadata files. Các entries được dự trữ mà không được sử dụng ở trong một trạng thái được cấp phát (allocated state) và chỉ có những thông tin tổng quát. Mọi file system metadata file được liệt kê trong root directory, mặc dù chúng thường ẩn đi với hầu hết users. Tên của mỗi file system metadata file bắt đầu với "$", và kí tự đầu tiên được viết hoa. Table 11.1 liệt kê các file system metadata cùng với description của chúng để tiện cho việc tham khảo.
 

MFT Entry Attribute Concepts
Một MFT entry có một kiến trúc nhỏ bên trong và hầu hết được sử dụng để lưu các attributes , đầy là các cấu trúc dữ liệu mà lưu một kiểu dữ liệu chỉ định. Có nhiều kiểu attributes, và mỗi attribute có kiến trúc bên trong của riêng nó. Ví dụ, có các attribute cho tên file, thời gian, ngày tháng và thậm chí là nội dung của nó. Đó là một trong những điểm khác biệt của NTFS so với các file system khác. Hầu hết các file systems tồn tại để đọc và ghi nội dung file, nhưng NTFS tồn tại để đọc và ghi các attributes, một trong các attribute đó là nội dung file.
Xét một điều tương tự trước đây một MFT entry như là một hộp lớn mà ban đầu trống rỗng bên trong. Các attributes tương tự như những hộp nhỏ bên trong hộp lớn mà ở đó các hộp nhỏ có thể là bất cứ hình thù nào để lưu đối tượng. Ví dụ, một chiếc mũ có thể được lưu trong một hộp ngắn, và một poster có thể được lưu trong một hộp dài.
Trong khi mỗi kiểu của attribute lưu một kiểu dữ liệu khác nhau, tất cả các attributes có 2 phần: header và content. Hình 11.4 thể hiện một MFT entry với 4 cặp header và content. Header là chung và chuẩn đối với tất cả các attributes. Content là cụ thể đối với kiểu attribute và có thể có bất cứ kích thước nào. Nếu bạn nghĩ về một điều tương tự như những cái hộp, luôn luôn có những thông tin cơ bản giống nhau phía ngoài mỗi hộp nhỏ, nhưng hình dáng của mỗi hộp có thể khác nhau.

 
Attribute Headers
Attribute header nhận diện kiểu của attribute, kích thước của nó, và tên của nó. Nó cũng có các flags để nhận dạng nếu giá trị này được nén hoặc được mã hóa. Attribute type là một số nhận dạng dựa trên kiểu dữ liệu. Một MFT entry có thể có nhiều attributes của cùng một kiểu.
Một vài attributes có thể được một name và nó được lưu với định dạng UTF-16 Unicode trong attribute header. Một attribute còn có một giá trị định dạng được gán cho nó mà là duy nhất đối với MFT entry đó. Nếu một entry có nhiều hơn một attribute của cùng một kiểu, identifier này có thể được sử dụng để phân biệt giữa chúng.
 
Attribute Content
Content của attribute có thể có bất cứ định dạng và kích thước nào. Ví dụ, một trong số các attributes được sử dụng để lưu content của một file, vì vậy nó có thể có kích thước là một vài MB hoặc một vài GB. Vấn đề là không thực tế khi lưu lượng dữ liệu như thế này trong một MFT entry, những gì chỉ có kích cỡ là 1024 bytes.
 
Để giải quyết vấn đề này, NTFS cung cấp 2 vị trí mà attribute content có thể được lưu. Một resident attribute lưu content của nó trong MFT entry với attribute header. Điều này thực hiện được đối với chỉ các attributes nhỏ. Một non-resident attribute lưu content của nó tron một external cluster trong file system. Header của attribute nhận diện rằng attribute là resident hay non-resident. Nếu một attribute là resident, content sẽ lập tức theo sau header. Nếu attribute là non-resident, header sẽ đưa cho các cluster addresses. Trong Hình 11.5 chúng ta thấy ví dụ MFT entry mà chúng ta thấy trước đây, nhưng attribute thứ 3 là quá lớn đê fit trong MFT, và nó cấp phát cluster 829.
Non-resident attributes được lưu trong các cluster runs, đây là các clusters liên tiếp và run được document sử dụng địa chỉ cluster băt đầu (starting cluster address) và chiều dài run (run length). Ví dụ, nếu một attribute cấp phát tới các clusters 48, 49, 50, 51 và 52, nó phải có một run bắt đầu ở cluster 48 với length là 5. Nếu attribute này cũng cấp phát tới các clusters 80 và 81, nó có một run thứ 2 mà bắt đầu ở cluster 80 với length là 2. Run thứ 3 bắt đầu tại cluster 56 và có length là 4. Bạn có thể thấy trong Hình 11.6
NTFS sử dụng các thuật ngữ Logical Cluster Number (LCN) (giống như logical file system address) và Virtual Cluster Number (VCN) (giống như logical file address) để biểu diễn các địa chỉ.

Standard Attribute Types
Chúng ta đã nói về các thuật ngữ chung cho các kiểu attribute. Bây giờ chúng tôi sẽ nói về những thứ cơ bản của một vài standard attributes.

Như đã được đề cập trước đây, một số (number) được định nghĩa cho mỗi kiểu của attribute, và Microsoft sắp xếp các attributes trong một entry sử dụng số này. Các standard attributes có một giá trị kiểu (type value) mặc định được gán cho chúng, nhưng chúng ta sẽ thấy sau này là nó có thể được định nghĩa lại trong $AttrDef file system metadata file. Ngoài số này ra, mỗi attribute type có một name, và name này là in hoa bắt đầu với "$". Một vài kiểu attribute mặc định và identifiers của chúng có trong Table 11.2. Không phải mọi attribute types và identifiers sẽ tồn tại cho mọi file.
Gần như mọi allocated MFT entry có một $FILE_NAME và một $STANDARD_INFORMATION type attribute. Một ngoại lệ là các non-base MFT entries. Attribute $FILE_NAME chứa tên file, kích thước, và thông tin thời gian. $STANDARD_INFORMATION attribute chứa thông tin về thời gian, quyền sở hữu (ownership), và security. Attribute sau tồn tại đối với mọi file và directory bởi vì nó chứa dữ lieu cần để thực thi data security và các hạn mức (quotas). Trong một nghĩa trừu tượng, không có dữ liệu quan trọng trong attribute này, nhưng các application-level features của file system yêu cầu phải có nó ở đó. Cả 2 attributes này luôn luôn là resident.

Mọi file có một $DATA attribute, trong đó có file content. Nếu content có kích thước vượt quá 700 bytes, nó trở thành non-resident và được lưu trong các external clusters. Khi một file có nhiều hơn một $DATA attribute, các attributes bổ sung thỉnh thoảng được đề cập tới như là alternate data streams (ADS). $DATA attribute mặc định được tạo khi một file được tạo không có một name liên kết với nó, nhưng các $DATA attributes bổ sung phải có một name. Chú ý rằng attribute name là khác với type name. Ví dụ, $DATA là attribute type, và attribute's name có thể là "fred". Một vài tools, bao gồm The Sleuth Kit (TSK) , sẽ gán tên "$Data" cho $DATA attribute mặc định.

Mọi directory có một $INDEX_ROOT attribute mà chứa thông tin về các files và các subdirectories mà được đặt trong nó. Nếu directory quá lớn, $INDEX_ALLOCATION và $BITMAP attributes còn được sử dụng để lưu thông tin. Rối rắm hơn nữa là khi một directory có một $DATA attribute ngoài $INDEX_ROOT attribute. Hay nói cách khác, một directory có thể chứa cả file content và một danh sách các files của nó và các subdirectories. $DATA attribute có thể lưu bất cứ content nào mà một ứng dụng hay một user muốn lưu ở đó. $INDEX_ROOT và $INDEX_ALLOCATION attributes cho một directory thường có name "$I30."

Figure 11.7. cho ta thấy ví dụ MFT entry mà chúng ta đã sử dụng trước đó, và các attributes của nó có những names và types. Nó có 3 standard file attributes. Trong ví dụ này, tất cả các attributes là resident.

Other Attribute Concepts
Trong những phần trước chúng ta đã nhắc đến các khái niệm cơ bản mà được áp dụng cho tất cả các NTFS attributes. Mặc dù không phải mọi attribute đều là cơ bản, và phần này chúng ta sẽ đề cập tới các khái niệm nâng cao hơn. Cụ thể là, chúng ta xem coi điều gì sẽ xảy ra khi một file có quá nhiều attributes và xem các cách thức mà các contents của một attribute được nén (compressed) và được mã hóa (encrypted).

Base MFT entries
Một file có có tới 65,536 attributes (bởi vì indentifier có 16 bit), vì vậy có thể cần nhiều hơn một MFT entry để lưu tất cả attribute headers (thậm chí non-resident attributes cần các header của chúng ở trong MFT entry). Khi các MFT entries bổ sung được cấp phát cho một file, MFT entry ban đầu trở thành base MFT entry . Các non-base entries sẽ có base entry's address trong một trong những trường của MFT entry.

Base MFT entry sẽ có một $ATTRIBUTE_LIST type attribute mà chứa một danh sách với mỗi file's attributes và MFT address có thể được tìm thấy ở đây. Các non-base MFT entries không có $FILE_NAME và $STANDARD_INFORMATION attributes trong chúng.

Sparse Attributes
NTFS có thể giảm lượng không gian được cần bởi một file thông qua việc lưu một vài non-resident $DATA attribute như là sparse. Một sparse attribute là một attribute mà trong đó các clusters mà chứa toàn zero không được ghi lên đĩa. Thay vào đó, một run đặc biệt được tạo ra cho các zero clusters. Thông thường, một run chứa vị trí bắt đầu cluster (starting cluster location) và kích thước, nhưng một sparse run chỉ chứa kích thước và không có starting location. Cũng có một flag mà ám chỉ rằng một attribute là sparse.

Ví dụ, xét một file mà nên chiếm 12 clusters. 5 clusters đầu tiên là non-zero, 3 clusters tiếp theo chứa zero, và 4 clusters cuối cùng là non-zero. Khi lưu như một attribute thông thường , một run có độ dài 12 được tạo cho file, như trong Figure 11.8(A). Khi lưu như một sparse attribute, 3 runs được tạo và chỉ 9 clusters được cấp phát, như ta có thể thấy trong Figure 11.8(B)

Không có nhận xét nào:

Đăng nhận xét