
Análise forense de memória Linux com zero dependências, utilizando BTF embutido no kernel e kallsyms para análise de memória com conhecimento de tipos, sem informações de depuração externas.
mquire, um trocadilho com as palavras memory e inquire, é uma ferramenta de consulta de memória inspirada pelo osquery.
mquire pode analisar snapshots de memória do kernel Linux sem precisar de símbolos de depuração externos.
Tudo o que é necessário para a análise já está incorporado no próprio dump de memória. Isso significa que você pode analisar:
Requisitos de versão do kernel:
scripts/kallsyms.c)mquire analisa a memória do kernel lendo dois tipos de informações que estão embutidas nos kernels Linux modernos:
/proc/kallsyms)Ao combinar informações de tipo com localizações de símbolos, mquire pode encontrar e ler estruturas de dados complexas do kernel, como:
Isso torna possível extrair arquivos diretamente do cache de arquivos do kernel, mesmo que tenham sido excluídos do disco.
O scanner Kallsyms depende do formato de dados de scripts/kallsyms.c no código-fonte do kernel. Se versões futuras do kernel mudarem este formato, as heurísticas do scanner podem precisar de atualizações.
mquire fornece tabelas SQL para consultar diferentes aspectos do sistema ou do estado da própria ferramenta.
mquire não é um banco de dados. Cada consulta reconstrói estruturas de dados do kernel varrendo a memória e seguindo ponteiros. Não há índices pré-computados ou resultados em cache: cada acesso a uma tabela é uma travessia de dados do kernel. Use
AS MATERIALIZEDpara evitar varreduras redundantes (consulte Query Optimization), e forneça restrições comotaskao consultar tabelas por processo comotask_open_filesememory_mappingspara limitar a varredura a um único processo.
Princípio de design: endereços virtuais como chaves de junção. As tabelas usam
virtual_address(o endereço do kernel da estrutura de dados subjacente) como a chave de junção canônica: nãopidou outros identificadores visíveis ao usuário. Isso é intencional, porque o mesmo PID pode aparecer várias vezes em diferentes fontes de descoberta e tarefas raiz, enquanto um endereço virtual identifica exclusivamente um objeto específico do kernel. Tanto as tabelas SQL quanto a APILinuxOperatingSystemsubjacente são construídas em torno desta convenção.
/proc/kallsyms)dmesg)task para análise direcionada, ou consulte todas as tarefas de uma vez)task para análise direcionada, ou consulte todas as tarefas de uma vez)task, então faça um JOIN com tasks/processes (ex: JOIN task_capabilities c ON c.task = p.virtual_address).task.mem de um objeto de módulo do kernel. Requer uma restrição kernel_module, então faça um JOIN com kernel_modules (ex: JOIN kernel_module_mem_entries r ON r.kernel_module = m.virtual_address).struct ftrace_ops, percorridos a partir do símbolo ftrace_ops_list por padrão. Restrinja virtual_address para ler um único nó, ou start_vaddr (opcionalmente limitado por end_vaddr) para percorrer a partir de um nó arbitrário.mquire fornece três comandos principais:
mquire shell - Iniciar um shell SQL interativo para consultar snapshots de memóriamquire query - Executar uma única consulta SQL e exibir resultados (suporta formato JSON ou tabela)mquire command - Executar comandos personalizados em snapshots de memória (ex.: .task_tree, .system_version, .dump)mquire fornece comandos especiais prefixados com um ponto (.) para distingui-los de consultas SQL.
Estes comandos funcionam no shell interativo e com mquire query:
.tables - Listar todas as tabelas disponíveis.schema - Mostrar esquema de todas as tabelas.schema <tabela> - Mostrar esquema de uma tabela específica.commands - Listar todos os comandos personalizados disponíveis.exit - Sair do shell interativo (apenas shell)Estes comandos funcionam no shell interativo e com mquire command:
Use --help com qualquer comando para ver opções disponíveis e informações de uso. Por exemplo: .task_tree --help
.system_versionExibir informações da versão do sistema operacional.
Este é um comando de conveniência equivalente a SELECT * FROM os_version, mas com saída formatada.
.task_treeExibir uma árvore hierárquica de processos e threads em execução, semelhante ao comando pstree no Linux.
Opções:
--show-threads - Incluir threads além dos processos. Quando ativado, exibe tanto TGID quanto TID para cada entrada.--use-real-parent - Usar o campo real_parent em vez de parent para construir a estrutura da árvore. O campo real_parent mostra o processo pai original antes de qualquer reparentização (útil para rastrear cadeias de criação de processos mesmo após os processos pais terem saído).