anonym.legal
Terug na BlogTegnies

LangChain CVE-2025-68664: Hoe PII Deur Jou RAG-pyplyn Lek

CVSS 9.3. LangChain se serialisasiefunksies stel omgewingsveranderlikes en geheime bloot aan aanvaller-beheerde LLM's. Hoe om PII-lekkasies op te spoor en reg te stel.

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

LangChain CVE-2025-68664: Hoe PII Deur Jou RAG-pyplyn Lek

Bygewerk vir 2026.

'n Kritiese fout is laat in 2025 in LangChain gevind. Die CVE is CVE-2025-68664. Die CVSS-telling is 9.3 (Krities).

Dit teiken LangChain se serialisasiekode.

Wat CVE-2025-68664 Doen

LangChain het twee serialisasiefunksies: dumps() en dumpd(). Hulle skakel Python-voorwerpe na teks om.

Die fout is in sluitingshantering.

Wanneer LangChain 'n oproepbare serialiseer, vang dit die sluitingskonteks.

'n Aanvaller wat die LLM-reaksie beheer, kan dumps() aktiveer. Die funksie lees dan omgewingsveranderlikes van die Python-proses.

Die resultaat is datablootstelling. API-sleutels, databasisstrengs, JWT-geheime en AWS-geloofsbriewe kan in modeluitvoer verskyn.

'n Aanvaller wat teks in 'n RAG-brondokument inspuit, kan jou produksiegeheime lees.

Geaffekteerde weergawes: LangChain onder 0.3.22 (Python). Weergawe 0.3.22 het die oplossing.

PyPI-data toon wydverspreide gebruik van ouer weergawes deur Maart 2026.

Hoe PII in RAG-pylyne Lek

CVE-2025-68664 is dramaties. Maar dit is slegs een geval van 'n breër probleem.

Data lek gereeld deur RAG-pylyne. Geen aanvaller is nodig nie.

Hier is 'n standaard ondernemings-RAG-opstelling.

Eerstens, inname. Jy indekseer maatskappydokumente in 'n vektorbewaarplaas. Dink aan ondersteuningskaartjies, kliente-e-posse, kontrakte en MR-rekords.

Gewone vektorbewaarplekke is Pinecone, Weaviate en pgvector.

Volgende, herwinning. 'n Gebruiker stel 'n vraag. Die stelsel trek die vyf mees relevante stukke uit die bewaarplaas.

Dan, generasie. Daardie stukke gaan na 'n LLM -- GPT-4o, Claude of Gemini -- as konteks.

Stap twee is die probleem. Herwonne stukke bevat wat die brondokumente bevat het. Dit sluit in:

  • Kliente-name, e-posadresse en telefoonnommers
  • Kontrakwaardes, rekeningnommers en belastingidentifiseerders
  • Werknemer-salaridata en prestasiebeoordeling-notas
  • Pasientname in kliniese notas
  • Nasionale ID-nommers in immigrasieleers

Daardie data gaan as-is na die LLM. Dit kan in modeluitvoer verskyn.

Dit word aangeteken deur die LLM-verskaffer. Dit sit in jou gespreksgeskiedenis. Dit vloei in jou waarneembaarheids-stapel.

Geen aanval is nodig nie. Dit is hoe RAG by ontwerp werk. Die ontwerp skep werklike privaatheidsrisiko.

68 Geheimpatrone in Ondernemingsdokumentbewaarplekke

Sekuriteitsinstrumente volg 68 bekende geheimpatrone. Hulle verskyn meer dikwels as wat spanne verwag.

Hier is die mees algemene.

  • AWS Access Key ID's (AKIA...)
  • OpenAI API-sleutels (sk-...)
  • Anthropic API-sleutels (sk-ant-...)
  • Databasis-URI's (postgresql://user:password@host/db)
  • JWT-tekens (base64-gekodeerde opskrifte)
  • GitHub Personal Access Tokens
  • Stripe-geheimsleutels (sk_live_...)
  • SendGrid API-sleutels
  • Twilio-rekeningsid's en verifikasietekens
  • Private sleutel PEM-blokke

'n Ondersteuningskaartjie mag 'n klient-API-sleutel bevat uit 'n ontfoutsessie.

'n Kontrak mag databasisgeloofsbriewe insluit uit 'n tegniese oorhandiging.

'n Konfigurasieleer wat per ongeluk geindekseer is, kan 'n hele geheimebewaarplaas blootstel.

Wanneer hierdie leers 'n vektorbewaarplaas sonder sanering binnegaan, kan elke navraag die geheime na die LLM stuur.

Hulle mag ook die eindgebruiker bereik.

Los Dit Op: Anonimiseer Voor Inbedding

Die regte benadering anonimiseer dokumente voor stukke en inbedding.

Hierdie stap is vereis vir enige stelsel wat klientedata hanteer.

Hier is 'n Python-voorbeeld met die 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 inbedding."""
    response = requests.post(
        f"{ANONYM_BASE_URL}/presidio/anonymize",
        json={
            "text": text,
            "language": "en",
            "anonymizers": {
                "DEFAULT": {"type": "replace", "new_value": "[GEREDAKTEER]"},
                "PERSON": {"type": "mask", "masking_char": "*", "chars_to_mask": 4, "from_end": False},
                "EMAIL_ADDRESS": {"type": "replace", "new_value": "[E-POS]"},
                "PHONE_NUMBER": {"type": "replace", "new_value": "[FOON]"},
                "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):
    """Bou 'n RAG-indeks met skoon dokumente slegs."""
    anonymized_docs = []
    for doc in documents:
        clean_text, entities = anonymize_before_embedding(doc)
        anonymized_docs.append(clean_text)
        print(f"Verwyder {len(entities)} PII-entiteite van dokument")
    vectorstore.add_texts(anonymized_docs)

Die anonym.legal API dek 285+ entiteitstipes. Name, e-posse, telefoonnommers, nasionale ID's, API-sleutels en databasis-URI's word alles gevang.

Niks sensitiefs bereik die vektorbewaarplaas nie. So niks sensitiefs kan na gebruikers lek nie.

Sien die ontwikkelaarsgids vir LangChain- en LlamaIndex-opstelingpatrone.

Los CVE-2025-68664 Nou Reg

As jy LangChain onder 0.3.22 laat loop, dateer nou op:

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

Na die pleistering, kontroleer jou kettingkonfigurasies vir inspuiting-risiko. Hier is drie stappe om te neem.

Eerstens, bevestig herwonne stukke. Doen dit voordat hulle die LLM bereik.

Stroop inhoud wat ooreenstem met inspuitingspatrone soos ignoreer vorige instruksies, stelsel: of <INST>.

Tweedens, anonimiseer voor inbedding. Dit verklein die aanvalsoppervlak.

As inspuiting wel plaasvind, is die sensitiewe data nie daar om te onttrek nie.

Derdens, beperk kettingtoestemmings. LangChain-kettings behoort nie omgewingsveranderlikes te lees buite wat hulle benodig nie.

Gebruik 'n diensrekening met minimale omvang.

Die Wiskunde Is Eenvoudig

Die CVSS-telling is 9.3. Die oplossing is een API-oproep per dokument.

Die kombinasie van CVE-2025-68664 en algemene RAG-datarisiko is 'n werklike aanspreeklikheid.

Die oplossing is duidelik: anonimiseer by inname, nie by navraag-tyd nie.

Kontroleer die sekuriteit- en nakomingsoorsig vir ondernemings-RAG-vereistes.

Bronne

  • NVD CVE-2025-68664, CVSS 9.3, LangChain serialisasie-kwesbaarheid
  • LangChain sekuriteitsadvies, langchain-ai/langchain GitHub, 2025
  • OWASP LLM Top 10: LLM01 Aansporingsinjeksie, LLM06 Sensitiewe Inligtingopenbaring
  • anonym.legal entiteitstipe-dokumentasie -- 285+ ondersteunde entiteitstipes

Gereed om u data te beskerm?

Begin om PII te anonimiseer met 285+ entiteitstipes in 48 tale.

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.