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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
NanoMQ-Memory-Leak-Research — CVE-2026-36590(NanoMQ v0.24.9 のサービス拒否脆弱性)に関する公開勧告と技術分析。 | Kitploit
ツール/GitHubGitHub/moxie25/nanomq-memory-leak-research
静的分析動的分析 (サンドボックス)IoTセキュリティメモリフォレンジック脆弱性分析エクスプロイトペネトレーションテスト
GitHubmoxie25/nanomq-memory-leak-research

NanoMQ-Memory-Leak-Research

CVE-2026-36590(NanoMQ v0.24.9 のサービス拒否脆弱性)に関する公開勧告と技術分析。

リポジトリを見る
1ヶ月前未レビュー

人気

すべて見る →

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

すべてのツールを探索

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

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

CVE-2026-36590: EMQ NanoMQ v0.24.9 におけるサービス拒否

このリポジトリには、EMQ NanoMQ v0.24.9 に影響するサービス拒否脆弱性 CVE-2026-36590 に関する公開アドバイザリと技術分析が含まれています。

レビューノート

このリポジトリは、CVE レビューのためのアクセス可能な技術リファレンスを提供する目的で公開されています。CVE-2026-36590 の最終的な分類は、CVE チームまたは該当する CNA によって決定されます。

NanoMQ チームはこの問題を争っており、設定に関連するものと見なしています。このリポジトリは、再現資料、ASAN 結果、ランタイムログ、ソースコード分析を含む技術的エビデンスに焦点を当てています。

アドバイザリ情報

  • CVE ID: CVE-2026-36590
  • ベンダー/プロジェクト: EMQ / NanoMQ
  • 製品: NanoMQ
  • 影響を受けるバージョン: v0.24.9
  • 脆弱性タイプ: サービス拒否 / リソース枯渇
  • 影響を受けるコンポーネント: /nanomq/nng/src/supplemental/mqtt/mqtt_qos_db_api.c/ nni_qos_db_set
  • CWE: CWE-772, CWE-400
  • 公開日: 2026-06-17

概要

NanoMQ v0.24.9 が SQLite サポートなしでビルドされ、sqlite.enable が true に設定されている場合、QoS データベースポインタが NULL のままになる可能性があります。MQTT QoS メッセージ処理中に、nni_qos_db_set がクローンされたメッセージ参照を解放せずに早期リターンする可能性があります。QoS > 0 の MQTT PUBLISH メッセージが繰り返されると、継続的にメモリが消費され、最終的にサービス拒否に至ります。

この問題が依然としてレビューを必要とする理由

この問題はデフォルト以外のランタイム設定に依存しますが、以下の事実はなぜさらなるレビューが必要かを示しています。

  1. NanoMQ はランタイム設定を受け入れ、SQLite サポートが現在のビルドで利用できないことを報告せずに実行を継続します。

  2. この設定の不一致は実際に発生する可能性があります。ユーザーは通常のビルドコマンドで NanoMQ をビルドした後、後でサンプル設定ファイルから SQLite 永続化セクションをコピーまたは有効にする場合があります。

  3. 影響を受けるコードパスは、この不整合な状態を完全に検証しません。ランタイム設定が SQLite を有効として扱いながらデータベースポインタが NULL である場合、nni_qos_db_set() は渡されたメッセージオブジェクトを解放せずに早期リターンします。

  4. この設定が受け入れられた後、リモートの MQTT トラフィックによって問題がトリガーされる可能性があります。QoS > 0 の PUBLISH メッセージが繰り返されると、影響を受けるパスに入り、累積的なメモリリークを引き起こす可能性があります。

  5. 1回、50回、500回の再現ラウンドでの ASAN テストでは、リークされたバイト数とアロケーション数がトリガー試行回数に応じて増加することが示されています。これは、問題が一度きりの小さなリークではなく、入力数に依存することを示唆しています。

緩和策

ユーザーは NanoMQ インスタンスへのアクセスを制限し、信頼できないクライアントに MQTT サービスを公開しないようにし、SQLite サポートなしのビルドで SQLite 永続化を有効にしないようにする必要があります。ベンダーは、SQLite 設定の起動時検証を追加し、nni_qos_db_set の db == NULL ブランチでメッセージ参照を解放する必要があります。

NanoMQ-Memory-Leak-Research

添付ファイル

  1. Analysis_Report.md: 分析の完全な内訳。ライフサイクル図と詳細なログトレースを含みます。
  2. 249exploit_leak.py: リークを再現する Python PoC スクリプト。
  3. nanomq.conf: 不一致をトリガーするために使用された設定ファイル。
  4. runtime_logs.log: 参照カウントの異常を示すインストルメンテーションログ。
  5. Docker/: 脆弱性を制御された環境下で確実にトリガーし検証するために使用された、コンテナ化された再現環境。
    詳細なビルド手順と環境設定手順は以下にあります:
    Docker/Docker_Reproduction_Guide.md
  6. 249asan_log.txt: NanoMQ v0.24.9 からキャプチャされた AddressSanitizer (ASAN) ランタイムログ。メモリリークと関連する異常なメモリ動作を示しています。

技術分析の概要

概要 このリポジトリには、NanoMQ で見つかったメモリリーク脆弱性の Proof of Concept (PoC) と詳細な分析が含まれています。この問題により、リモート攻撃者が特定の QoS MQTT メッセージを介してシステムメモリを枯渇させ、サービス拒否 (DoS) を引き起こすことが可能です。

私は NanoMQ におけるメモリリーク現象の詳細な分析を実施しました。動的インストルメンテーションとコードレビューを通じて、ランタイム設定で SQLite が有効 (sqlite.enable=true) になっているが、バイナリが SQLite サポートなしでコンパイルされている (NNG_SUPP_SQLITE が未定義) 場合にトリガーされる重大なリソースリークパスを特定しました。

この問題を簡潔に保つため、以下に主要な発見事項をまとめました。完全な技術的内訳 (詳細な ASAN トレース、ライフサイクル図、インストルメンテーションログを含む) については、添付の Analysis_Report.md を参照してください。


分析プロセス

1. 初期検出 (ASAN 分析)

AddressSanitizer を使用して、リークされたメモリの発生源が tcptran_pipe_recv_cb (nng/src/sp/transport/mqtt/broker_tcp.c) 内の nni_msg_alloc にあることを特定しました。メモリは割り当てられたものの、完全には解放されませんでした。

2. ライフサイクルモデリング ("3 クローン vs. 3 解放" のベースライン)

nni_msg の参照カウントメカニズムを分析しました。通常の QoS 1 メッセージのライフサイクルは以下のようになります。

  • Alloc (+1): ネットワーク受信。
  • Clone 1 (+1): アプリケーション層でのディスパッチ。
  • Clone 2 (+1): 永続化/再送信ロジック。
  • 合計 Ref: 3 -> 必要な解放: 3。

3. 動的トレースと検証

GDB はこの高並行性シナリオには実用的でなかったため、動的インストルメンテーションを使用して特定のメモリオブジェクト (例: 0x60e00002ffa0) のライフサイクルをトレースしました。 発見: ログにより、ライフサイクルの不一致が確認されました。

  • 実際のアロケーション数: 3 (Alloc + Clone 1 + Clone 2)
  • 実際の解放数: 2 (Free 1 + Free 2)
  • 結果: 参照カウントは 1 のままとなり、リークが発生しました。欠落している解放は、nmq_pipe_send_start_v4 で生成された Clone 2 に対応します。

4. 根本原因の特定

実行フローをトレースすることで、3 番目の解放が欠落している理由が明らかになりました。

  1. 不一致: バイナリは -DNNG_SUPP_SQLITE なしでコンパイルされたため、nano_sock_setdb 内の初期化ロジックが除去されました。しかし、nanomq.conf では sqlite.enable = true でした。これにより、db ポインタが NULL のままになりました。
  2. 欠陥のあるロジック ("早期リターン"): メッセージ (Ref=3) が保存のために nni_qos_db_set に入ると、関数は NULL ポインタをチェックします:
root@kitploit:~
// File: /nanomq/nng/src/supplemental/mqtt/mqtt_qos_db_api.c
void nni_qos_db_set(..., void *db, ..., nng_msg *msg) {
    if (db == NULL) {
        // 重大な欠陥:
        // db が NULL のため早期リターンが発生。
        // 関数は 'msg' (Ref++) の所有権を保持するが、解放に失敗。
        return; 
    }
    // ...
}

関数は nni_msg_free(msg) を呼び出さずに黙ってリターンします。これにより、msg ポインタは回復不能に失われ、メモリブロックが実質的に孤立します。


結論と影響

  • 根本原因: nni_qos_db_set における防御的プログラミングの欠如。無効な DB 状態による早期リターンを実行する際に、msg ポインタの所有権を適切に処理していません。
  • 影響: サイレント DoS につながります。QoS > 0 のメッセージが通常のクライアントトラフィックでも悪意のあるアクターからでも継続的に送信されると、システムメモリが徐々に枯渇し (OOM)、最終的にブローカーがクラッシュします。

推奨事項:

  1. 即時失敗 (起動時チェック): システム起動フェーズ (nano_sock_setdb または main 関数) で検証ロジックを追加し、SQLite が正しく動作していることを確認します。conf->sqlite.enable == true が検出されたが NNG_SUPP_SQLITE マクロが未定義であるか SQLite が異常である場合、システムはエラーで終了するか、強制的に enable を false に設定し警告を出力する必要があります。
  2. リソース安全性 (フェイルセーフ): nni_qos_db_set 関数の早期リターンブランチにリソース解放ロジックを追加します。db == NULL の場合、参照カウントをバランスさせメモリリークを防ぐために、nni_msg_free(msg) を呼び出す必要があります。
ツールをダウンロード