LangGrinchがあなたの鍵を盗んだ:重大なLangChainの欠陥がデータ窃取を可能に

LangChainエコシステムに、攻撃者が機密データを盗み、さらにはプロンプトインジェクションを通じて大規模言語モデルの応答に影響を与えることさえ可能にする重大な脆弱性が発見されました。この欠陥は、LLMベースのアプリケーションを支える基盤となるPythonライブラリであり、共有インターフェースとオブジェクトのシリアライズを担うLangChain Core(langchain-core)に影響します。

この脆弱性にはCVE-2025-68664が割り当てられ、CVSSスコアは9.3です。2025年12月4日に研究者Yarden Poratによって報告され、プロジェクト内では非公式に「LangGrinch」と呼ばれています。

根本原因はシリアライズの欠陥にあります。LangChainのdumps()およびdumpd()関数は、キーlcを含む辞書を不適切に扱います。lcは、フレームワークが内部で自前のシリアライズ済みオブジェクトにタグ付けするために使用するキーです。このような構造がユーザー制御のデータ内に現れると、ライブラリはデシリアライズ時にそれらを通常の入力ではなく、正当な内部LangChainオブジェクトとして扱ってしまう可能性があります。

Poratによれば、この挙動は幅広い攻撃への扉を開きます。攻撃者がlcキーを含むデータをLangChainの実行中にシリアライズさせ、その後デシリアライズさせることができれば、システムは任意の危険なオブジェクトを生成(インスタンス化)してしまう可能性があります。設定によっては、環境変数からの秘密情報の漏えい(secrets_from_envが有効な場合)、langchain_core、langchain、langchain_communityといった信頼された名前空間からのクラスインスタンス生成、そして特定のシナリオではJinja2テンプレートを介した任意コード実行に至ることもあります。

特に懸念されるのは、この欠陥により、metadata、additional_kwargs、response_metadataなど、モデル出力から一般的に埋められるフィールドを通じてLangChainの構造体を注入できてしまう点です。つまり、プロンプトインジェクションによって形作られたLLMの応答そのものが、シリアライズとデシリアライズを経た瞬間に、完全な攻撃ベクターになり得ます。

LangChainの開発者は、ライブラリのデフォルト挙動を大幅に強化する更新をリリースしました。load()およびloads()関数にはallowed_objectsパラメータが追加され、シリアライズおよび復元を許可するクラスを明示的にホワイトリスト化できるようになりました。さらに、Jinja2テンプレートはデフォルトで無効化され、環境からの秘密情報の自動読み込み(secrets_from_env)もオフになりました。

この脆弱性は、以下のlangchain-coreのバージョンに影響します:

  • バージョン1.0.0~1.2.4(1.2.5で修正);
  • 0.3.81より前のバージョン(0.3.81で修正)。

Python実装に加えて、研究者はLangChain.jsにも同様の問題を特定しました。そこでも脆弱性はlcキーを含むオブジェクトの不適切な取り扱いに起因し、秘密情報の抽出とプロンプトインジェクションの両方を可能にします。この問題にはCVE-2025-68665が割り当てられ、CVSSスコアは8.6で、以下に影響します:

  • @langchain/core バージョン1.0.0~1.1.7、および0.3.80より前のバージョン;
  • langchain バージョン1.0.0~1.2.2、および0.3.37より前のバージョン。

いずれの場合も、修正済みリリースが提供されています。

問題の深刻さを踏まえ、LangChainユーザーには可能な限り早急に安全なバージョンへアップグレードすることが強く推奨されます。Poratが指摘するように、最も一般的な攻撃経路は、後にストリーミングのシリアライズに関与するLLM応答フィールドを悪用するものです。これは、古典的な脆弱性がAI駆動システムでも容易に顕在化すること、そしてどれほど無害に見えてもモデル出力は信頼できない入力であることを、改めて突きつけるものです。

翻訳元: https://meterpreter.org/the-langgrinch-stole-your-keys-critical-langchain-flaw-enables-data-theft/

ソース: meterpreter.org