Navegadores web¶
O que são os bancos de dados dos navegadores¶
Os navegadores guardam seu histórico, downloads, cookies e entradas de formulários em bancos de dados SQLite no perfil de cada usuário. Os navegadores baseados no Chromium (Chrome, Edge, Brave, Opera, Vivaldi) e os baseados no Firefox usam cada um seus próprios arquivos e tabelas, mas registram os mesmos tipos de atividade:
- Histórico: as páginas visitadas, cada visita com seu horário, como o navegador chegou à página (endereço digitado, um link, um redirecionamento, um favorito) e, no Chromium, por quanto tempo a página ficou em primeiro plano.
- Downloads: a URL de onde veio um arquivo (e os redirecionamentos no caminho), onde ele foi salvo, seu tamanho, quando o download começou e terminou e se foi concluído.
- Cookies: os sites que os definiram, quando foram definidos e enviados pela última vez, e quando expiram.
- Histórico de formulários: valores digitados em formulários web e caixas de pesquisa, quantas vezes, e a primeira e a última vez.
A atividade do navegador costuma ser o registro mais direto do que um usuário fez: a página de phishing que ele seguiu, a ferramenta que baixou, o webmail que usou, os termos de pesquisa que digitou.
Melhor conclusão: o perfil do navegador registrou uma visita à URL no horário registrado, ou salvou o download no caminho registrado; o banco de dados não diz quem estava ao teclado.
Localização e coleta¶
%LOCALAPPDATA%\Google\Chrome\User Data\<Profile>\History
%LOCALAPPDATA%\Google\Chrome\User Data\<Profile>\Network\Cookies
%LOCALAPPDATA%\Google\Chrome\User Data\<Profile>\Web Data
%LOCALAPPDATA%\Microsoft\Edge\User Data\<Profile>\...
%LOCALAPPDATA%\BraveSoftware\Brave-Browser\User Data\<Profile>\...
%APPDATA%\Opera Software\Opera Stable\...
%APPDATA%\Mozilla\Firefox\Profiles\<profile>\places.sqlite
%APPDATA%\Mozilla\Firefox\Profiles\<profile>\cookies.sqlite
%APPDATA%\Mozilla\Firefox\Profiles\<profile>\formhistory.sqlite
<Profile> é Default, Profile 1, Profile 2 e assim por diante. O Chromium moveu Cookies para Network na
versão 96; as versões anteriores o mantêm ao lado de History. Até a versão 25, o Firefox guardava seus downloads em
downloads.sqlite; as versões posteriores os guardam em places.sqlite.
Colete todos os arquivos do perfil, e cada banco de dados com os arquivos ao lado dele que compartilham seu nome:
places.sqlite-wal, cookies.sqlite-wal, formhistory.sqlite-wal, History-journal.
Logs de escrita antecipada (WAL)
O Firefox mantém seus bancos de dados no modo de log de escrita antecipada (WAL): as alterações mais recentes ficam
apenas no arquivo -wal até que o navegador as copie para o banco de dados (um checkpoint). O Juntei lê cada banco
de dados com seu arquivo -wal, como o navegador faria. Sem ele, faltam visitas, cookies e entradas de formulários
recentes, e entradas excluídas no log ainda aparecem como ativas.
Entradas excluídas¶
Quando um navegador exclui o histórico, as linhas saem das tabelas, mas seus registros podem permanecer no espaço livre
do banco de dados, em sua lista de páginas livres (freelist) ou em versões mais antigas de suas páginas: no arquivo
-wal, ou no próprio arquivo do banco de dados quando um -wal substituiu essas páginas. O Juntei recupera deles
visitas, páginas, downloads e entradas de formulários excluídos, como linhas cujo Status é Deleted:
Confidenceindica o grau de certeza da correspondência do registro com sua tabela:Highpara um registro completo em que todos os valores têm o tipo de sua coluna,MediumouLowpara registros danificados ou registros que se encaixam em várias tabelas.RecoveredFromindica onde o registro estava: a área da página (uma célula, um freeblock, espaço não alocado, uma página livre), qual página e qual versão dela, e o deslocamento do registro na página. Os frames do WAL são numerados a partir de 0.LostColumnslista as colunas que um registro danificado não contém mais: seus campos ficam vazios.
Os navegadores excluem com o secure_delete do SQLite: o espaço liberado no banco de dados é zerado. O que pode ser
recuperado fica então principalmente em versões mais antigas das páginas: as que o arquivo -wal ainda contém, e as
cópias que o próprio arquivo do banco de dados guarda das páginas que um -wal substituiu, até o próximo checkpoint.
Copie o arquivo -wal com seu banco de dados, e faça isso antes que o navegador seja executado novamente.
Cuidados para o analista¶
- Os horários estão em UTC. O Chromium e o Firefox os registram com precisão de microssegundos; o histórico de formulários do Chromium, com precisão de segundos.
- Uma visita não significa que o usuário digitou ou clicou: redirecionamentos, frames e páginas abertas por outros
programas também são visitas. Leia
Transition,TypedeHidden. - O Chromium criptografa os valores dos cookies:
Valuefica vazio para eles. O Juntei não os descriptografa. - Uma linha
Removeddo histórico de formulários vem da tabelamoz_deleted_formhistorydo Firefox, que o Firefox para Android preenche para o Sync. O Firefox para desktop normalmente a deixa vazia. - Uma entrada excluída com confiança
Lowpode ser um fragmento de outro registro: confira-a com as linhas ativas e com as demais evidências. - A ausência de linhas excluídas não significa que nada foi excluído: espaço zerado e um checkpoint não deixam nada para recuperar. Cookies excluídos ainda não são recuperados.
- O conteúdo determina a família do navegador. Um caminho de perfil compatível especifica
Browsercomo Chrome ou Firefox; um caminho conflitante não altera a família. Caso contrário, usa-seChromium-based,Firefox-basedouSafari(Unknownse indeterminado).UsereProfilevêm do caminho e podem ser perdidos ao copiar arquivos. - Journals de rollback (
-journal) não são lidos. OWebCacheV01.datdo Internet Explorer e do Edge legado é lido peloparse-ese webcache: consulte Internet Explorer e Edge legado.
Analisar com o Juntei¶
Usage: juntei parse-sqlite browser <INPUT> [OPTIONS]
Input:
-d, --directory <DIR> Recursively find History, Cookies, Web Data, places.sqlite, ...
-f, --file <FILE> Parse one browser database (and its -wal file)
Output:
-o, --output <PATH> Directory of CSV tables, or JSON/JSONL file
-t, --output-type <TYPE> csv, json, or jsonl
juntei parse-sqlite browser -d Users -o browser-csv
juntei parse-sqlite browser -d Users -t jsonl \
| jq 'select(.Table == "Downloads") | {StartTime, URL, TargetPath, Browser, User}'
-d procura os arquivos pelo nome e identifica cada um pelas suas tabelas: um arquivo History de outro programa é
ignorado. -f lê um banco de dados independentemente do nome.
Tabelas de saída¶
O CSV cria quatro arquivos, cada um apenas com o cabeçalho quando não tem linhas. As linhas JSON e JSONL trazem Table
(History, Downloads, Cookies ou FormHistory) depois de SourceFile.
| Arquivo CSV | Conteúdo |
|---|---|
Browser-History.csv |
Visitas, ativas e excluídas; páginas excluídas cuja URL nenhuma página ativa tem. |
Browser-Downloads.csv |
Downloads, ativos e excluídos. |
Browser-Cookies.csv |
Cookies. |
Browser-FormHistory.csv |
Entradas de formulários, ativas e excluídas; registros de remoção do Firefox. |
Campos¶
Todas as tabelas começam com estes campos:
| Campo | Interpretação |
|---|---|
SourceFile |
O banco de dados do qual a linha foi lida. |
User |
O usuário do Windows em cujo perfil está o caminho (a pasta depois de Users). |
Browser |
Família pelo conteúdo, refinada por um caminho de perfil compatível. |
Profile |
O perfil do navegador: a pasta do banco de dados. |
Status |
Live, Deleted (recuperado) ou Removed (um registro de remoção do Firefox). |
Histórico¶
| Campo | Interpretação |
|---|---|
RecordType |
Visit, ou Page para uma página excluída cujas visitas também podem ter desaparecido. |
VisitTime |
Quando a visita começou (UTC). |
URL, Title |
A página e seu título, como vistos pela última vez. |
Transition |
Como o navegador chegou à página. Chromium: o tipo principal e depois seus qualificadores (LINK, TYPED, AUTO_BOOKMARK, FORM_SUBMIT, RELOAD, … com CHAIN_START, SERVER_REDIRECT, FROM_ADDRESS_BAR, …); Firefox: LINK, TYPED, BOOKMARK, EMBED, REDIRECT_PERMANENT, REDIRECT_TEMPORARY, DOWNLOAD, FRAMED_LINK, RELOAD. |
VisitDuration |
Segundos em que a página ficou em primeiro plano (Chromium; 0 quando não foi medido). |
VisitCount |
Total de visitas à página. |
Typed, TypedCount |
Se a URL chegou a ser digitada, e quantas vezes (Chromium). |
Hidden |
Oculta na lista do histórico: subframes, origens de redirecionamentos, erros. |
Frecency |
A classificação da página pelo Firefox para as sugestões da barra de endereços. |
VisitID, FromVisitID |
O ID de linha da visita e o da visita da qual ela veio (a página de referência, a origem do redirecionamento). O ID da visita fica vazio quando um registro recuperado o perdeu. |
LastVisitTime |
A última visita de uma página excluída (UTC). |
PageSource |
De onde vêm a URL e o título de uma visita excluída: Live (uma página ativa), Recovered (uma página excluída) ou NotFound. |
Confidence, RecoveredFrom, LostColumns |
Como uma entrada excluída foi recuperada; consulte Entradas excluídas. |
Downloads¶
| Campo | Interpretação |
|---|---|
StartTime, EndTime |
Quando o download começou e terminou (UTC). |
URL, RedirectChain |
De onde o arquivo veio, e todas as URLs no caminho (Chromium; -> entre elas no CSV). |
TargetPath, CurrentPath |
Onde o arquivo foi salvo (um URI file:// no Firefox), e onde foi gravado durante o download. |
ReceivedBytes, TotalBytes |
Bytes recebidos, e o tamanho do arquivo. |
State |
Complete, InProgress, Cancelled, Interrupted, Paused, Blocked ou Dirty (bloqueado como malware). |
DangerType |
O veredito do Chromium sobre o arquivo: 0 não perigoso, 1 tipo de arquivo perigoso, 2 URL perigosa, 3 conteúdo perigoso, 4 possivelmente perigoso, 5 incomum, 6 mantido pelo usuário, 7 host perigoso, 8 potencialmente indesejado, … |
InterruptReason |
Por que um download interrompido parou (Chromium; 0 quando não há motivo). |
Referrer, TabURL |
A página de referência, e a página na aba que iniciou o download. |
MimeType, Opened |
O tipo do arquivo como foi servido, e se ele foi aberto a partir do navegador (Chromium). |
FileDeletedByUser |
Se o usuário excluiu do disco o arquivo baixado pela lista de downloads do navegador (Firefox). |
DownloadID |
O ID de linha do download. Vazio quando um registro recuperado o perdeu. |
Cookies¶
| Campo | Interpretação |
|---|---|
Created, LastAccessed, Expires |
Quando o cookie foi definido e enviado pela última vez, e quando expira (UTC; Expires vazio para um cookie de sessão). |
Host, Name, Path |
O site a que o cookie se destina, seu nome e seu caminho. |
Value |
O valor como armazenado: vazio quando o Chromium o criptografou. |
Secure, HttpOnly, Persistent |
Enviado somente por HTTPS, oculto dos scripts, mantido entre sessões (Chromium). |
GoogleAnalytics |
Os campos decodificados de um cookie do Google Analytics (__utma, __utmb, __utmt, __utmz): horários de visita, sessões, e a origem da campanha e os termos de pesquisa. |
RowID |
O ID de linha do cookie. |
Histórico de formulários¶
| Campo | Interpretação |
|---|---|
FirstUsed, LastUsed |
Quando o valor foi inserido pela primeira e pela última vez (UTC). |
RemovedTime |
Quando a entrada foi removida, segundo um registro de remoção do Firefox (UTC). |
FieldName, Value |
O campo do formulário (email, q, a barra de pesquisa do Firefox: searchbar-history) e o que foi digitado. |
Count |
Quantas vezes o valor foi inserido. |
GUID |
O identificador da entrada no Firefox, que os registros de remoção citam. |
Sources |
De onde o Firefox salvou a entrada, nas versões que guardam essa informação (separadas por uma barra vertical no CSV). |
RowID |
ID da linha; vazio/null quando perdido na recuperação. Um zero realmente registrado permanece 0. |
Análise automática¶
O auto-parse grava as tabelas em BrowserActivity como Browser-History.csv, Browser-Downloads.csv,
Browser-Cookies.csv e Browser-FormHistory.csv (um único arquivo Browser.json ou Browser.jsonl com -t json ou
-t jsonl), junto com BrowserActivity/Browser-logs.txt. A linha do tempo combinada de -j inclui todas as linhas, com
Comp e o identificador de Artifact browser. -Z converte VisitTime, LastVisitTime, StartTime, EndTime,
Created, LastAccessed, Expires, FirstUsed, LastUsed e RemovedTime.