anonym.legal
Terug naar BlogTechnisch

LangChain CVE-2025-68664: Hoe PII Lekt Via Uw RAG-pipeline

CVSS 9,3. De serialisatiefuncties van LangChain leggen omgevingsvariabelen en geheimen bloot aan door aanvallers beheerde LLM's. Hoe u PII-lekken detecteert en verhelpt.

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

LangChain CVE-2025-68664: Hoe PII Lekt Via Uw RAG-pipeline

Bijgewerkt voor 2026.

Eind 2025 werd een kritieke kwetsbaarheid gevonden in LangChain. De CVE is CVE-2025-68664. De CVSS-score is 9,3 (Kritiek).

De kwetsbaarheid richt zich op de serialisatiecode van LangChain.

Wat CVE-2025-68664 Doet

LangChain heeft twee serialisatiefuncties: dumps() en dumpd(). Ze zetten Python-objecten om naar tekst.

De kwetsbaarheid zit in de afhandeling van closures.

Wanneer LangChain een callable serialiseert, legt het de closure-context vast.

Een aanvaller die de LLM-reactie beheerst, kan dumps() activeren. De functie leest dan omgevingsvariabelen uit het Python-proces.

Het resultaat is gegevensblootstelling. API-sleutels, databaseverbindingsstrings, JWT-geheimen en AWS-credentials kunnen in modeluitvoer verschijnen.

Een aanvaller die tekst injecteert in een RAG-brondocument kan uw productiegeheimen uitlezen.

Getroffen versies: LangChain onder 0.3.22 (Python). Versie 0.3.22 bevat de fix.

PyPI-data toont wijdverbreid gebruik van oudere versies tot en met maart 2026.

Hoe PII Lekt in RAG-pipelines

CVE-2025-68664 is dramatisch. Maar het is slechts één geval van een breder probleem.

Gegevens lekken routinematig via RAG-pipelines. Er is geen aanvaller voor nodig.

Hier is een standaard enterprise-RAG-configuratie.

Ten eerste, ingestie. U indexeert bedrijfsdocumenten in een vectoropslag. Denk aan supporttickets, klantmails, contracten en HR-gegevens.

Veelgebruikte vectoropslagen zijn Pinecone, Weaviate en pgvector.

Vervolgens, ophaling. Een gebruiker stelt een vraag. Het systeem haalt de vijf meest relevante fragmenten op uit de opslag.

Dan, generatie. Die fragmenten gaan als context naar een LLM — GPT-4o, Claude of Gemini.

Stap twee is het probleem. Opgehaalde fragmenten bevatten wat de brondocumenten bevatten. Dat omvat:

  • Klantnamen, e-mailadressen en telefoonnummers
  • Contractwaarden, accountnummers en belastingidentificatoren
  • Salaris- en beoordelingsgegevens van werknemers
  • Patiëntnamen in klinische notities
  • Nationale ID-nummers in immigratiebestanden

Die gegevens gaan onbewerkt naar het LLM. Ze kunnen in modeluitvoer verschijnen.

Ze worden gelogd door de LLM-aanbieder. Ze staan in uw gespreksgeschiedenis. Ze stromen door naar uw observatiestack.

Er is geen aanval voor nodig. Zo werkt RAG by design. En dat ontwerp creëert een reëel privacyrisico.

68 Geheimpatronen in Enterprise-documentopslagen

Beveiligingstools volgen 68 bekende geheimpatronen. Ze komen vaker voor dan teams verwachten.

De meest voorkomende:

  • AWS Access Key ID's (AKIA...)
  • OpenAI API-sleutels (sk-...)
  • Anthropic API-sleutels (sk-ant-...)
  • Database-URI's (postgresql://gebruiker:wachtwoord@host/db)
  • JWT-tokens (base64-gecodeerde headers)
  • GitHub Personal Access Tokens
  • Stripe-geheime sleutels (sk_live_...)
  • SendGrid API-sleutels
  • Twilio account-SID's en authenticatietokens
  • Private key PEM-blokken

Een supportticket kan een API-sleutel van een klant bevatten uit een debugsessie.

Een contract kan databasecredentials bevatten uit een technische overdracht.

Een configuratiebestand dat per ongeluk is geïndexeerd, kan een complete geheimopslag blootleggen.

Wanneer deze bestanden zonder sanitisatie in een vectoropslag terechtkomen, kan elke query de geheimen doorgeven aan het LLM.

Ze kunnen ook de eindgebruiker bereiken.

De Fix: Anonimiseer Voor het Insluiten

De juiste aanpak anonimiseert documenten vóór het opdelen in chunks en insluiten.

Deze stap is verplicht voor elk systeem dat klantgegevens verwerkt.

Hier is een Python-voorbeeld met de 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]:
    """Anonimiseer PII voor het insluiten."""
    response = requests.post(
        f"{ANONYM_BASE_URL}/presidio/anonymize",
        json={
            "text": text,
            "language": "en",
            "anonymizers": {
                "DEFAULT": {"type": "replace", "new_value": "[GEREDIGEERD]"},
                "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": "[TELEFOON]"},
                "CRYPTO": {"type": "replace", "new_value": "[GEHEIM]"},
                "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):
    """Bouw een RAG-index met uitsluitend schone documenten."""
    anonymized_docs = []
    for doc in documents:
        clean_text, entities = anonymize_before_embedding(doc)
        anonymized_docs.append(clean_text)
        print(f"{len(entities)} PII-entiteiten verwijderd uit document")
    vectorstore.add_texts(anonymized_docs)

De anonym.legal API dekt 285+ entiteitstypen. Namen, e-mailadressen, telefoonnummers, nationale ID's, API-sleutels en database-URI's worden allemaal opgepikt.

Er bereikt niets gevoeligs de vectoropslag. Dus kan er ook niets gevoeligs lekken naar gebruikers.

Zie de ontwikkelaarsgids voor LangChain- en LlamaIndex-setuppatronen.

Herstel CVE-2025-68664 Nu Meteen

Als u LangChain onder 0.3.22 gebruikt, update nu:

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

Controleer na het patchen uw chain-configuraties op injectierisico. Hier zijn drie stappen.

Ten eerste, valideer opgehaalde chunks voordat ze het LLM bereiken.

Verwijder content die overeenkomt met injectiepatronen zoals ignore previous instructions, system: of <INST>.

Ten tweede, anonimiseer voor het insluiten. Dit verkleint het aanvalsoppervlak.

Als injectie toch plaatsvindt, zijn de gevoelige gegevens er niet om te extraheren.

Ten derde, beperk chain-rechten. LangChain-chains mogen geen omgevingsvariabelen lezen buiten wat ze nodig hebben.

Gebruik een serviceaccount met minimale reikwijdte.

De Wiskunde Is Eenvoudig

De CVSS-score is 9,3. De fix is één API-aanroep per document.

De combinatie van CVE-2025-68664 en het algemene RAG-gegevensrisico is een reële aansprakelijkheid.

De oplossing is duidelijk: anonimiseer bij ingestie, niet bij querytijd.

Zie het beveiligings- en complianceoverzicht voor enterprise-RAG-vereisten.

Bronnen

  • NVD CVE-2025-68664, CVSS 9,3, LangChain-serialisatiekwetsbaarheid
  • LangChain-beveiligingsadvies, langchain-ai/langchain GitHub, 2025
  • OWASP LLM Top 10: LLM01 Promptinjectie, LLM06 Openbaarmaking van gevoelige informatie
  • anonym.legal entiteitstype-documentatie — 285+ ondersteunde entiteitstypen

Klaar om uw gegevens te beschermen?

Begin met het anonimiseren van PII met 285+ entiteitstypen in 48 talen.

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.