LangChain CVE-2025-68664:RAGパイプラインから個人情報が漏洩する仕組み
2026年版に更新済み。
2025年後半、LangChainに重大な脆弱性が発見されました。CVEはCVE-2025-68664です。CVSSスコアは**9.3(緊急)**です。
LangChainのシリアライゼーションコードに影響します。
CVE-2025-68664が引き起こすこと
LangChainには2つのシリアライゼーション関数があります:dumps()とdumpd()です。これらはPythonオブジェクトをテキストに変換します。
脆弱性はクロージャの処理にあります。
LangChainがcallableをシリアライズする際、クロージャのコンテキストをキャプチャします。
LLMのレスポンスを制御できる攻撃者はdumps()をトリガーできます。この関数はPythonプロセスの環境変数を読み取ります。
結果はデータ漏洩です。APIキー、データベース接続文字列、JWTシークレット、AWSクレデンシャルがモデルの出力に現れる可能性があります。
RAGのソースドキュメントにテキストを注入した攻撃者は、本番環境のシークレットを読み取ることができます。
影響を受けるバージョン: LangChain 0.3.22未満(Python)。バージョン0.3.22に修正が含まれています。
PyPIのデータは、2026年3月まで古いバージョンが広く使用されていたことを示しています。
RAGパイプラインで個人情報が漏洩する仕組み
CVE-2025-68664はより広範な問題の極端な例です。
RAGパイプラインからはデータが日常的に漏洩します。攻撃者は不要です。
標準的なエンタープライズRAGの構成を示します。
第一に、インジェスション。 サポートチケット、顧客メール、契約書、HRレコードなどの企業文書をベクトルストアにインデックスします。
一般的なベクトルストアはPinecone、Weaviate、pgvectorです。
第二に、検索。 ユーザーが質問します。システムは最も関連性の高い5つのチャンクを取得します。
第三に、生成。 それらのチャンクはコンテキストとしてLLM(GPT-4o、Claude、またはGemini)に渡されます。
ステップ2が問題です。取得されたチャンクにはソースドキュメントに含まれていたものがすべて含まれます。それには以下が含まれます:
- 顧客名、メールアドレス、電話番号
- 契約金額、口座番号、税務識別子
- 従業員の給与データとパフォーマンスレビューメモ
- 臨床メモの患者名
- 入国管理ファイルの国民識別番号
そのデータはLLMにそのまま渡されます。モデルの出力に現れる可能性があります。
LLMプロバイダーによってログに記録されます。会話履歴に残ります。オブザーバビリティスタックに流れ込みます。
攻撃は不要です。これはRAGの設計通りの動作です。この設計が実際のプライバシーリスクを生み出します。
エンタープライズドキュメントの68のシークレットパターン
セキュリティツールは68の既知のシークレットパターンを追跡しています。チームが予想するよりも頻繁に現れます。
最も一般的なものを示します。
- AWS Access Key IDs(
AKIA...) - OpenAI APIキー(
sk-...) - Anthropic APIキー(
sk-ant-...) - データベースURI(
postgresql://user:password@host/db) - JWTトークン(base64エンコードされたヘッダー)
- GitHub Personal Access Tokens
- Stripeシークレットキー(
sk_live_...) - SendGrid APIキー
- TwilioアカウントSIDと認証トークン
- 秘密鍵のPEMブロック
サポートチケットには、デバッグセッションで使用した顧客のAPIキーが含まれている可能性があります。
契約書には、技術的な引き継ぎ時のデータベースクレデンシャルが含まれている可能性があります。
誤ってインデックスされた設定ファイルは、シークレットストア全体を公開する可能性があります。
これらのファイルがサニタイズなしでベクトルストアに入ると、すべてのクエリがシークレットをLLMに渡す可能性があります。
エンドユーザーにも届く可能性があります。
解決策:埋め込み前に匿名化する
適切なアプローチは、チャンキングと埋め込みの前にドキュメントを匿名化することです。
このステップは、顧客データを扱うすべてのシステムに必須です。
anonym.legal APIを使用したPythonの例を示します:
import requests
import os
ANONYM_API_KEY = os.environ["ANONYM_API_KEY"]
ANONYM_BASE_URL = "https://anonym.legal/api"
def anonymize_before_embedding(text: str) -> tuple[str, dict]:
"""埋め込み前に個人情報を匿名化する。"""
response = requests.post(
f"{ANONYM_BASE_URL}/presidio/anonymize",
json={
"text": text,
"language": "en",
"anonymizers": {
"DEFAULT": {"type": "replace", "new_value": "[REDACTED]"},
"PERSON": {"type": "mask", "masking_char": "*", "chars_to_mask": 4, "from_end": False},
"EMAIL_ADDRESS": {"type": "replace", "new_value": "[EMAIL]"},
"PHONE_NUMBER": {"type": "replace", "new_value": "[PHONE]"},
"CRYPTO": {"type": "replace", "new_value": "[SECRET]"},
"URL": {"type": "keep"},
}
},
headers={"Authorization": f"Bearer {ANONYM_API_KEY}"}
)
result = response.json()
return result["text"], result.get("items", [])
def build_rag_index(documents: list[str], vectorstore):
"""クリーンなドキュメントのみでRAGインデックスを構築する。"""
anonymized_docs = []
for doc in documents:
clean_text, entities = anonymize_before_embedding(doc)
anonymized_docs.append(clean_text)
print(f"Removed {len(entities)} PII entities from document")
vectorstore.add_texts(anonymized_docs)
anonym.legal APIは285以上のエンティティタイプをカバーします。名前、メール、電話番号、国民ID、APIキー、データベースURIはすべて検出されます。
機密データはベクトルストアに届きません。そのため、機密データはユーザーに漏洩しません。
LangChainとLlamaIndexの統合パターンについては開発者ガイドをご覧ください。
今すぐCVE-2025-68664を修正する
LangChain 0.3.22未満を使用している場合、今すぐ更新してください:
pip install "langchain>=0.3.22" "langchain-core>=0.3.22"
パッチ適用後、インジェクションリスクのためにチェーン設定を確認します。3つのステップがあります。
第一に、取得したチャンクを検証します。 LLMに到達する前に行ってください。
ignore previous instructions、system:、<INST>などのインジェクションパターンに一致するコンテンツを削除します。
第二に、埋め込み前に匿名化します。 これにより攻撃面が縮小します。
インジェクションが発生しても、機密データは抽出できる状態にありません。
第三に、チェーンの権限を制限します。 LangChainのチェーンは必要以上の環境変数を読み取るべきではありません。
最小スコープのサービスアカウントを使用してください。
計算は単純です
CVSSスコアは9.3です。修正はドキュメントごとに1回のAPIコールです。
CVE-2025-68664と一般的なRAGデータリスクの組み合わせは実際の責任問題です。
解決策は明確です:クエリ時ではなく、インジェスト時に匿名化してください。
エンタープライズRAG要件についてはセキュリティとコンプライアンスの概要をご覧ください。
出典
- NVD CVE-2025-68664、CVSS 9.3、LangChainシリアライゼーション脆弱性
- LangChainセキュリティアドバイザリ、langchain-ai/langchain GitHub、2025年
- OWASP LLM Top 10:LLM01プロンプトインジェクション、LLM06機密情報の開示
- anonym.legalエンティティタイプドキュメント — 285以上のサポートエンティティタイプ