
Zero-dependency Linux memory forensics, sfruttando BTF e kallsyms incorporati nel kernel per un'analisi della memoria type-aware senza informazioni di debug esterne.
mquire, un gioco di parole tra memory e inquire, è uno strumento di interrogazione della memoria ispirato a osquery.
mquire può analizzare snapshot della memoria del kernel Linux senza richiedere simboli di debug esterni.
Tutto ciò che serve per l'analisi è già incorporato nel dump di memoria stesso. Questo significa che puoi analizzare:
Requisiti di versione del kernel:
scripts/kallsyms.c)mquire analizza la memoria del kernel leggendo due tipi di informazioni incorporate nei kernel Linux moderni:
/proc/kallsyms)Combinando le informazioni sui tipi con le posizioni dei simboli, mquire può trovare e leggere strutture dati complesse del kernel come:
Ciò rende possibile estrarre file direttamente dalla cache dei file del kernel, anche se sono stati eliminati dal disco.
Lo scanner Kallsyms dipende dal formato dei dati di scripts/kallsyms.c nel sorgente del kernel. Se le future versioni del kernel modificano questo formato, le euristiche dello scanner potrebbero dover essere aggiornate.
mquire fornisce tabelle SQL per interrogare diversi aspetti del sistema o dello stato dello strumento stesso.
mquire non è un database. Ogni query ricostruisce le strutture dati del kernel scansionando la memoria e seguendo i puntatori. Non ci sono indici precalcolati o risultati memorizzati nella cache: ogni accesso a una tabella è una traversata dei dati del kernel. Usa
AS MATERIALIZEDper evitare scansioni ridondanti (vedi Query Optimization) e fornisci vincoli cometaskquando interroghi tabelle per-processo cometask_open_filesememory_mappingsper limitare la scansione a un singolo processo.
Principio di progettazione: indirizzi virtuali come chiavi di join. Le tabelle usano
virtual_address(l'indirizzo del kernel della struttura dati sottostante) come chiave di join canonica, nonpido altri identificatori visibili all'utente. Questa è una scelta intenzionale, perché lo stesso PID può apparire più volte in diverse fonti di scoperta e task radice, mentre un indirizzo virtuale identifica univocamente un oggetto specifico del kernel. Sia le tabelle SQL che l'API sottostanteLinuxOperatingSystemsono costruite attorno a questa convenzione.
/proc/kallsyms)dmesg)task per un'analisi mirata, o interroga tutti i task contemporaneamente)task per un'analisi mirata, o interroga tutti i task contemporaneamente)task, quindi uniscilo a tasks/processes (es. JOIN task_capabilities c ON c.task = p.virtual_address).task.mem da un oggetto modulo del kernel. Richiede un vincolo kernel_module, quindi uniscilo a kernel_modules (es. JOIN kernel_module_mem_entries r ON r.kernel_module = m.virtual_address).struct ftrace_ops, percorso dal simbolo ftrace_ops_list per impostazione predefinita. Vincola virtual_address per leggere un singolo nodo, o start_vaddr (opzionalmente delimitato da end_vaddr) per partire da un nodo arbitrario.mquire fornisce tre comandi principali:
mquire shell - Avvia una shell SQL interattiva per interrogare snapshot di memoriamquire query - Esegue una singola query SQL e restituisce i risultati (supporta formato JSON o tabella)mquire command - Esegue comandi personalizzati su snapshot di memoria (es. .task_tree, .system_version, .dump)mquire fornisce comandi speciali con prefisso punto (.) per distinguerli dalle query SQL.
Questi comandi funzionano nella shell interattiva e con mquire query:
.tables - Elenca tutte le tabelle disponibili.schema - Mostra lo schema di tutte le tabelle.schema <tabella> - Mostra lo schema di una tabella specifica.commands - Elenca tutti i comandi personalizzati disponibili.exit - Esce dalla shell interattiva (solo shell)Questi comandi funzionano nella shell interattiva e con mquire command:
Usa --help con qualsiasi comando per vedere le opzioni disponibili e le informazioni sull'uso. Ad esempio: .task_tree --help
.system_versionMostra le informazioni sulla versione del sistema operativo.
Questo è un comando di comodità equivalente a SELECT * FROM os_version, ma con output formattato.
.task_treeMostra un albero gerarchico di processi e thread in esecuzione, simile al comando pstree su Linux.
Opzioni:
--show-threads - Include i thread oltre ai processi. Quando abilitato, mostra sia TGID che TID per ogni voce.--use-real-parent - Usa il campo real_parent invece di parent per costruire la struttura ad albero. Il campo real_parent mostra il processo genitore originale prima di qualsiasi riassegnazione (utile per tracciare le catene di creazione dei processi anche dopo l'uscita dei processi genitori).