Sistemas de arquivos · Aula 2 de 8
Como os sistemas de arquivos armazenam dados: clusters, alocação, slack e espaço não alocado
12 min de leitura
Um sistema de arquivos transforma os setores brutos de um volume em arquivos com nomes. Ele armazena o conteúdo em unidades de tamanho fixo, registra quais unidades estão em uso e mantém metadados e nomes em estruturas separadas, cada uma das quais pode sobreviver ou ser apagada de forma independente. Entender isso permite que um perito explique por que um arquivo excluído é recuperável, de onde veio um fragmento antigo e o que esse fragmento pode ou não comprovar. Aulas posteriores aplicam esse modelo a NTFS, FAT, ext4 e APFS.
Uma estrutura de raciocínio: as cinco categorias de Carrier
Brian Carrier (Análise forense de sistemas de arquivos, 2005) organiza os dados de sistemas de arquivos em cinco categorias. O modelo se aplica a qualquer sistema de arquivos e leva você a perguntar a qual categoria pertence uma evidência.
| Categoria | O que contém | Exemplos |
|---|---|---|
| Sistema de arquivos | Organização e tamanho do sistema de arquivos como um todo | Setor de inicialização do NTFS, setor de inicialização do FAT (BPB), superbloco do ext4 |
| Conteúdo | As unidades de dados que contêm o conteúdo dos arquivos e seu estado de alocação | Clusters ou blocos, $Bitmap do NTFS, mapas de bits de blocos do ext4 |
| Metadados | Dados que descrevem um arquivo: tamanho, registros de data e hora, proprietário, onde seu conteúdo está armazenado | Registros da MFT do NTFS, inodes do ext4, campos de metadados de uma entrada de diretório do FAT |
| Nome de arquivo | Nomes e os diretórios que mapeiam nomes para metadados | Índices de diretório $I30 do NTFS, entradas de diretório do ext4, campos de nome do FAT |
| Aplicação | Recursos de que o sistema de arquivos não precisa para armazenar arquivos | $LogFile e $UsnJrnl do NTFS, journal do ext4, cotas de disco |
As categorias falham de forma independente. Um nome pode sobreviver depois que sua entrada de metadados foi reutilizada, uma entrada de metadados pode apontar para clusters que agora pertencem a outro arquivo, e o conteúdo pode sobreviver sem nome ou metadados. Muitos erros em relatórios decorrem de tratar evidências de uma categoria como prova de algo em outra.
Clusters, blocos e unidades de alocação
Um disco é endereçado em setores, geralmente de 512 bytes (algumas unidades usam setores de 4.096 bytes; unidades "512e" apresentam setores lógicos de 512 bytes sobre setores físicos de 4.096 bytes). Um sistema de arquivos agrupa um número fixo de setores consecutivos em um cluster (FAT, exFAT e NTFS), um bloco (ext4) ou, genericamente, uma unidade de alocação. O tamanho é definido na formatação e registrado na categoria sistema de arquivos. No NTFS, o setor de inicialização armazena os bytes por setor no offset 0x0B e os setores por cluster no offset 0x0D. Volumes NTFS normalmente usam clusters de 4.096 bytes, e o ext4 normalmente usa blocos de 4.096 bytes.
O cluster é a menor unidade que um sistema de arquivos pode atribuir a um arquivo, porque as estruturas de alocação controlam um estado por cluster; controlar cada setor ou byte as tornaria muito maiores e mais lentas. Portanto, um arquivo ocupa um número inteiro de clusters, mesmo quando tem apenas um byte. Seu tamanho lógico é o número de bytes que o arquivo contém. Seu tamanho físico (alocado) é o número de clusters × tamanho do cluster. A diferença é o slack de arquivo.
O NTFS tem uma exceção. Um arquivo muito pequeno pode ser armazenado como residente, dentro de seu registro da MFT, e nesse caso não usa nenhum cluster. A aula 1.3 aborda dados residentes.
Estruturas de alocação
Cada sistema de arquivos registra quais clusters estão em uso:
- NTFS usa
$Bitmap(registro 6 da MFT), que contém um bit por cluster (1 = alocado). O uso dos registros da MFT é controlado separadamente, no atributo$BITMAPde$MFTe no sinalizador de uso (0x0001) no cabeçalho de cada registro. - FAT12/16/32 usam a Tabela de Alocação de Arquivos, que tem uma entrada por cluster. 0 significa livre; outros valores indicam o próximo cluster da cadeia, o fim da cadeia ou um cluster defeituoso. As entradas do FAT32 têm 32 bits, dos quais os 28 bits menos significativos são usados. No FAT, a tabela é tanto o mapa de alocação quanto o registro de onde o conteúdo de cada arquivo está armazenado.
- exFAT usa um mapa de bits de alocação e usa a FAT principalmente para arquivos fragmentados.
- ext4 usa mapas de bits de blocos e mapas de bits de inodes para cada grupo de blocos.
O que "excluir" um arquivo geralmente faz
Na maioria dos sistemas de arquivos, excluir um arquivo altera o estado de alocação. Não apaga o conteúdo. Resultados típicos:
- NTFS: o sinalizador de uso no registro da MFT é desativado, os bits do arquivo em
$Bitmapsão definidos como 0 e a entrada é removida do índice do diretório pai. O registro geralmente mantém seus atributos, registros de data e hora e sequências de dados até ser reutilizado. - FAT: o primeiro byte da entrada de diretório é definido como 0xE5 e a cadeia do arquivo na FAT é definida como 0 (livre). A entrada de diretório geralmente ainda registra o tamanho e o cluster inicial (no FAT32, algumas implementações zeram seus 16 bits mais significativos), mas a cadeia que liga os clusters restantes deixa de existir.
- ext3/ext4: o inode e seus blocos são marcados como livres. As informações de localização dos blocos no inode também costumam ser apagadas, o que dificulta a recuperação a partir de metadados.
Em cada caso, o conteúdo permanece nos clusters até ser sobrescrito. Em unidades de estado sólido, o TRIM pode fazer com que blocos liberados retornem zeros na leitura, mesmo que nada novo tenha sido gravado. A aula 1.8 compara a recuperação a partir de metadados com o file carving.
Fragmentação
Um arquivo está fragmentado quando seus clusters não são contíguos; o NTFS registra os trechos como sequências de dados, e o FAT, como elos na cadeia de clusters. Com metadados intactos, isso não importa, porque cada sequência está listada. Sem metadados, importa: uma ferramenta de carving que pressupõe contiguidade unirá clusters não relacionados ao primeiro fragmento.
Slack de arquivo: slack de RAM e slack de unidade
O slack de arquivo (também chamado de slack de cluster) é o espaço entre o fim do tamanho lógico de um arquivo e o fim de seu último cluster. Ele tem duas partes:
- Slack de RAM vai do fim dos dados do arquivo até o fim do setor que os contém. O disco grava setores inteiros, então o sistema operacional precisa fornecer bytes para preenchê-lo. O nome vem de sistemas antigos, como o MS-DOS e as primeiras versões do Windows em FAT, que o preenchiam com o que estivesse no buffer de memória. As versões atuais do Windows gravam zeros nesse espaço; portanto, em um volume NTFS gravado por um sistema Windows moderno, espera-se que o slack de RAM esteja preenchido com zeros. Se encontrar slack de RAM com valores diferentes de zero, explique isso (um SO mais antigo, outro driver ou ferramenta, ou um sistema de arquivos diferente do NTFS), em vez de fazer suposições.
- Slack de unidade, também chamado de slack residual, corresponde aos setores inteiros no último cluster após o setor que contém o fim do arquivo. Eles não são gravados, portanto mantêm o que havia ali antes, muitas vezes um remanescente de um arquivo anterior excluído.
Se um arquivo diminuir posteriormente, seu próprio conteúdo anterior além do novo fim se torna slack.
Exemplo resolvido
Um arquivo tem tamanho lógico de 10.000 bytes. Ele está em um volume com clusters de 4.096 bytes e setores de 512 bytes (8 setores por cluster).
- Clusters necessários: 10.000 ÷ 4.096 = 2,44, arredondado para cima para 3 clusters.
- Tamanho alocado: 3 × 4.096 = 12.288 bytes.
- Slack de arquivo: 12.288 − 10.000 = 2.288 bytes.
- Dados no último cluster: 10.000 − (2 × 4.096) = 10.000 − 8.192 = 1.808 bytes.
- Setores usados nesse cluster: 1.808 ÷ 512 = 3 com resto 272. Isso corresponde a três setores completos, mais 272 bytes no quarto setor.
- Slack de RAM: 512 − 272 = 240 bytes, nos offsets 1.808–2.047 dentro do cluster.
- Slack de unidade: 8 − 4 = 4 setores inteiros, portanto 4 × 512 = 2.048 bytes, nos offsets 2.048–4.095.
- Verificação: 240 + 2.048 = 2.288, o que corresponde à etapa 3.
Para localizar essas regiões na imagem, considere um volume NTFS (o cluster 0 começa no primeiro setor do volume) que começa no setor 2.048, com o último cluster no cluster 120.000:
| Item | Cálculo | Offset em bytes na imagem |
|---|---|---|
| Início do volume | 2.048 × 512 | 1.048.576 |
| Início do cluster 120.000 | 1.048.576 + 120.000 × 4.096 | 492.568.576 |
| Início do slack de RAM | 492.568.576 + 1.808 | 492.570.384 |
| Início do slack de unidade | 492.568.576 + 2.048 | 492.570.624 |
Slack de volume e lacunas entre partições
Os dados também podem estar fora de qualquer sistema de arquivos.
- Slack de volume é o espaço entre o fim do sistema de arquivos e o fim do volume que o contém. Ele ocorre quando o tamanho do volume não é um múltiplo exato do tamanho do cluster, ou quando o sistema de arquivos foi criado com tamanho menor que sua partição ou a partição foi ampliada posteriormente.
- Lacunas entre partições são setores que nenhuma partição abrange. Exemplos são os setores entre a tabela de partições e a primeira partição (setores 1–2.047 em um disco MBR cuja primeira partição começa no setor 2.048), o espaço entre duas partições e o espaço após a última partição.
Essas áreas geralmente contêm zeros ou sobras de particionamentos anteriores; dados diferentes de zero nesses locais merecem explicação, porque ferramentas de ocultação os utilizam. A aula 1.1 mostra como localizá-las.
Espaço não alocado versus espaço livre
Espaço não alocado é o conjunto de clusters que a estrutura de alocação marca como não estando em uso. É um estado, não uma descrição do conteúdo. Espaço livre é a capacidade que o sistema operacional informa como disponível. Ele é derivado do mesmo estado, mas não diz nada sobre o conteúdo: "20 GB livres" podem ser 20 GB de dados excluídos recuperáveis. Em um relatório, diga "não alocado", nunca "vazio". O espaço não particionado é diferente de ambos, porque fica fora de qualquer sistema de arquivos.
O que cada área pode e não pode comprovar
| Área | Pode mostrar | Não pode mostrar por si só |
|---|---|---|
| Arquivo alocado | Conteúdo vinculado a um nome, registros de data e hora e um proprietário | Quem criou o conteúdo, a menos que outras fontes o confirmem |
| Arquivo excluído, metadados intactos | Nome anterior, tamanho, registros de data e hora, localização do conteúdo | Que o conteúdo ainda é o original, pois os clusters podem ter sido reutilizados |
| Slack de arquivo | Que os dados estavam no cluster antes da última gravação do arquivo atual, ou que foram colocados ali deliberadamente | Quando foram gravados, a qual arquivo pertenciam ou qual usuário os gravou |
| Espaço não alocado | Que os dados foram gravados nesse volume em algum momento | Quando, por quem ou sob qual nome, a menos que o conteúdo tenha seus próprios metadados internos |
| Slack de volume, lacunas entre partições | Que existem dados fora do sistema de arquivos | Como ou quando chegaram ali |
O conteúdo em slack e em espaço não alocado não tem metadados do sistema de arquivos. Qualquer data ou autor deve ser obtido do próprio conteúdo, como os metadados internos de um documento ou um registro de data e hora em uma linha de log, e deve ser corroborado.
Como as ferramentas expõem essas áreas
O Sleuth Kit tem comandos para cada categoria. fls -d lista nomes de arquivos excluídos (adicione -r para percorrer recursivamente, -p para caminhos completos e -o para o offset em setores da partição). istat mostra uma entrada de metadados. blkstat mostra se um cluster está alocado. ifind -d encontra a entrada de metadados que aponta para um determinado cluster. blkls extrai unidades de dados não alocadas por padrão (-A). Com -s, extrai slack, e com -e, extrai todas as unidades. Quando uma ocorrência de palavra-chave é encontrada na saída de blkls, blkcalc -u <unit> converte o número da unidade de volta para o endereço do cluster no volume original. O Autopsy mostra as mesmas áreas como visualizações de arquivos excluídos, arquivos virtuais "Unalloc" e arquivos -slack para cada arquivo.
Foco no exame: Espere calcular o tamanho alocado, o slack de arquivo, o slack de RAM e o slack de unidade a partir do tamanho de um arquivo, do tamanho do cluster e do tamanho do setor, além de converter um número de cluster em um offset em bytes. As questões também podem perguntar o que a exclusão altera em um determinado sistema de arquivos e o que o conteúdo em slack ou em espaço não alocado pode estabelecer sobre tempo e autoria.
Pontos principais
- As cinco categorias de Carrier (sistema de arquivos, conteúdo, metadados, nome de arquivo, aplicação) podem sobreviver ou ser perdidas de forma independente; portanto, identifique a categoria de cada evidência.
- O cluster é a menor unidade de alocação. O tamanho alocado de um arquivo é sua quantidade de clusters × tamanho do cluster, e a diferença em relação ao seu tamanho lógico é o slack de arquivo.
- A exclusão normalmente altera o estado de alocação e os metadados, e o conteúdo permanece até ser sobrescrito ou, em SSDs, possivelmente afetado pelo TRIM.
- O slack de RAM no Windows/NTFS moderno normalmente é preenchido com zeros. O slack de unidade consiste em setores não gravados que podem conter remanescentes de um arquivo anterior.
- Espaço não alocado é um estado, não ausência de conteúdo. O conteúdo encontrado ali ou no slack não pode ser datado nem ter sua autoria atribuída sem evidências independentes.