本文へ移動
English version →
重大 9.8 急ぎ度: 早めに

rabbitmq-cにメモリ破壊の脆弱性、0.17.0で修正

C言語のAMQPクライアント、rabbitmq-cの0.17.0未満に、公開APIで長すぎる本文フレームを送るとメモリ破壊に至る脆弱性があります。自社アプリが組み込んでいる版を確かめ、0.17.0以降へ更新してください。

CVE-2026-61547 公開 更新 執筆・監修: 佐々木 航 人が監修しながらAIを活用して執筆
画像は生成 AI で作成したイメージです

急ぎ度: 早めに

CVSS v3は9.8ですが、問題が起きるのは自社アプリが長すぎる本文フレームを公開APIに渡した場合で、修正版0.17.0も出ているため、早めの更新で対処できます。

関係があるか

RabbitMQにつなぐC言語のアプリや、rabbitmq-cを組み込んだ自社製・他社製のソフトウェアが対象です。ライブラリを動的に読み込む場合も、静的にリンクしている場合も含みます。

製品影響を受ける版修正版
rabbitmq-c 0.17.0未満(GitHubの勧告では0.16.0以前) 0.17.0

確かめ方

  1. 1自社のC・C++のアプリや、ほかの言語の拡張が内部でrabbitmq-cを使っていないか、依存関係の一覧とビルド設定で確認する。
  2. 2使っている場合は、リンクしているrabbitmq-cの版が0.17.0未満かどうかを見る。OSのパッケージなら、配布元が出している更新情報も確認する。
  3. 3自社のソースコードで、公開APIのamqp_send_frame()を直接呼んでいる箇所を探し、AMQP_FRAME_BODYの長さを呼び出し側で制限しているかを確かめる。
  4. 4静的にリンクしている場合は、ライブラリを更新しても実行ファイルに反映されない。実行ファイルを作り直す必要がある。

何が起きたか

rabbitmq-cに、メッセージ本文を送信用のデータに組み立てる処理で、確保したメモリの大きさを確かめないまま書き込んでしまう脆弱性があります。アプリが長すぎる本文を渡すと、確保した領域の外に書き込み、プロセスの異常終了やメモリ破壊につながります。

問題の箇所は、公開API amqp_send_frame()から呼ばれるamqp_frame_to_bytes()です。AMQP_FRAME_BODYの処理で、呼び出し側が指定した長さ(body_fragment.len)をそのまま信用し、接続ごとの送信用バッファに収まるかを検証せずにコピーします。弱点の種類はCWE-787(境界外書き込み)です。

同じ関数のMETHODとHEADERの処理には、バッファの大きさに合わせた上限がすでにありました。上限の確認が抜けていたのは本文の処理だけです。修正では、ヘッダーとフッターの分を除いた領域に本文が収まらない場合、AMQP_STATUS_BAD_AMQP_DATAを返して処理を止めます。

この現象はRabbitMQのブローカーと通信する前の、ローカルでの組み立て段階で起きると、勧告に書かれています。

攻撃の流れ

  1. 1

    長大な本文を指定

    アプリがAMQP_FRAME_BODYの本文長を送信用バッファより大きくしたまま、amqp_send_frame()に渡します。

  2. 2

    長さを検証せず複写

    ライブラリが本文の長さを確かめず、送信用バッファへそのままコピーします。

  3. 3

    領域外へ書き込み

    確保したヒープ領域の終わりを越えて書き込みが起きます。

  4. 4

    異常終了や破壊

    プロセスが異常終了するか、周囲のメモリが壊れます。

公開されている情報をもとにした流れの例です。

どう悪用されるか

CVSS v3のベクターは、ネットワークから、認証なし、利用者の操作なしで悪用できる想定です。一方、勧告が示す発生条件は、アプリが長すぎる本文フレームを公開APIのamqp_send_frame()に渡すことです。再現はローカルで、ブローカーなしで確認されています。

被害として挙げられているのは、プロセスのクラッシュとメモリ破壊です。外部から本文の長さを左右できるアプリかどうかで、実際のリスクは大きく変わるとみられます。長さが固定の小さな値か、呼び出し側で上限を設けているアプリなら、この経路に入る可能性は低いでしょう。

今すぐやること

  1. 1

    使っている版を洗い出す

    自社のアプリと、rabbitmq-cを同梱する製品について、リンクしている版を確認します。OSのパッケージで入れている場合は、版を問い合わせて0.17.0未満かどうかを見ます。

    pkg-config --modversion librabbitmq
  2. 2

    0.17.0以降へ更新する

    rabbitmq-cを修正版の0.17.0以降に更新します。静的リンクのアプリは、更新後に作り直して配布し、動的リンクのアプリはプロセスを再起動して新しい版を読み込ませます。

  3. 3

    直接呼び出しを点検する

    自社コードでamqp_send_frame()を直接呼んでいる箇所を探し、AMQP_FRAME_BODYの長さの出どころを調べます。外部入力で決まる場合は、更新前でも呼び出し側で上限を確かめるよう直します。

    grep -rn "amqp_send_frame" ./src
  4. 4

    他社製品と配布元の情報を確認する

    rabbitmq-cを同梱する他社製品や、OSの配布元については、各ベンダーの告知で修正の提供状況を確認します。修正版が出ていると決めつけず、版を問い合わせてください。

すぐ更新できないとき

すぐに更新できないときは、amqp_send_frame()でAMQP_FRAME_BODYを送る前に、本文の長さが、フレームの最大サイズからヘッダーとフッターの分を引いた値以下かをアプリ側で確かめ、超える場合は送らずにエラーにします。ライブラリが本文をフレームに分割して送る上位の送信処理を使う方法もあります。分割処理が、今回の修正と同じ上限を使っているためです。

背景

rabbitmq-cは、RabbitMQにつなぐアプリが組み込むC言語のクライアントライブラリです。メッセージの送受信を担うため、業務システムのキューまわりに入っていることがあります。他の言語の拡張が内部で使っていることもあり、利用者がライブラリの存在に気づきにくい面もあります。

今回の脆弱性は、フレームの種類ごとに上限を設ける仕組みの中で、本文の処理だけが呼び出し側の長さを信用していたことで起きました。上位の送信処理は、本文をフレームの大きさに合わせて分割します。その経路を通らず、低レベルのAPIで自分でフレームを組み立てるアプリが、影響を受ける側です。

よくある質問

Q.RabbitMQのブローカー側も更新が必要ですか。
A.今回の脆弱性があるのはクライアントライブラリのrabbitmq-cです。勧告でも、再現はブローカーを使わないローカルの環境で確認されており、ブローカー側の更新を求める記載はありません。

まだ分かっていないこと

  • 実際の攻撃での悪用や、影響を受ける具体的なアプリ製品名は公表されていません。

この記事は、取得元の公開情報をもとに、人が監修しながらAIを活用して執筆しています。執筆と監修は佐々木 航が担い、公開したあとも人が内容を確認しています。誤りに気づいたときは直し、記事の末尾に訂正の行を残します。対応を決める前に、下の原文と参照先も確認してください。

ディストリビューション別の修正状況

各ディストリビューションが公開している、この CVE の記録です。修正版は配布版ごとに違うので、リンク先で確かめてください。

原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。

rabbitmq-c is a C-language AMQP client library for RabbitMQ. Prior to version 0.17.0, a heap buffer overflow exists in rabbitmq-c when the public amqp_send_frame() API is used to serialize an oversized AMQP_FRAME_BODY. The issue occurs because amqp_frame_to_bytes() copies frame.payload.body_fragment.len bytes into the connection outbound buffer without validating that the body fragment fits within the allocated frame buffer. An application that passes an oversized body frame to amqp_send_frame() can trigger a heap out-of-bounds write, resulting in process crash and memory corruption. This issue has been patched in version 0.17.0.

出典: CVE.org (CVE Program・cvelistV5) NVD

参照URL

当サイトでは、アクセス解析と広告の効果測定のために Cookie を使います。株式会社Game のサイト共通の設定です。 詳しく