Zurück zum BlogTechnisch

LangChain CVE-2025-68664: Wie PII durch deine...

CVSS 9.3. LangChain-Serialisierungsfunktionen setzen Umgebungsvariablen und Secrets für von Angreifern kontrollierte LLMs aus.

March 16, 20268 min Lesezeit
LangChainRAG pipelineCVEPII leakagedeveloper securityAPI keysLLM security

LangChain CVE-2025-68664: Wie personenbezogene Daten aus Ihrer RAG-Pipeline lecken

Aktualisiert für 2026.

In LangChain wurde Ende 2025 eine kritische Schwachstelle entdeckt. Die CVE-Nummer lautet CVE-2025-68664. Der CVSS-Score beträgt 9.3 (Kritisch).

Die Schwachstelle betrifft den Serialisierungscode von LangChain.

Was CVE-2025-68664 bewirkt

LangChain verfügt über zwei Serialisierungsfunktionen: dumps() und dumpd(). Sie wandeln Python-Objekte in Text um.

Der Fehler liegt in der Verarbeitung von Closures.

Wenn LangChain ein Callable serialisiert, erfasst es den Closure-Kontext.

Ein Angreifer, der die LLM-Antwort kontrolliert, kann dumps() auslösen. Die Funktion liest dann Umgebungsvariablen aus dem Python-Prozess.

Das Ergebnis ist ein Datenleck. API-Schlüssel, Datenbankstrings, JWT-Secrets und AWS-Zugangsdaten können in der Modellausgabe erscheinen.

Ein Angreifer, der Text in ein RAG-Quelldokument einschleust, kann Ihre Produktionsgeheimnisse lesen.

Betroffene Versionen: LangChain unter 0.3.22 (Python). Version 0.3.22 enthält den Fix.

PyPI-Daten zeigen eine weit verbreitete Nutzung älterer Versionen bis März 2026.

Wie personenbezogene Daten in RAG-Pipelines lecken

CVE-2025-68664 ist ein extremes Beispiel für ein weitreichenderes Problem.

Daten lecken routinemäßig durch RAG-Pipelines. Kein Angreifer ist dafür notwendig.

Hier ist ein typisches Enterprise-RAG-Setup.

Erstens: Ingestion. Sie indizieren Unternehmensdokumente in einem Vektorspeicher. Denken Sie an Support-Tickets, Kunden-E-Mails, Verträge und HR-Unterlagen.

Gängige Vektorspeicher sind Pinecone, Weaviate und pgvector.

Zweitens: Abruf. Ein Nutzer stellt eine Frage. Das System ruft die fünf relevantesten Chunks ab.

Drittens: Generierung. Diese Chunks werden einem LLM — GPT-4o, Claude oder Gemini — als Kontext übergeben.

Schritt zwei ist das Problem. Abgerufene Chunks enthalten alles, was die Quelldokumente enthielten. Dazu gehören:

  • Kundennamen, E-Mail-Adressen und Telefonnummern
  • Vertragswerte, Kontonummern und Steueridentifikatoren
  • Gehaltsangaben und Beurteilungsnotizen von Mitarbeitern
  • Patientennamen in klinischen Berichten
  • Nationale Ausweisnummern in Einwanderungsdokumenten

Diese Daten werden unverändert an das LLM weitergegeben. Sie können in der Modellausgabe erscheinen.

Sie werden vom LLM-Anbieter protokolliert. Sie verbleiben in Ihrem Gesprächsverlauf. Sie fließen in Ihren Observability-Stack ein.

Kein Angriff ist nötig. So funktioniert RAG per Design. Dieses Design schafft ein echtes Datenschutzrisiko.

68 Geheimmuster in Unternehmensdokumenten

Sicherheitswerkzeuge verfolgen 68 bekannte Geheimmuster. Sie tauchen häufiger auf, als Teams erwarten.

Hier die häufigsten:

  • AWS Access Key IDs (AKIA...)
  • OpenAI API-Schlüssel (sk-...)
  • Anthropic API-Schlüssel (sk-ant-...)
  • Datenbank-URIs (postgresql://user:password@host/db)
  • JWT-Token (base64-kodierte Header)
  • GitHub Personal Access Tokens
  • Stripe-Geheimschlüssel (sk_live_...)
  • SendGrid API-Schlüssel
  • Twilio Account-SIDs und Auth-Token
  • PEM-Blöcke für private Schlüssel

Ein Support-Ticket kann einen API-Schlüssel eines Kunden aus einer Debug-Sitzung enthalten.

Ein Vertrag kann Datenbankzugangsdaten aus einer technischen Übergabe beinhalten.

Eine versehentlich indizierte Konfigurationsdatei kann einen gesamten Geheimspeicher offenlegen.

Wenn diese Dateien ohne Bereinigung in einen Vektorspeicher gelangen, kann jede Anfrage die Secrets an das LLM weitergeben.

Sie können auch den Endnutzer erreichen.

Die Lösung: Anonymisieren vor dem Einbetten

Der richtige Ansatz anonymisiert Dokumente vor dem Chunking und Einbetten.

Dieser Schritt ist für jedes System erforderlich, das Kundendaten verarbeitet.

Hier ist ein Python-Beispiel mit der anonym.legal API:

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]:
    """PII vor dem Einbetten anonymisieren."""
    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-Index nur mit bereinigten Dokumenten aufbauen."""
    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)

Die anonym.legal API deckt 285+ Entitätstypen ab. Namen, E-Mails, Telefonnummern, nationale IDs, API-Schlüssel und Datenbank-URIs werden alle erkannt.

Keine sensiblen Daten erreichen den Vektorspeicher. Damit können keine sensiblen Daten zu Nutzern durchsickern.

Weitere Muster für LangChain und LlamaIndex finden Sie im Entwicklerhandbuch.

CVE-2025-68664 jetzt beheben

Wenn Sie LangChain unter 0.3.22 betreiben, aktualisieren Sie jetzt:

pip install "langchain>=0.3.22" "langchain-core>=0.3.22"

Prüfen Sie nach dem Patchen Ihre Chain-Konfigurationen auf Injection-Risiken. Hier sind drei Schritte.

Erstens: Abgerufene Chunks validieren. Tun Sie dies, bevor sie das LLM erreichen.

Entfernen Sie Inhalte, die Injection-Mustern entsprechen, wie ignore previous instructions, system: oder <INST>.

Zweitens: Vor dem Einbetten anonymisieren. Das verkleinert die Angriffsfläche.

Falls Injection doch auftritt, sind die sensiblen Daten nicht mehr vorhanden.

Drittens: Chain-Berechtigungen einschränken. LangChain-Chains sollten nur die nötigen Umgebungsvariablen lesen.

Verwenden Sie ein Dienstkonto mit minimalem Umfang.

Die Mathematik ist einfach

Der CVSS-Score beträgt 9.3. Der Fix ist ein API-Aufruf pro Dokument.

Die Kombination aus CVE-2025-68664 und allgemeinem RAG-Datenrisiko ist eine echte Haftung.

Die Lösung ist klar: Anonymisieren bei der Ingestion, nicht zur Abfragezeit.

Lesen Sie die Sicherheits- und Compliance-Übersicht für Enterprise-RAG-Anforderungen.

Quellen

  • NVD CVE-2025-68664, CVSS 9.3, LangChain-Serialisierungsschwachstelle
  • LangChain-Sicherheitshinweis, langchain-ai/langchain GitHub, 2025
  • OWASP LLM Top 10: LLM01 Prompt Injection, LLM06 Offenlegung sensibler Informationen
  • anonym.legal Entitätstyp-Dokumentation — 285+ unterstützte Entitätstypen

Bereit, Ihre Daten zu schützen?

Beginnen Sie mit der Anonymisierung von PII mit über 285 Entitätstypen in 48 Sprachen.

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.