
Sans dépendance, investigation de la mémoire Linux, exploitant les symboles BTF et kallsyms intégrés au noyau pour une analyse mémoire typée sans informations de débogage externes.
mquire, un jeu de mots entre memory et inquire, est un outil d'interrogation de mémoire inspiré de osquery.
mquire peut analyser des instantanés de mémoire du noyau Linux sans nécessiter de symboles de débogage externes.
Tout ce qui est nécessaire à l'analyse est déjà intégré dans l'image mémoire elle-même. Cela signifie que vous pouvez analyser :
Version du noyau requise :
scripts/kallsyms.c)mquire analyse la mémoire du noyau en lisant deux types d'informations intégrées dans les noyaux Linux modernes :
/proc/kallsyms)En combinant les informations de type avec les emplacements des symboles, mquire peut trouver et lire des structures de données complexes du noyau comme :
Cela permet d'extraire des fichiers directement depuis le cache de fichiers du noyau, même s'ils ont été supprimés du disque.
Le scanner Kallsyms dépend du format de données issu de scripts/kallsyms.c dans le code source du noyau. Si les futures versions du noyau modifient ce format, les heuristiques du scanner pourraient nécessiter des mises à jour.
mquire fournit des tables SQL pour interroger différents aspects du système ou de l'état de l'outil lui-même.
mquire n'est pas une base de données. Chaque requête reconstruit les structures de données du noyau en parcourant la mémoire et en suivant les pointeurs. Il n'y a pas d'index précalculés ni de résultats mis en cache : chaque accès à une table est une traversée des données du noyau. Utilisez
AS MATERIALIZEDpour éviter des analyses redondantes (voir Optimisation des requêtes), et fournissez des contraintes commetasklors de l'interrogation de tables par processus commetask_open_filesetmemory_mappingspour limiter l'analyse à un seul processus.
Principe de conception : les adresses virtuelles comme clés de jointure. Les tables utilisent
virtual_address(l'adresse noyau de la structure de données sous-jacente) comme clé de jointure canonique : pas lepidou d'autres identifiants visibles par l'utilisateur. C'est intentionnel, car un même PID peut apparaître plusieurs fois à travers différentes sources de découverte et tâches racines, alors qu'une adresse virtuelle identifie de manière unique un objet spécifique du noyau. Les tables SQL ainsi que l'API sous-jacenteLinuxOperatingSystemsont construites autour de cette convention.
/proc/kallsyms)dmesg)task pour une analyse ciblée, ou interrogez toutes les tâches à la fois)task pour une analyse ciblée, ou interrogez toutes les tâches à la fois)task, donc faites une jointure avec tasks/processes (ex. JOIN task_capabilities c ON c.task = p.virtual_address).task.mem d'un objet module du noyau. Nécessite une contrainte kernel_module, donc faites une jointure avec kernel_modules (ex. JOIN kernel_module_mem_entries r ON r.kernel_module = m.virtual_address).struct ftrace_ops, parcourue à partir du symbole ftrace_ops_list par défaut. Contraignez virtual_address pour lire un seul nœud, ou start_vaddr (éventuellement borné par end_vaddr) pour parcourir à partir d'un nœud arbitraire.mquire propose trois commandes principales :
mquire shell – Démarrer un shell SQL interactif pour interroger les instantanés mémoiremquire query – Exécuter une seule requête SQL et afficher les résultats (prend en charge le format JSON ou tableau)mquire command – Exécuter des commandes personnalisées sur les instantanés mémoire (par exemple, .task_tree, .system_version, .dump)mquire fournit des commandes spéciales préfixées par un point (.) pour les distinguer des requêtes SQL.
Ces commandes fonctionnent dans le shell interactif et avec mquire query :
.tables – Lister toutes les tables disponibles.schema – Afficher le schéma de toutes les tables.schema <table> – Afficher le schéma d'une table spécifique.commands – Lister toutes les commandes personnalisées disponibles.exit – Quitter le shell interactif (shell uniquement)Ces commandes fonctionnent dans le shell interactif et avec mquire command :
Utilisez --help avec n'importe quelle commande pour voir les options disponibles et les informations d'utilisation. Par exemple : .task_tree --help
.system_versionAffiche les informations de version du système d'exploitation.
C'est une commande pratique équivalente à SELECT * FROM os_version, mais avec une sortie formatée.
.task_tree