
Análisis forense de memoria Linux sin dependencias, aprovechando BTF y kallsyms integrados en el kernel para un análisis de memoria consciente del tipo sin información de depuración externa.
mquire, un juego de palabras entre memory e inquire, es una herramienta de consulta de memoria inspirada en osquery.
mquire puede analizar instantáneas de memoria del kernel de Linux sin requerir símbolos de depuración externos.
Todo lo necesario para el análisis ya está incluido en el propio volcado de memoria. Esto significa que puede analizar:
Requisitos de versión del kernel:
scripts/kallsyms.c)mquire analiza la memoria del kernel leyendo dos tipos de información que están incrustados en los kernels modernos de Linux:
/proc/kallsyms)Al combinar la información de tipo con las ubicaciones de los símbolos, mquire puede encontrar y leer estructuras de datos complejas del kernel como:
Esto permite extraer archivos directamente de la caché de archivos del kernel, incluso si se han eliminado del disco.
El escáner de Kallsyms depende del formato de datos de scripts/kallsyms.c en el código fuente del kernel. Si las versiones futuras del kernel cambian este formato, es posible que sea necesario actualizar las heurísticas del escáner.
mquire proporciona tablas SQL para consultar diferentes aspectos del sistema o el estado de la propia herramienta.
mquire no es una base de datos. Cada consulta reconstruye las estructuras de datos del kernel escaneando la memoria y siguiendo punteros. No hay índices precalculados ni resultados en caché: cada acceso a una tabla es un recorrido de los datos del kernel. Use
AS MATERIALIZEDpara evitar escaneos redundantes (consulte Optimización de consultas) y proporcione restricciones comotaskal consultar tablas por proceso comotask_open_filesymemory_mappingspara limitar el escaneo a un solo proceso.
Principio de diseño: direcciones virtuales como claves de unión. Las tablas usan
virtual_address(la dirección del kernel de la estructura de datos subyacente) como la clave de unión canónica: nopidni otros identificadores visibles para el usuario. Esto es intencional, porque el mismo PID puede aparecer varias veces en diferentes fuentes de descubrimiento y tareas raíz, mientras que una dirección virtual identifica de forma única un objeto del kernel específico. Tanto las tablas SQL como la API subyacenteLinuxOperatingSystemse construyen alrededor de esta convención.
/proc/kallsyms)dmesg)task para un análisis dirigido, o consulte todas las tareas a la vez)task para un análisis dirigido, o consulte todas las tareas a la vez)task, así que únala contra tasks/processes (por ejemplo, JOIN task_capabilities c ON c.task = p.virtual_address).task.mem de un objeto de módulo del kernel. Requiere una restricción kernel_module, así que únala contra kernel_modules (por ejemplo, JOIN kernel_module_mem_entries r ON r.kernel_module = m.virtual_address).struct ftrace_ops, recorridos desde el símbolo ftrace_ops_list por defecto. Restrinja virtual_address para leer un solo nodo, o start_vaddr (opcionalmente acotado por end_vaddr) para recorrer desde un nodo arbitrario.mquire proporciona tres comandos principales:
mquire shell: Inicia un shell SQL interactivo para consultar instantáneas de memoriamquire query: Ejecuta una sola consulta SQL y muestra los resultados (admite formato JSON o tabla)mquire command: Ejecuta comandos personalizados en instantáneas de memoria (por ejemplo, .task_tree, .system_version, .dump)mquire proporciona comandos especiales con prefijo de punto (.) para distinguirlos de las consultas SQL.
Estos comandos funcionan en el shell interactivo y con mquire query:
.tables: Lista todas las tablas disponibles.schema: Muestra el esquema de todas las tablas.schema <tabla>: Muestra el esquema de una tabla específica.commands: Lista todos los comandos personalizados disponibles.exit: Sale del shell interactivo (solo shell)Estos comandos funcionan en el shell interactivo y con mquire command:
Use --help con cualquier comando para ver las opciones disponibles y la información de uso. Por ejemplo: .task_tree --help
.system_versionMuestra la información de la versión del sistema operativo.
Este es un comando de conveniencia equivalente a SELECT * FROM os_version, pero con salida formateada.
.task_treeMuestra un árbol jerárquico de procesos y subprocesos en ejecución, similar al comando pstree en Linux.