Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
ツール/GitHubGitHub/trailofbits/mquire
OSINT (オープンソースインテリジェンス)メモリフォレンジック脆弱性分析リバースエンジニアリングフォレンジックマルウェア分析デジタルフォレンジックバイナリ解析脅威インテリジェンス学習と教育インシデントレスポンス
GitHub
184843日前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有
trailofbits/mquire

mquire

依存関係ゼロのLinuxメモリフォレンジック。カーネル組み込みのBTFとkallsymsを活用し、外部デバッグ情報なしで型認識メモリ解析を実現。

リポジトリを見るウェブサイト

mquire

mquireは、memory(メモリ)とinquire(問い合わせ)を組み合わせた造語で、osqueryにインスパイアされたメモリクエリツールです。

主な利点:外部デバッグシンボルが不要

mquireは、外部デバッグシンボルを必要とせずにLinuxカーネルメモリのスナップショットを解析できます。

分析に必要なものはすべてメモリダンプ自体に組み込まれています。つまり、以下を解析できます。

  • これまで見たことのない未知のカスタムカーネル
  • 事前準備なしの任意のLinuxディストリビューション
  • 外部デバッグシンボルが利用できない、または失われたメモリスナップショット

要件

カーネルバージョンの要件:

  • BTF対応:カーネル4.18以降で、かつBTFが有効であること(最近のディストリビューションのほとんどはデフォルトで有効)
  • Kallsyms対応:カーネル6.4以降(scripts/kallsyms.cのフォーマット変更による)

仕組み

mquireは、モダンなLinuxカーネルに組み込まれている次の2種類の情報を読み取ることでカーネルメモリを解析します。

  1. BTF(BPF Type Format)からの型情報 - カーネルのデータ型の構造とレイアウトを記述します。BTFデータはbtfparseクレートを使用して解析されます。
  2. Kallsymsからのシンボル情報 - カーネルシンボルのメモリ位置を提供します(/proc/kallsymsで使用されるのと同じデータ)。

型情報とシンボル位置を組み合わせることで、mquireは以下のような複雑なカーネルデータ構造を見つけて読み取ることができます。

  • プロセスのメモリマッピング(メープルツリー構造を使用)
  • キャッシュされたファイルデータ(XArray構造を使用)
  • カーネルログメッセージ

これにより、ディスクから削除されたファイルであっても、カーネルのファイルキャッシュから直接ファイルを抽出することが可能になります。

互換性に関する注意点

Kallsymsスキャナーは、カーネルソースのscripts/kallsyms.cのデータ形式に依存しています。将来のカーネルバージョンでこの形式が変更された場合、スキャナーのヒューリスティックを更新する必要があります。

機能

テーブル

mquireは、システムのさまざまな側面やツール自体の状態をクエリするためのSQLテーブルを提供します。

mquireはデータベースではありません。 各クエリは、メモリをスキャンしてポインタを辿ることにより、カーネルデータ構造を再構築します。事前計算されたインデックスやキャッシュされた結果はありません。テーブルアクセスはすべてカーネルデータのトラバーサルです。冗長なスキャンを避けるにはAS MATERIALIZEDを使用し(クエリ最適化を参照)、task_open_filesやmemory_mappingsのようなプロセス単位のテーブルをクエリする際は、単一プロセスにスキャンを限定するためにtaskのような制約条件を指定してください。

設計原則:結合キーとしての仮想アドレス。 テーブルは、pidや他のユーザー可視の識別子ではなく、virtual_address(基盤となるデータ構造のカーネルアドレス)を正規の結合キーとして使用します。これは意図的です。同じPIDが複数の発見ソースやルートタスクにわたって複数回現れる可能性がある一方、仮想アドレスは特定のカーネルオブジェクトを一意に識別するからです。SQLテーブルと基盤となるLinuxOperatingSystem APIはどちらもこの規則に基づいて構築されています。

システム情報

  • os_version - カーネルバージョンとアーキテクチャ
  • system_info - ホスト名とドメイン名
  • boot_time - システム起動時間
  • kallsyms - カーネルシンボルアドレス(/proc/kallsymsと同じデータ)
  • dmesg - カーネルリングバッファメッセージ(dmesgコマンドと同じデータ)

プロセス情報

  • tasks - コマンドラインとバイナリパスを含む実行中のプロセス。各タスクは複数の独立したソースを介して発見されます。これはルートキット検出に役立ちます。ルートキット検出のためのタスク列挙方法の比較および重複排除されたプロセスリストを参照してください。
  • task_open_files - 各プロセスが開いているファイル(対象を絞った分析にはtask制約を指定し、すべてのタスクを一度にクエリすることも可能)
  • memory_mappings - 各プロセスによってマップされたメモリ領域(対象を絞った分析にはtask制約を指定し、すべてのタスクを一度にクエリすることも可能)
  • task_capabilities - タスクのLinuxケイパビリティセット(実効、許容、継承可能、境界、アンビエント)。task制約が必要なため、tasks/processesと結合してください(例:JOIN task_capabilities c ON c.task = p.virtual_address)。
  • task_ptrace_flags - 指定されたタスクのptraceフィールドをデコードします。task制約が必要です。

カーネルモジュール

  • kernel_modules - メタデータ(名前、状態、バージョン、パラメータ、テイントフラグ)を含むロードされたカーネルモジュール
  • kernel_module_mem_entries - カーネルモジュールオブジェクトからのmemエントリ。kernel_module制約が必要なため、kernel_modulesと結合してください(例:JOIN kernel_module_mem_entries r ON r.kernel_module = m.virtual_address)。
  • ftrace_ops - デフォルトでftrace_ops_listシンボルから辿ったstruct ftrace_opsノードのリスト。virtual_addressを制約して単一ノードを読み取るか、start_vaddr(オプションでend_vaddrで範囲指定)を制約して任意のノードから辿ることができます。

ネットワーク情報

  • network_connections - アクティブなネットワーク接続(TCPソケット)
  • network_interfaces - IPアドレスとMACアドレスを含むネットワークインターフェース

ファイルシステム

  • syslog_file - カーネルのファイルキャッシュから読み取ったシステムログ(ログファイルが削除されているか利用できない場合でも、メモリにキャッシュされている限り機能します)

デバッグ

  • mquire_diagnostics - 分析の進行状況、警告、エラーを示す内部mquireログ

コマンド

mquireは3つの主要なコマンドを提供します。

  • 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

実行中のプロセスとスレッドの階層ツリーを表示します。Linuxのpstreeコマンドと似ています。

オプション:

  • --show-threads - プロセスに加えてスレッドも含めます。有効にすると、各エントリにTGIDとTIDの両方が表示されます。
  • --use-real-parent - ツリー構造の構築にparentフィールドではなくreal_parentフィールドを使用します。real_parentフィールドは、再親化前の元の親プロセスを示します(親プロセスが終了した後でもプロセス生成チェーンを追跡するのに役立ちます)。

注記:

  • スレッドを表示する場合の形式は[TGID TID]、スレッドを非表示にする場合は[TGID]です。TGID(スレッドグループID)は一般的にPIDと呼ばれるものです。メインスレッド(TGID == TID)の場合、両方の値は同じになります。

.carve

仮想メモリの領域をディスクに切り出します。このコマンドは、特定の仮想アドレス範囲から、指定されたページテーブルを使用して生のメモリ内容を抽出します。プロセスメモリ、ヒープ内容、またはその他のメモリ領域の抽出に便利です。

引数:

  • ROOT_PAGE_TABLE - ルートページテーブルの物理アドレス(オプションで0xプレフィックス付きの16進文字列)。翻訳に使用するアドレス空間を決定します。
  • VIRTUAL_ADDRESS - 切り出しを開始する仮想アドレス(オプションで0xプレフィックス付きの16進文字列)。
  • SIZE - 切り出すバイト数。
  • DESTINATION_PATH - 切り出されたメモリが書き込まれる出力ファイルのパス。

注記:

  • コマンドは、書き込み前にマップされた領域とマップされていない領域の概要を表示します。
  • マップされていない領域は、出力ファイルではゼロで埋められます。

.dump

カーネルのファイルキャッシュからファイルを抽出して、メモリから直接ファイルを復元します。このコマンドは、すべてのタスクとそのオープンファイル記述子を反復処理し、ページキャッシュからファイル内容を抽出します。

引数:

  • OUTPUT - 抽出されたファイルの出力ディレクトリ。ファイルはTGIDごとに整理されます(例:tgid_1234/path/to/file)。

注記:

  • 現在は、ファイル記述子(プロセスのファイル記述子テーブルから)を介して開かれたファイルでのみ動作します。
  • メモリマップされたファイルからのデータ抽出はまだサポートしていません。
  • 空のファイル(ページキャッシュにデータがない)はスキップされます。
  • 読み取りエラーが発生した領域は、出力ではゼロ埋めされます。

ユースケース

mquireは以下の目的で設計されています。

  • フォレンジック分析 - 侵害されたシステムのメモリスナップショットを分析し、何が実行されていたか、どのファイルがアクセスされたかを把握する
  • インシデント対応 - メモリダンプを迅速にクエリして、悪意のあるアクティビティの証拠を見つける
  • セキュリティ研究 - メモリスナップショットからカーネル内部やプロセスの動作を調査する
  • マルウェア解析 - 検出されずに実行中のプロセスとそのファイル操作を調べる
  • カスタムツール作成 - mquireライブラリクレートを使用して独自の分析ツールを構築する。このクレートは、カーネルメモリ解析のための再利用可能なAPIを提供します。

ビルドとインストール

CIからのビルド済みパッケージ

ビルド済みパッケージはCI実行のアーティファクトとして利用できます。Actionsタブから、成功したワークフロー実行を選択し、アーティファクトをダウンロードすることで入手できます。以下のパッケージ形式が利用可能です。

  • linux-deb-package - Debian/Ubuntu用.debパッケージ
  • linux-rpm-package - Fedora/RHEL/CentOS用.rpmパッケージ
  • linux-tgz-package - 汎用Linux用.tar.gzアーカイブ

ソースからのビルド

mquireはRustで書かれています。ビルドするには:```bash

Clone the repository

git clone https://github.com/trailofbits/mquire cd mquire

Build the project

cargo build --release

The binary will be in target/release/

- mquire: Unified tool with shell, query, and command modes

root@kitploit:~
## 対応するスナップショット形式

mquireは、ファイル拡張子で検出される以下のメモリスナップショット形式をサポートしています:

| 形式 | 拡張子 | 説明 |
|--------|-----------|-------------|
| Raw | `.raw` | フラットな物理メモリダンプ(物理アドレス空間のバイト単位コピー) |
| LiME | `.lime` | アドレス範囲ヘッダー付きの[Linux Memory Extractor](https://github.com/504ensicsLabs/LiME)形式 |
| ELF core | `.elf` | PT_LOADセグメントを含むELFコアダンプ(`virsh dump` または QEMU `dump-guest-memory` で生成されるもの) |

## メモリスナップショットの取得

### AVMLの使用(推奨)

ライブLinuxシステムからメモリスナップショットを取得するには、[AVML](https://github.com/microsoft/avml)を推奨します。以前は[LiME](https://github.com/504ensicsLabs/LiME)が推奨されていましたが、現在は積極的にメンテナンスされていません。```bash
sudo avml output.lime

重要: mquire用のスナップショットを取得する際には --compress を使用しないでください。mquire は圧縮された AVML スナップショットをサポートしていません。圧縮されたスナップショットがある場合は、avml-convert を使用して最初に解凍してください: avml-convert compressed.lime uncompressed.lime

追加オプションについては、AVML ドキュメント を参照してください。

virsh の使用(仮想マシン)

libvirt/KVM 仮想マシンの場合は、virsh dump を使用して ELF core dump を生成します:```bash virsh -c qemu:///system dump output.elf --memory-only --format elf

root@kitploit:~
ダンプ中はVMが一時停止され、ダンプ後に再開されます。`--live` を追加すると、一時停止を回避できますが、スナップショットの整合性が低下します。

## はじめに

メモリスナップショットを取得したら、SQLクエリとカスタムコマンドを使って操作できます。mquire はスナップショットを操作するための3つの方法を提供します:

### インタラクティブシェル

インタラクティブSQLシェルを起動します:```bash
mquire shell /path/to/memory.raw

これにより、SQLクエリとコマンドの両方をインタラクティブに実行できるプロンプトが開きます:```bash mquire> .tables # List all available tables mquire> .schema tasks # Show schema for a specific table mquire> SELECT * FROM tasks; # Run SQL queries mquire> .task_tree --show-threads # Run custom commands mquire> .exit # Exit the shell

root@kitploit:~
### 単発のSQLクエリ

コマンドラインから単一のSQLクエリまたは組み込みコマンドを実行します:```bash
# Output as JSON (default)
mquire query /path/to/memory.raw "SELECT * FROM os_version"

# Output as table format
mquire query /path/to/memory.raw "SELECT * FROM tasks" --format table

# Built-in commands work too
mquire query /path/to/memory.raw ".tables"
mquire query /path/to/memory.raw ".schema tasks"

カスタムコマンドの実行

専門分析のためのカスタムコマンドを実行:```bash

List all available commands (default behavior)

mquire command /path/to/memory.raw

Display system version

mquire command /path/to/memory.raw ".system_version"

Show process tree

mquire command /path/to/memory.raw ".task_tree"

Show process tree with threads

mquire command /path/to/memory.raw ".task_tree --show-threads"

Get help for a command

mquire command /path/to/memory.raw ".task_tree --help"

root@kitploit:~
## 自動起動SQLファイル

mquireは起動時に `$HOME/.config/trailofbits/mquire/autostart/` からSQLファイルを自動的に読み込み、実行します。ファイルはオペレーティングシステムとアーキテクチャごとに整理されています:```
autostart/
  common/common/    # All platforms and architectures
  common/{arch}/    # All platforms, specific architecture
  {os}/common/      # Specific platform, all architectures
  {os}/{arch}/      # Specific platform and architecture

Files within each directory are sorted alphabetically. Directories are scanned in the order shown above.

機能:

  • ファイルは .sql 拡張子を持つ必要があります。
  • エラーは mquire_diagnostics に記録されますが、実行をブロックしません。
  • mquire shell および mquire query コマンドの両方で動作します。

同梱ビュー

mquire は sql/views/ ディレクトリに再利用可能な SQL ビューを同梱しています。just install-views でインストールしてください。完全なリスト、番号付け規則、ディレクトリ構造については views README を参照してください。

Linux ビュー (sql/views/linux/common/):

  • 000_processes.sql - すべての検出ソースにわたる重複排除されたプロセスリストで、ユーザースペースのプロセスリーダーにフィルタリングされています。SELECT * FROM processes でクエリします。
  • 100_process_network_connections.sql - ファイルディスクリプタを介してネットワーク接続を所有プロセスにマッピングします。SELECT * FROM process_network_connections WHERE comm = 'sshd' でクエリします。
  • 120_process_capabilities.sql - クイックピーク権限概要。プロセスごとに1行で、各セットはコンパクトなリストとして表示されます(ALL、''、または権限名。読み取り不能の場合は NULL)。SELECT * FROM process_capabilities でクエリします。
  • 130_process_ptrace_flags.sql - クイックピーク ptrace 概要。プロセスごとに1行で、設定された フラグをコンパクトなリスト(トレースされていない場合は )と生の値として表示します。 でクエリします。

クエリ最適化

mquire のクエリは、埋め込み型情報とデバッグシンボルを使用してポインタを間接参照することにより、仮想メモリからカーネルデータ構造を再構築する必要があります。この処理は高コストになる可能性があるため、クエリ最適化手法を使用してパフォーマンスを劇的に向上させてください。

AS MATERIALIZED によるマテリアライズ

テーブルが JOIN で使用されたり、複数回アクセスされる場合に、AS MATERIALIZED ヒントを使用してテーブル結果をキャッシュします。

マテリアライズすべきタイミング:

  • 生成にコストがかかるテーブル(例: tasks はプロセス構造のリンクリストを辿り、プロセスごとに複数のポインタを間接参照する必要があります)
  • JOIN で使用されるテーブル(クエリ実行中に複数回アクセスされる)
  • 同じクエリ内で複数回参照されるテーブル

例:```sql -- Find network connections for a specific process using materialization WITH target_tasks AS MATERIALIZED ( SELECT * FROM tasks WHERE comm = 'sshd' AND type = 'thread_group_leader' ),

network_connections_mat AS MATERIALIZED ( SELECT * FROM network_connections )

SELECT t.tgid, t.comm, nc.local_address, nc.local_port, nc.remote_address, nc.remote_port, nc.state, nc.protocol FROM target_tasks t JOIN task_open_files tof ON tof.task = t.virtual_address JOIN network_connections_mat nc ON nc.inode = tof.inode;

root@kitploit:~
**注記:** `task_open_files` および `memory_mappings` テーブルは、ジェネレータ入力として `task` 列を使用します。`tasks` テーブルと結合する際、SQLite はネステッドループ結合を介して自動的に制約を渡すため、直接結合が効率的になります。

**パフォーマンスへの影響:** マテリアライゼーションにより、JOIN を含むクエリで大幅な高速化が期待できます(通常 2~5 倍高速)。

**ベンチマーク結果の例:**

*テストは Ubuntu 24.04 スナップショット(カーネル 6.8.0-63)、351 プロセス、50 接続、2142 オープンファイルで実行されました。パフォーマンスはスナップショットサイズ、カーネルバージョン、ハードウェアによって異なります。*

| 方法 | 実時間 | ユーザ時間 | 速度向上 |
|--------|-----------|-----------|---------|
| マテリアライズなし | 12.067s | 16.373s | 基準 |
| マテリアライズあり | 3.171s | 8.786s | **3.8 倍高速** |

### JOIN 順の最適化

**最小のテーブルから始めて、大きなテーブルに向かって JOIN する** ことで、クエリパイプラインの早い段階で処理される行数を最小限に抑えます。

**典型的なテーブルサイズ:**
- `network_connections`: 最小 - ネットワークアクティビティのあるプロセスのみ
- `tasks`: 中 - すべてのプロセス
- `task_open_files`: 最大 - すべてのオープンファイル記述子

**最適な順序:**

フィルタリングされた tasks テーブルから始めて、大きなテーブルに向かって結合します。```sql
FROM target_tasks t                                       -- filtered tasks
JOIN task_open_files tof ON tof.task = t.virtual_address  -- open files
JOIN network_connections_mat nc ON nc.inode = tof.inode   -- matching connections

クエリ実行の理解

EXPLAIN QUERY PLAN を使用して、SQLiteがどのようにクエリを実行するかを確認します。```sql EXPLAIN QUERY PLAN SELECT ... FROM target_tasks t JOIN task_open_files tof ON tof.task = t.virtual_address JOIN network_connections_mat nc ON nc.inode = tof.inode;

root@kitploit:~
Look for:
- **BLOOM FILTER**: SQLiteが大規模なJOIN向けに行う最適化
- **AUTOMATIC COVERING INDEX**: ルックアップ用に作成される一時的なインデックス
- **SCAN**: フルテーブルスキャン(駆動テーブルに期待される)
- **SEARCH**: インデックスベースのルックアップ(効率的)

### ベストプラクティス

1. **JOINで使用されるコストの高いテーブルは常にマテリアライズする**
2. **駆動テーブルとして最も小さいテーブルから始める**
3. **可読性のためにスクリプトではマルチラインSQLを使用する**
4. **複雑なクエリでは`EXPLAIN QUERY PLAN`でクエリプランを確認する**
5. **本番環境では`SELECT *`を避け、必要なカラムのみを指定する**

### ファイル抽出

メモリからディスクへファイルを抽出する:```bash
mquire command /path/to/memory.raw ".dump /output/directory"

クエリ例

すべてのクエリは標準SQL構文を使用します。

システムバージョン```bash

$ mquire shell ubuntu2404_6.14.0-37-generic.lime mquire> SELECT * FROM os_version; arch:"x86_64" kernel_version:"6.14.0-37-generic" system_version:"#37~24.04.1-Ubuntu SMP PREEMPT_DYNAMIC Thu Nov 20 10:25:38 UTC 2"

root@kitploit:~
#### システム情報```bash
$ mquire shell ubuntu2404_6.14.0-37-generic.lime
mquire> SELECT * FROM system_info;
domain:"(none)" hostname:"ubuntu2404"

カーネルモジュール```bash

$ mquire shell ubuntu2404_6.14.0-37-generic.lime mquire> SELECT name, state, src_version, parameters FROM kernel_modules LIMIT 5; name:"snd_seq_dummy" state:"live" src_version:"7A40E0FD47A0746D1C9CD85" parameters:"ump (perm: 0o444), duplex (perm: 0o444), ports (perm: 0o444)" name:"snd_hrtimer" state:"live" src_version:"81EE6D58896E2C2E63E252D" parameters:"" name:"qrtr" state:"live" src_version:"473C5AB47E04ECEA0106681" parameters:"" name:"virtio_rng" state:"live" src_version:"0852940240D554836D22CB2" parameters:"" name:"intel_rapl_msr" state:"live" src_version:"34853C4F5EB8FCAD28ACFB3" parameters:""

root@kitploit:~
#### タスクの実行```bash
$ mquire shell ubuntu2404_6.14.0-37-generic.lime
mquire> SELECT comm, binary_path, command_line FROM tasks WHERE command_line NOT NULL AND comm LIKE "%systemd%";
comm:"systemd" binary_path:"/usr/lib/systemd/systemd" command_line:"/sbin/init splash"
comm:"systemd-oomd" binary_path:"/usr/lib/systemd/systemd-oomd" command_line:"/usr/lib/systemd/systemd-oomd"
comm:"systemd-resolve" binary_path:"/usr/lib/systemd/systemd-resolved" command_line:"/usr/lib/systemd/systemd-resolved"
comm:"systemd-udevd" binary_path:"/usr/bin/udevadm" command_line:"/usr/lib/systemd/systemd-udevd"
comm:"systemd" binary_path:"/usr/lib/systemd/systemd" command_line:"/usr/lib/systemd/systemd --user"
comm:"systemd-logind" binary_path:"/usr/lib/systemd/systemd-logind" command_line:"/usr/lib/systemd/systemd-logind"
comm:"systemd-journal" binary_path:"/usr/lib/systemd/systemd-journald" command_line:"/usr/lib/systemd/systemd-journald"
comm:"systemd-timesyn" binary_path:"/usr/lib/systemd/systemd-timesyncd" command_line:"/usr/lib/systemd/systemd-timesyncd"

接続

特定のプロセスのネットワーク接続を見つけるには、tasks、task_open_files、network_connectionsを結合します。```bash $ mquire shell ubuntu2404_6.14.0-37-generic.lime mquire> SELECT t.tgid, t.comm, nc.protocol, nc.local_address, nc.local_port, nc.remote_address, nc.remote_port, nc.state FROM tasks t JOIN task_open_files tof ON tof.task = t.virtual_address JOIN network_connections nc ON nc.inode = tof.inode WHERE t.comm = 'sshd'; tgid:"1134" comm:"sshd" protocol:"tcp" local_address:"0.0.0.0" local_port:"22" remote_address:"" remote_port:"" state:"listen" tgid:"1134" comm:"sshd" protocol:"tcp" local_address:"::" local_port:"22" remote_address:"" remote_port:"" state:"listen"

root@kitploit:~
#### タスクのオープンファイル

特定のプロセスのオープンファイルをリストするには、`tasks` と `task_open_files` を結合します:```bash
$ mquire shell ubuntu2404_6.14.0-37-generic.lime
mquire> SELECT t.comm, tof.path
FROM tasks t
JOIN task_open_files tof ON tof.task = t.virtual_address
WHERE t.comm LIKE '%systemd%'
LIMIT 10;
comm:"systemd" path:"/null"
comm:"systemd" path:"/null"
comm:"systemd" path:"/null"
comm:"systemd" path:"/kmsg"
comm:"systemd" path:"[eventpoll]"
comm:"systemd" path:"[signalfd]"
comm:"systemd" path:"inotify"
comm:"systemd" path:"/"
comm:"systemd" path:"[timerfd]"
comm:"systemd" path:"/usr/lib/systemd/systemd-executor"

コマンドラインクエリの例

JSON出力(デフォルト)```bash

$ mquire query --format=json ubuntu2404_6.14.0-37-generic.lime "SELECT * FROM os_version" [ { "arch": "x86_64", "kernel_version": "6.14.0-37-generic", "system_version": "#37~24.04.1-Ubuntu SMP PREEMPT_DYNAMIC Thu Nov 20 10:25:38 UTC 2" } ]

root@kitploit:~
##### テーブル出力```bash
$ mquire query --format=table ubuntu2404_6.14.0-37-generic.lime "SELECT * FROM os_version"
arch:"x86_64" kernel_version:"6.14.0-37-generic" system_version:"#37~24.04.1-Ubuntu SMP PREEMPT_DYNAMIC Thu Nov 20 10:25:38 UTC 2"

カスタムコマンドの例

利用可能なコマンドの一覧表示```bash

$ mquire command ubuntu2404_6.14.0-37-generic.lime Available commands: .carve Carve a region of virtual memory to disk .dump Dump all open files from tasks to disk .system_version Display the operating system version .task_tree Display a hierarchical task tree

root@kitploit:~
##### システムバージョンの表示```bash
$ mquire command ubuntu2404_6.14.0-37-generic.lime ".system_version"
System Version: #37~24.04.1-Ubuntu SMP PREEMPT_DYNAMIC Thu Nov 20 10:25:38 UTC 2
Kernel Version: 6.14.0-37-generic
Architecture: x86_64
プロセスツリーを表示```bash

$ mquire command ubuntu2404_6.8.0-63-generic.lime .task_tree | head -n 10 Parent: task_struct::parent Threads: Disabled Page Table: paddr(0x0000000001a60000)

└─ [0] (ffffffff90c0fcc0) swapper/0 ╎ ↳ [0] (ffff982a00e33518) \xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd,)\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\x0e ├─ [1] (ffff982a0084a8c0) systemd │ ├─ [430] (ffff982a0d27a8c0) systemd-journal │ ├─ [495] (ffff982a08a88000) systemd-udevd │ ├─ [786] (ffff982a07a60000) systemd-oomd

root@kitploit:~
**注:** 同じTID(スレッドID。メモリ破損やスナップショットのタイミングにより発生し得る)を持つ複数の `task_struct` エントリが存在する場合、重複エントリはプライマリエントリの下に継続記号 `╎   ↳` でインデントされて表示されます。スレッドを非表示にしている場合の形式は `[TGID] (仮想アドレス) 名前`、スレッドを表示している場合は `[TGID TID]` となります(TGIDはスレッドグループIDで、一般にPIDとして知られています)。

#### メモリからファイルを抽出する```bash
$ mquire command ubuntu2404_6.14.0-37-generic.lime ".dump ./extracted_files"
Legend: SK = skipped, OK = all good, ER = errored

Summary:
  Total files processed: 1234
  Successfully dumped: 1156
  Skipped: 45
  Errors: 33

File Status:
  OK /usr/lib/systemd/systemd (TGID 1)
  OK /etc/passwd (TGID 1)
  SK /dev/null (TGID 1)
  ...

トラブルシューティング

初期化および分析時に詳細なデバッグメッセージを有効にするには、--debug フラグを使用してください:```bash mquire --debug command /path/to/memory.raw ".system_version"

root@kitploit:~
- **`shell`モードと`query`モード**: デバッグメッセージは`mquire_diagnostics` SQLテーブルに保存されます。`SELECT * FROM mquire_diagnostics;`でクエリしてください。
- **`command`モード**: デバッグメッセージはstderrに直接出力されます。

スナップショットの読み込みを妨げる初期化の問題については、`.system_version`のような単純なコマンドで`command`モードを使用することをお勧めします。これは、デバッグ出力を即座にstderrに出力し、`mquire_diagnostics`テーブルをクエリする必要がないためです。

## 設定

mquireは、`$HOME/.config/trailofbits/mquire/config.toml`のTOMLファイルを介して設定できます。ファイルが存在しない場合は、デフォルト値が使用されます。

### 利用可能なオプションとデフォルト値```toml
[database]
# Maximum number of entries retained in the mquire_diagnostics table.
# During initialization, all entries are kept regardless of this limit.
# Once initialization completes, new log entries trigger eviction of the
# oldest entries when the total exceeds this value.
mquire_diagnostics_max_entries = 1000

開発

このプロジェクトは、コマンドランナーとしてjustを使用しています。justを実行すると利用可能なコマンドが表示されます:

SQLクエリ統合テスト

これらのテストは、mquireがメモリスナップショットに対するクエリに対して正しい出力を生成することを検証します。

  • just integration-test - テストを実行し、出力を期待されるJSONファイルと比較します
  • just integration-update - 実際の出力で期待されるJSONファイルを更新します(テーブルスキーマを変更する際に使用)

integration-update を実行した後、コミットする前に git diff を確認して変更が期待通りであることを確認してください。

新しいテストの追加: 適切なスナップショットディレクトリに .sql ファイルと対応する .json ファイルを作成し、just integration-update を実行して期待される出力を生成します。

コントリビューション

コントリビューションを歓迎します!コントリビュートする際は、以下のガイドラインに従ってください:

  1. 変更をテストする - 送信前に変更が正しく動作することを確認してください
  2. 依存関係を最小限に保つ - 絶対に必要な場合のみ新しい依存関係を追加してください
  3. 揮発性データのキャッシュを避ける - カーネルオブジェクト内で移動または変更される可能性のある値をキャッシュしないでください。以下のような安定した参照のみをキャッシュしてください:
    • Kallsymsの場所
    • init_task 仮想アドレス
    • BTFデータ

ライセンス

このプロジェクトはApache License 2.0の下でライセンスされています。詳細はLICENSEファイルを参照してください。

ツールをダウンロード
PT_*
''
SELECT * FROM process_ptrace_flags
  • 200_tasklist_pidns_differences.sql - ある検出ソースでは見えるが別のソースでは欠落しているプロセスを検出します。ルートキット検出に有用です。SELECT * FROM tasklist_pidns_differences でクエリします。
  • 230_unbacked_ftrace_ops.sql - カーネルテキストおよび kernel_modules にリストされているすべてのモジュールの外部を指す登録された ftrace コールバック。SELECT * FROM unbacked_ftrace_ops でクエリします。
  • コマンド説明
    just checkすべてのチェックを実行 (cargo check, cargo clippy, cargo fmt, ruff, mypy)
    just testユニットテストを実行
    just formatコードをフォーマット (cargo fmt, ruff)
    just integration-testSQLクエリ統合テストを実行
    just integration-update期待されるテスト出力を更新
    just packageリリースパッケージをビルド