
Ohne Abhängigkeiten Linux-Speicherforensik, die kernel-eingebettetes BTF und kallsyms für typbewusste Speicheranalyse ohne externe Debug-Informationen nutzt.
mquire, ein Wortspiel aus den Wörtern memory und inquire, ist ein Speicher-Abfragewerkzeug, inspiriert von osquery.
mquire kann Linux-Kernel-Speicherabbilder analysieren, ohne dass externe Debugsymbole erforderlich sind.
Alles, was für die Analyse benötigt wird, ist bereits im Speicherabbild selbst eingebettet. Dies bedeutet, dass Sie Folgendes analysieren können:
Anforderungen an die Kernel-Version:
scripts/kallsyms.c-Format)mquire analysiert Kernel-Speicher, indem es zwei Arten von Informationen liest, die in modernen Linux-Kerneln eingebettet sind:
/proc/kallsyms)Durch die Kombination von Typinformationen mit Symbolpositionen kann mquire komplexe Kernel-Datenstrukturen finden und lesen, wie zum Beispiel:
Dies ermöglicht es, Dateien direkt aus dem Kernel-Dateicache zu extrahieren, selbst wenn sie von der Festplatte gelöscht wurden.
Der Kallsyms-Scanner hängt vom Datenformat aus scripts/kallsyms.c im Kernel-Quellcode ab. Wenn zukünftige Kernel-Versionen dieses Format ändern, müssen die Scanner-Heuristiken möglicherweise aktualisiert werden.
mquire bietet SQL-Tabellen, um verschiedene Aspekte des Systems oder den Zustand des Werkzeugs selbst abzufragen.
mquire ist keine Datenbank. Jede Abfrage rekonstruiert Kernel-Datenstrukturen, indem Speicher durchsucht und Zeigern gefolgt wird. Es gibt keine vorberechneten Indizes oder zwischengespeicherten Ergebnisse: Jeder Tabellenzugriff ist eine Traversierung von Kernel-Daten. Verwenden Sie
AS MATERIALIZED, um redundante Scans zu vermeiden (siehe Abfrageoptimierung), und geben Sie Einschränkungen wietaskan, wenn Sie prozessbezogene Tabellen wietask_open_filesundmemory_mappingsabfragen, um den Scan auf einen einzelnen Prozess zu beschränken.
Designprinzip: Virtuelle Adressen als Join-Schlüssel. Tabellen verwenden
virtual_address(die Kernel-Adresse der zugrunde liegenden Datenstruktur) als kanonischen Join-Schlüssel, nichtpidoder andere für den Benutzer sichtbare Identifikatoren. Dies ist beabsichtigt, da dieselbe PID mehrmals in verschiedenen Erkennungsquellen und Root-Tasks auftauchen kann, während eine virtuelle Adresse ein bestimmtes Kernel-Objekt eindeutig identifiziert. Sowohl die SQL-Tabellen als auch die zugrunde liegendeLinuxOperatingSystem-API sind um diese Konvention herum aufgebaut.
/proc/kallsyms)dmesg)task-Einschränkung für eine gezielte Analyse an oder fragen Sie alle Tasks auf einmal ab)task-Einschränkung für eine gezielte Analyse an oder fragen Sie alle Tasks auf einmal ab)task-Einschränkung, also joinen Sie es mit tasks/processes (z.B. JOIN task_capabilities c ON c.task = p.virtual_address).task-Einschränkung.mem-Einträge aus einem Kernel-Modul-Objekt. Erfordert eine kernel_module-Einschränkung, also joinen Sie es mit kernel_modules (z.B. JOIN kernel_module_mem_entries r ON r.kernel_module = m.virtual_address).struct ftrace_ops-Knoten, standardmäßig vom Symbol ftrace_ops_list aus durchlaufen. Beschränken Sie virtual_address, um einen einzelnen Knoten zu lesen, oder start_vaddr (optional begrenzt durch end_vaddr), um von einem beliebigen Knoten aus zu durchlaufen.mquire bietet drei Hauptbefehle:
mquire shell – Startet eine interaktive SQL-Shell zur Abfrage von Speicherabbildernmquire query – Führt eine einzelne SQL-Abfrage aus und gibt Ergebnisse aus (unterstützt JSON- oder Tabellenformat)mquire command – Führt benutzerdefinierte Befehle auf Speicherabbildern aus (z.B. .task_tree, .system_version, .dump)mquire bietet spezielle Befehle, die mit einem Punkt (.) beginnen, um sie von SQL-Abfragen zu unterscheiden.
Diese Befehle funktionieren in der interaktiven Shell und mit mquire query:
.tables – Listet alle verfügbaren Tabellen auf.schema – Zeigt das Schema für alle Tabellen an.schema <tabelle> – Zeigt das Schema für eine bestimmte Tabelle an.commands – Listet alle verfügbaren benutzerdefinierten Befehle auf.exit – Beendet die interaktive Shell (nur Shell)Diese Befehle funktionieren in der interaktiven Shell und mit mquire command:
Verwenden Sie --help bei jedem Befehl, um verfügbare Optionen und Nutzungsinformationen anzuzeigen. Zum Beispiel: .task_tree --help
.system_versionZeigt die Betriebssystemversionsinformationen an.
Dies ist ein praktischer Befehl, der SELECT * FROM os_version entspricht, jedoch mit formatierter Ausgabe.
.task_treeZeigt einen hierarchischen Baum der laufenden Prozesse und Threads an, ähnlich dem Befehl pstree unter Linux.