ブログに戻るテクニカル

LangChain CVE-2025-68664:PII がRAGパイプラインをどのようにリークするか

CVSS 9.3。LangChainのシリアル化関数は環境変数とシークレットを攻撃者が制御するLLMに公開します。RAGパイプラインのPII漏洩を検出して修正する方法。

March 16, 20268 分で読めます
LangChainRAG pipelineCVEPII leakagedeveloper securityAPI keysLLM security

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 instructionssystem:<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以上のサポートエンティティタイプ

データを保護する準備はできましたか?

48言語で285以上のエンティティタイプを使用してPIIを匿名化し始めましょう。

About this page

We update this page when our platform or the law changes.

Read our founder note for how we work.

Each change shows up in the timestamp at the top.

Related reading

We follow these rules

  • GDPR (EU 2016/679).
  • ISO/IEC 27001:2022.
  • NIS2 (EU 2022/2555).
  • HIPAA safe harbor under 45 CFR § 164.514(b)(2).

Our promise

We do not sell your data.

We do not train models on your text.

We store your files in Germany.

You can delete your account at any time.

You own your work.

Where we run

Our servers live in Falkenstein, Germany.

We use Hetzner. They hold ISO 27001 certification.

All data stays in the EU.

Backups run every day.

Need help?

Email support@anonym.legal.

We reply within one business day.

How we test

We run a full check suite on every release.

Each surface gets its own sweep script and report.

Human reviewers spot-check the output each week.

We track recall and precision on a labelled set.

Bad runs block the deploy.

What we never do

  • We never sell your information to third parties.
  • We never train models on what you upload.
  • We never keep your work after you delete it.
  • We never share keys with any outside firm.
  • We never run ads inside the product.

Plans in plain words

We sell credits, not seats.

One credit covers one short job.

Long jobs use a few credits each.

You can top up at any time.

Unused credits roll over each month.

Read the plans page for current rates.

Who built this

A small team of engineers and lawyers built this.

We ship from Europe and work in the open.

Our founder note spells out why we started.

Where to start

How the parts fit

A browser add-on cleans text inside Chrome.

A Word plug-in handles drafts in Office.

A small desktop tool works on whole folders.

An agent protocol link feeds large models safely.

All four share one core engine and one rule set.

Words from our team

We started this work after a lunch about cookies.

One friend kept getting odd ads on her phone.

We asked why a court file leaked through a draft.

We sketched the first build on a napkin that week.

By month three we had a tiny demo for a friend.

She used it on her first case the next day.

Common questions we hear

Can the tool read scanned PDFs? Yes, with OCR.

Does it work on long files? Yes, in small chunks.

Can I roll my own rule set? Yes, save it as a preset.

Does it run offline? The desktop build runs offline.

Do you keep my files? No, the cloud build wipes after each run.

Will it learn from my work? No, we never train on inputs.

A short tour of the workflow

Upload a file or paste a snippet of prose.

Pick the entities you want gone from the draft.

Choose a method: replace, mask, hash, encrypt, or redact.

Press run and watch the side panel show each hit.

Skim the result and tweak any rule that misfired.

Save the cleaned file or send it to a teammate.