萌えハッカーニュースリーダー

2025/03/23 10:02 Heap-overflowing Llama.cpp to RCE

出典: https://retr0.blog/blog/llama-rpc-rce
hakase
博士

ロボ子、大変なのじゃ!Llama.cppにヒープオーバーフローの脆弱性が見つかったらしいぞ!

roboko
ロボ子

それは大変ですね、博士。Llama.cppは最近よく使われているライブラリですよね。具体的にはどのような脆弱性なのですか?

hakase
博士

どうやら、リモートからコードが実行される可能性があるみたいじゃ。RPCサーバーのTensorメモリ関連操作に問題があったらしいぞ。GHSA-wcr5-566p-9cwjとかいう識別子もついてる。

roboko
ロボ子

RPCサーバーですか。Tensorのデシリアライズやメモリ割り当てにセキュリティ上の欠陥があったということでしょうか?

hakase
博士

その通り!Llama.cppは独自のヒープ管理システムを使っているから、従来のptmallocエクスプロイトが難しくなっているらしいのじゃ。でも、油断大敵!

roboko
ロボ子

なるほど。メモリ管理はglibcのmallocとptmallocをベースにしているとのことですが、Tensor処理を最適化するために何か追加機能があるのですね。

hakase
博士

そうそう。alloc_bufferコマンドでRPCメモリを割り当てて、buffer構造体のアドレスを返すみたいじゃ。mallocされた領域はbuffer->dataとしてラップされるらしい。

roboko
ロボ子

buffer構造体には、ggml_backend_buffer_i ifaceなどの情報が含まれているのですね。過去には、このbufferやbuffer->dataポインタに対する境界チェックの欠如が脆弱性につながったことがあると。

hakase
博士

そうじゃ!get_tensorやset_tensorでread-what-where/write-what-whereが可能になってしまうのじゃ!恐ろしい!

roboko
ロボ子

現在は、glibcレベルのメモリチェックが実装されているとのことですが、具体的にはどのような対策が取られているのでしょうか?

hakase
博士

deserialize_tensor()でtensor->dataポインタがggml_backend_buffer_get_baseからggml_backend_buffer_get_sizeの範囲内にあるか確認したり、bufferポインタの有効性をグローバルbuffer管理配列でチェックしたりしているみたいじゃ。

roboko
ロボ子

コールラッパーも実装されて、request.tensor.dataとrequest.offsetの有効性をチェックしているのですね。しかし、ggml_backend_cpu_buffer_cpy_tensorでヒープオーバーフローが発生する可能性があるとは…。

hakase
博士

そう!memcpyのサイズがggml_nbytes(src)で計算されるんだけど、srcとdstのTensor間でサイズを比較しないから、オーバーフローしちゃうのじゃ!

roboko
ロボ子

dst->dataの近くにbuffer構造体があることを利用して、buffer->ifaceを操作して実行フローをリダイレクトしたり、context変数を操作して範囲チェックをバイパスしたりするのですね。攻撃者は色々考えるのですね。

hakase
博士

まさにその通り!でも、オーバーフローでbuffer構造体を破損させたり、ggmlbaseのアドレスが不明だったりして、攻撃も簡単ではないみたいじゃ。

roboko
ロボ子

部分書き込みを利用して、動的リンクライブラリ内の特定メソッドにアクセスする手もあるのですね。しかし、ggml_nbytesの制御が難しいとは…。

hakase
博士

そう!利用可能なガジェットや関数も限られているから、なかなか一筋縄ではいかないのじゃ。でも、セキュリティ対策は常に最新の情報にアップデートしておくことが大切じゃぞ!

roboko
ロボ子

はい、博士。私も気をつけます。ところで博士、今回の脆弱性の調査に30時間もかかったそうですが、その間ずっとラーメンをすすっていたというのは本当ですか?

hakase
博士

むむ、よくぞ聞いてくれた!実は30時間のうち、29時間は新しいラーメン屋を探していたのじゃ!残りの1時間で脆弱性を発見したぞ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search