
Криминалистика памяти Linux с нулевыми зависимостями, использующая встроенные в ядро BTF и kallsyms для анализа памяти с учётом типов без внешней отладочной информации.
mquire — игра слов от memory и inquire — это инструмент для запросов к памяти, вдохновлённый osquery.
mquire может анализировать снапшоты памяти ядра Linux без необходимости во внешних отладочных символах.
Всё необходимое для анализа уже встроено в сам дамп памяти. Это означает, что вы можете анализировать:
Требования к версии ядра:
scripts/kallsyms.c)mquire анализирует память ядра, считывая два типа информации, встроенных в современные ядра Linux:
/proc/kallsyms)Комбинируя информацию о типах с расположением символов, mquire может находить и читать сложные структуры данных ядра, такие как:
Это позволяет извлекать файлы непосредственно из файлового кэша ядра, даже если они были удалены с диска.
Сканер Kallsyms зависит от формата данных из scripts/kallsyms.c в исходном коде ядра. Если будущие версии ядра изменят этот формат, эвристикам сканера могут потребоваться обновления.
mquire предоставляет SQL-таблицы для запросов к различным аспектам системы или состоянию самого инструмента.
mquire — это не база данных. Каждый запрос реконструирует структуры данных ядра, сканируя память и следуя указателям. Нет предварительно вычисленных индексов или кэшированных результатов: каждый доступ к таблице — это обход данных ядра. Используйте
AS MATERIALIZED, чтобы избежать избыточных сканирований (см. Оптимизация запросов), и указывайте ограничения, такие какtask, при запросах к таблицам на процесс, напримерtask_open_filesиmemory_mappings, чтобы ограничить сканирование одним процессом.
Принцип проектирования: виртуальные адреса как ключи соединения. Таблицы используют
virtual_address(адрес ядра базовой структуры данных) в качестве канонического ключа соединения: неpidили другие видимые пользователем идентификаторы. Это сделано намеренно, потому что один и тот же PID может появляться несколько раз в разных источниках обнаружения и корневых задачах, в то время как виртуальный адрес однозначно идентифицирует конкретный объект ядра. Как SQL-таблицы, так и базовый APILinuxOperatingSystemпостроены на этом соглашении.
/proc/kallsyms)dmesg)task для целенаправленного анализа или запрашивайте все задачи сразу)task для целенаправленного анализа или запрашивайте все задачи сразу)task, поэтому соединяйте её с tasks/processes (например, JOIN task_capabilities c ON c.task = p.virtual_address).task.mem из объекта модуля ядра. Требует ограничения kernel_module, поэтому соединяйте её с kernel_modules (например, JOIN kernel_module_mem_entries r ON r.kernel_module = m.virtual_address).struct ftrace_ops, по умолчанию обходимых от символа ftrace_ops_list. Ограничьте virtual_address для чтения одного узла или start_vaddr (опционально с границей end_vaddr) для обхода от произвольного узла.mquire предоставляет три основные команды:
mquire shell — Запустить интерактивную SQL-оболочку для запросов к снапшотам памятиmquire query — Выполнить один SQL-запрос и вывести результаты (поддерживает формат JSON или таблицу)mquire command — Выполнить пользовательские команды над снапшотами памяти (например, .task_tree, .system_version, .dump)mquire предоставляет специальные команды с префиксом точки (.), чтобы отличать их от SQL-запросов.
Эти команды работают в интерактивной оболочке и с mquire query:
.tables — Список всех доступных таблиц.schema — Показать схему для всех таблиц.schema <table> — Показать схему для конкретной таблицы.commands — Список всех доступных пользовательских команд.exit — Выйти из интерактивной оболочки (только оболочка)Эти команды работают в интерактивной оболочке и с mquire command:
Используйте --help с любой командой, чтобы увидеть доступные опции и информацию об использовании. Например: .task_tree --help
.system_versionОтобразить информацию о версии операционной системы.
Это удобная команда, эквивалентная SELECT * FROM os_version, но с форматированным выводом.
.task_treeОтобразить иерархическое дерево запущенных процессов и потоков, аналогично команде pstree в Linux.
Опции:
--show-threads — Включить потоки в дополнение к процессам. При включении отображает как TGID, так и TID для каждой записи.--use-real-parent — Использовать поле real_parent вместо parent для построения древовидной структуры. Поле real_parent показывает исходный родительский процесс до любого переродительства (полезно для отслеживания цепочек создания процессов, даже после завершения родительских процессов).Примечания:
[TGID TID] при показе потоков или [TGID] при скрытых потоках. TGID (Thread Group ID) — это то, что обычно называют PID. Для главных потоков (где TGID == TID) оба значения будут одинаковыми..carve