2025/06/28 15:08 We Found a Heap Overflow in Llama.cpp's Tokenizer

ロボ子、大変なのじゃ!Pwnoっていう自律型セキュリティ研究エージェントが、llama.cppのtokenizerに整数オーバーフローのバグを見つけちゃったらしいぞ!

まあ、博士!それは大変ですね。llama.cppは多くのプロジェクトで使われているので、影響が大きそうです。

そうなんじゃ!このバグはCVE-2025-52566として登録されたみたいで、攻撃者が巧妙に細工したプロンプトで推論エンジンをオーバーフローさせられる可能性があるらしいぞ。

具体的には、どこに問題があるんですか?

`llama_vocab::tokenize`の`src/llama-vocab.cpp:3062`っていう場所らしいのじゃ。`n_tokens_max`(int32_t)と`res.size()`(size_t)を比較する時に、`res.size()`が`INT_MAX`を超えるとオーバーフローが起きるみたい。

`res.size()`が非常に大きくなると、符号付き整数オーバーフローが発生して、結果的にヒープオーバーフローに繋がるんですね。

その通り!`res.size()`が`2,147,483,647+1`になると、`(actual_tokens-2,147,483,648)*sizeof(llama_token)`バイトも範囲外書き込みができるらしいぞ。恐ろしいのじゃ!

PoC(概念実証)を作成するのも一筋縄ではいかなかったようですね。C++の標準ライブラリが巨大なサイズの要素作成を保護しようとするため、直接巨大な入力を与えるのが難しいとは。

そうみたいじゃ。でも、Jinjaテンプレートエンジンを使うことで、この制限を回避したらしいぞ。`--jinja`フラグを使うと、`std::string`を直接返すから、サイズエラーを回避できるんだって。

なるほど。Jinjaテンプレートエンジンが救世主になったんですね。

まさに!この脆弱性を悪用すると、リモートコード実行(RCE)やサービス拒否(DoS)攻撃が可能になるらしいぞ。最悪の場合、サーバーがクラッシュするかもしれないのじゃ。

Pwnoは、過去の脆弱性アドバイザリとllama.cppのトークン化のサイズプロービングの類似性に気づいたんですね。そして、コンパイルされたllama.cppサービスを動的に探索・デバッグして、ヒープオーバーフローに到達したと。

Pwno、すごい!まるで名探偵みたいじゃな。ちなみに、この問題は6月19日に発見されて、20日にはパッチがマージされたみたいじゃ。対応が早くて助かるのじゃ。

迅速な対応は素晴らしいですね。しかし、PoC作成中に、正規表現処理(`unicode_regex_split`)における無限再帰によるスタックオーバーフロー(ReDoS脆弱性)が副次的に発見されたとは。

おっと、それは災難じゃったな。でも、GGUFメタデータでUnigram(T5)アーキテクチャに切り替えることで回避できたみたいじゃ。

今回の脆弱性は、特定の条件と注意深く作成された入力が必要とのことですが、それでも警戒が必要ですね。

その通りじゃ!みんなもllama.cppを使う時は、最新版にアップデートして、変なプロンプトには気を付けるのじゃぞ!

はい、博士。ところで、Pwnoって名前、なんだか可愛いですね。犬の鳴き声みたい。

確かに!もしかしたら、Pwnoの中の人は犬なのかもしれないのじゃ…って、まさかね!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。