Descritores de segurança ($Secure:$SDS)¶
O que é o $SDS¶
Todo arquivo e diretório no NTFS tem um descritor de segurança: seu proprietário, seu grupo primário, uma
DACL (quem pode fazer o quê com ele) e uma SACL (quais acessos são auditados e seu rótulo de integridade).
O NTFS mantém cada descritor distinto uma única vez, no fluxo $SDS do arquivo $Secure (entrada 9 da MFT),
e lhe atribui um ID de segurança. O $STANDARD_INFORMATION de um arquivo registra apenas esse ID de segurança: a
coluna SID de parse-ntfs mft. O $SDS o converte em um proprietário e ACLs.
O $SDS é organizado em blocos de 256 KiB, cada um seguido de uma cópia de si mesmo (seu espelho). Cada entrada tem um hash do
seu descritor, que o NTFS usa para encontrar um descritor já existente ($SDH), e o
ID de segurança (indexado pelo $SII).
Melhor conclusão: os arquivos cujo SID nomeia um
descritor tinham, quando seu registro no $MFT foi gravado pela última vez, esse proprietário e essas ACLs. O proprietário
de um arquivo geralmente é a conta que o criou, mas um administrador, um instalador ou um programa
que assuma a propriedade pode alterá-lo.
Localização e coleta¶
Colete-o com uma ferramenta forense capaz de acesso bruto; as coletas normalmente o nomeiam $Secure_$SDS, pois :
não pode fazer parte de um nome de arquivo. Colete junto o $MFT do mesmo volume.
Cuidados para o analista¶
- Um proprietário é um SID. Somente SIDs conhecidos (
NT AUTHORITY\SYSTEM,BUILTIN\Administrators,NT SERVICE\TrustedInstaller, …) e as contas internas de uma máquina ou domínio (-500Administrator, …) são nomeados. Resolva os demais com oSAMdo host (contas SAM), sua lista de perfis (Informações do sistema) ou o domínio. - Um descritor é compartilhado por todos os arquivos com o mesmo proprietário e as mesmas ACLs e geralmente permanece no
$SDSdepois que esses arquivos são excluídos. Um descritor sem arquivos no$MFTnão é, por si só, um arquivo excluído. - Uma ACE não é um histórico de acessos. A DACL diz quem pode acessar um arquivo; os logs de eventos e outros artefatos dizem quem acessou. As entradas de auditoria da SACL descrevem a configuração, não o que foi registrado.
- As ACEs são listadas na ordem em que aparecem na ACL. O Juntei não calcula o acesso efetivo: entradas de negação, herança, associação a grupos, privilégios e os direitos implícitos do proprietário são todos relevantes.
DACLeSACLescrevem cada ACE como oicaclsfaz.SDDLrepresenta as permissões suportadas, com máscaras em hexadecimal e contas como SIDs. Não é uma cópia byte a byte do descritor binário; texto condicional não representável o deixa vazio e é diagnosticado.
Analisar com o Juntei¶
Usage: juntei parse-ntfs secure-sds <INPUT> [OPTIONS]
Input:
-d, --directory <DIR> Recursively find $SDS streams (with $SDS in their name, or starting with an $SDS entry)
-f, --file <FILE> Parse one $Secure:$SDS stream (often exported as $Secure_$SDS)
Output:
-o, --output <FILE> Save every security descriptor
-t, --output-type <TYPE> csv, json, or jsonl
juntei parse-ntfs secure-sds -f '$Secure_$SDS'
juntei parse-ntfs secure-sds -d evidence/ -o sds.csv
juntei parse-ntfs secure-sds -f '$Secure_$SDS' -t jsonl
O resumo conta os descritores e lista seus proprietários, com quantos descritores cada um possui, os descritores com DACL NULL (nenhuma restrição) e quaisquer danos.
Campos de saída CSV¶
| Campo | Interpretação |
|---|---|
SourcePath |
Arquivo de entrada. |
SecurityID |
O ID de segurança: faça a junção com o SID de parse-ntfs mft do mesmo volume. |
Hash |
O hash registrado com o descritor. |
EntryOffset |
Onde a entrada está no fluxo. |
FromMirror |
True para uma cópia lida do bloco espelho: uma que difere de sua entrada (listada depois dela) ou a cópia de uma entrada danificada. |
Size |
O tamanho da entrada, incluindo seu cabeçalho de 20 bytes. |
Owner, OwnerName |
O SID do proprietário e seu nome, se for conhecido. |
Group, GroupName |
O SID do grupo primário e seu nome, se for conhecido. O Windows não o usa em verificações de acesso. |
Control |
As flags de controle do descritor: SE_DACL_PRESENT, SE_DACL_PROTECTED (herança bloqueada), SE_DACL_AUTO_INHERITED, … unidas por |. |
DACL-ACE-Count, DACL |
As entradas da DACL, separadas por ;. Vazio se não houver DACL; NULL DACL: no restriction se o descritor conceder tudo a todos. |
SACL-ACE-Count, SACL |
As entradas da SACL: entradas de auditoria, o rótulo de integridade obrigatória, rótulos de confiança de processo e atributos de recurso. |
SDDL |
O descritor inteiro em SDDL. Vazio somente se algo nele não for decodificado. |
Problems |
Um hash que não corresponde ao descritor, partes que não podem ser decodificadas, ACEs de tipo desconhecido. |
Cada entrada de DACL e SACL é escrita como o icacls a escreve: a conta, o tipo, se não for
uma entrada de permissão, as flags de herança e os direitos.
| Parte | Significado |
|---|---|
| Conta | O nome conhecido ou o SID. |
(DENY), (AUDIT), (ACCESS_ALLOWED_CALLBACK), … |
O tipo da ACE, quando não é uma entrada de permissão. Um rótulo obrigatório não tem tipo exibido. |
(I) |
Herdada do diretório pai. |
(OI), (CI), (IO), (NP) |
Herdada por arquivos (herança de objeto), por diretórios (herança de contêiner), somente por eles e não por este objeto (somente herança) e apenas um nível abaixo (sem propagação). |
(SA), (FA) |
Uma entrada de auditoria para acesso bem-sucedido ou com falha. |
(F), (M), (RX), (R), (W) |
Controle total, modificação, leitura e execução, leitura, gravação. |
(RD,WD,AD,…) |
Direitos específicos, nos demais casos: ler dados, gravar dados, acrescentar dados, ler e gravar atributos estendidos (REA, WEA), executar (X), excluir filho (DC), ler e gravar atributos (RA, WA), excluir (DE), ler controle (RC), gravar DAC (WDAC), gravar proprietário (WO), sincronizar (S) e os direitos genéricos GA, GR, GW, GE. N significa nenhum acesso. |
(NW), (NR), (NX) |
A política de um rótulo obrigatório: sem gravação ascendente, sem leitura ascendente, sem execução ascendente. |
if (…) |
A condição de uma ACE de callback, como (WIN://SYSAPPID Contains "…"): a entrada se aplica somente aos processos para os quais ela é verdadeira. O Windows as usa para conceder acesso a pacotes de contêiner de aplicativo. |
Os rótulos de confiança de processo e os atributos de recurso mostram sua máscara em hexadecimal, e um atributo
de recurso mostra sua declaração (("IMAGELOAD",TU,0x0,1)).
JSON/JSONL têm os mesmos campos e nomes, com números como números, null para valores vazios e
Problems como uma lista.
Estratégia de investigação¶
- Analise o
$MFTdo mesmo volume e faça a junção do seuSIDcom o desta saída: cada arquivo recebe seu proprietário e suas ACLs. - Examine os proprietários que são contas de usuário (
S-1-5-21-…): quais arquivos uma conta suspeita possui e quais contas possuem arquivos em diretórios do sistema. - Procure ACLs permissivas em diretórios a partir dos quais programas são executados ou carregados:
Everyone,Authenticated UsersouUsercom(F),(M)ou(W), e DACLs NULL. - Um descritor usado por apenas um arquivo, ou por um conjunto incomum de arquivos, pode revelar arquivos que foram criados ou alterados fora de uma instalação normal.
- Corrobore alterações de propriedade e de permissões com entradas do log de eventos Security (4670, 4663 com uma
SACL) e os registros
SECURITY_CHANGEdo Diário USN.
Mais detalhes¶
- Microsoft: descritores de segurança
- Microsoft Open Specifications: MS-DTYP (descritores de segurança, ACEs, expressões condicionais)
- Microsoft: formato de string do descritor de segurança (SDDL)
- Microsoft: icacls
- libfsntfs: documentação do formato NTFS (
$Secure) - ys-ntfs-parser (seu crate
secure)
Com saída estruturada no stdout (-t sem -o), os avisos de recuperação no nível do fluxo vão para o stderr, de modo que os pipes mantêm CSV/JSON/JSONL legíveis sem ocultar regiões danificadas ou recuperadas.