Takaisin BlogiinTekninen

LangChain CVE-2025-68664: Miten PII vuotaa RAG-putkistosi läpi

CVSS 9,3. LangChainin serialisointifunktiot paljastavat ympäristömuuttujat ja salaisuudet hyökkääjän hallitsemille kielimalleille. Miten havaita ja korjata PII-vuodot.

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

LangChain CVE-2025-68664: Miten PII vuotaa RAG-putkistosi läpi

Päivitetty vuodelle 2026.

LangChainissa löydettiin kriittinen haavoittuvuus vuoden 2025 lopulla. CVE on CVE-2025-68664. CVSS-pistemäärä on 9,3 (Kriittinen).

Se kohdistuu LangChainin serialisointikoodiin.

Mitä CVE-2025-68664 tekee

LangChainilla on kaksi serialisointifunktiota: dumps() ja dumpd(). Ne muuntavat Python-objekteja tekstiksi.

Haavoittuvuus on sulkeumien käsittelyssä.

Kun LangChain serialisoi kutsuttavan, se sieppaa sulkeumakontekstin.

Hyökkääjä, joka hallitsee LLM:n vastausta, voi käynnistää dumps()-funktion. Funktio lukee sitten Python-prosessin ympäristömuuttujia.

Tuloksena on tietovuoto. API-avaimet, tietokantayhteysmerkkijonot, JWT-salaisuudet ja AWS-tunnisteet voivat ilmaantua mallin tulosteeseen.

Hyökkääjä, joka injektoi tekstiä RAG-lähdedokumenttiin, voi lukea tuotantoympäristösi salaisuudet.

Vaikuttavat versiot: LangChain alle 0.3.22 (Python). Versio 0.3.22 sisältää korjauksen.

PyPI-tiedot osoittavat vanhojen versioiden laajan käytön maaliskuuhun 2026 asti.

Miten PII vuotaa RAG-putkistoista

CVE-2025-68664 on dramaattinen. Mutta se on vain yksi tapaus laajemmasta ongelmasta.

Tiedot vuotavat RAG-putkistojen läpi säännöllisesti. Hyökkääjää ei tarvita.

Tässä on tyypillinen yritystason RAG-asennus.

Ensin, indeksointi. Indeksoit yrityksen dokumentit vektorivarastoon. Ajattele tukipyyntöjä, asiakassähköposteja, sopimuksia ja HR-tietueita.

Yleisiä vektorivarastoja ovat Pinecone, Weaviate ja pgvector.

Seuraavaksi, haku. Käyttäjä esittää kysymyksen. Järjestelmä noutaa viisi osuvinta palaa varastosta.

Sitten, generointi. Nämä palat lähetetään LLM:lle — GPT-4o:lle, Claudelle tai Geminille — kontekstina.

Vaihe kaksi on ongelma. Haetut palat sisältävät kaiken, mitä lähde-dokumentit sisälsivät. Tähän kuuluu:

  • Asiakkaiden nimet, sähköpostiosoitteet ja puhelinnumerot
  • Sopimusarvot, tilinumerot ja verotunnisteet
  • Työntekijöiden palkkatiedot ja suoritusarviointimuistiinpanot
  • Potilaiden nimet kliinisissä muistiinpanoissa
  • Kansalliset tunnistenumerot maahanmuuttoasiakirjoissa

Nämä tiedot lähetetään LLM:lle sellaisenaan. Ne voivat ilmaantua mallin tulosteeseen.

LLM-palveluntarjoaja kirjaa ne. Ne säilyvät keskusteluhistoriassasi. Ne virtaavat havainnointipinoon.

Hyökkäystä ei tarvita. Näin RAG toimii suunnittelun mukaan. Suunnittelu luo todellisen yksityisyysriskin.

68 salaisuusmallia yrityksen dokumenttivarastoissa

Tietoturvatyökalut seuraa 68 tunnettua salaisuusmallia. Ne esiintyvät useammin kuin tiimit odottavat.

Tässä ovat yleisimmät.

  • AWS Access Key ID:t (AKIA...)
  • OpenAI API-avaimet (sk-...)
  • Anthropic API-avaimet (sk-ant-...)
  • Tietokantaurlit (postgresql://user:password@host/db)
  • JWT-tokenit (base64-koodatut otsikot)
  • GitHub Personal Access Token -avaimet
  • Stripe-salaiset avaimet (sk_live_...)
  • SendGrid API-avaimet
  • Twilio-tilin SID:t ja todennustokenit
  • Yksityisavain PEM-lohkot

Tukipyyntö voi sisältää asiakkaan API-avaimen virheenkorjausistunnosta.

Sopimus voi sisältää tietokantakredentiaalit teknisestä luovutuksesta.

Vahingossa indeksoitu konfigurointitiedosto voi paljastaa koko salaisuusvaraston.

Kun nämä tiedostot siirtyvät vektorivarastoon ilman sanitointia, jokainen kysely voi välittää salaisuudet LLM:lle.

Ne voivat tavoittaa loppukäyttäjänkin.

Korjaus: Anonymisoi ennen upottamista

Oikea lähestymistapa anonymisoi dokumentit ennen paloittelua ja upottamista.

Tämä vaihe vaaditaan miltä tahansa järjestelmältä, joka käsittelee asiakastietoja.

Tässä on Python-esimerkki käyttäen anonym.legal API:a:

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]:
    """Anonymisoi PII ennen upottamista."""
    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):
    """Rakenna RAG-indeksi vain puhtaista dokumenteista."""
    anonymized_docs = []
    for doc in documents:
        clean_text, entities = anonymize_before_embedding(doc)
        anonymized_docs.append(clean_text)
        print(f"Poistettu {len(entities)} PII-entiteettiä dokumentista")
    vectorstore.add_texts(anonymized_docs)

anonym.legal API kattaa 285+ entiteettityyppiä. Nimet, sähköpostiosoitteet, puhelinnumerot, kansalliset tunnisteet, API-avaimet ja tietokantaurlit kaikki havaitaan.

Mikään arkaluonteinen ei tavoita vektorivarastoa. Joten mikään arkaluonteinen ei voi vuotaa käyttäjille.

Katso kehittäjäoppaasta LangChain- ja LlamaIndex-asetusmallit.

Korjaa CVE-2025-68664 heti nyt

Jos käytät LangChainia alla version 0.3.22, päivitä nyt:

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

Päivityksen jälkeen tarkista ketjukonfiguraatiosi injektioriskin varalta. Tässä on kolme toimenpidettä.

Ensin, validoi haetut palat. Tee tämä ennen kuin ne saavuttavat LLM:n.

Poista sisältö, joka vastaa injektiomalleja kuten ignore previous instructions, system: tai <INST>.

Toiseksi, anonymisoi ennen upottamista. Tämä pienentää hyökkäyspinta-alaa.

Jos injektio tapahtuu, arkaluonteisia tietoja ei ole siellä poimittavissa.

Kolmanneksi, rajoita ketjuoikeuksia. LangChain-ketjujen ei pitäisi lukea ympäristömuuttujia enemmän kuin ne tarvitsevat.

Käytä palvelutiliä minimaalisella laajuudella.

Matematiikka on yksinkertainen

CVSS-pistemäärä on 9,3. Korjaus on yksi API-kutsu dokumenttia kohti.

CVE-2025-68664:n ja yleisen RAG-datriskin yhdistelmä on todellinen riski.

Ratkaisu on selvä: anonymisoi indeksointivaiheessa, ei kyselyaikana.

Tarkista tietoturva- ja vaatimustenmukaisuusyleiskatsaus yritystason RAG-vaatimuksille.

Lähteet

  • NVD CVE-2025-68664, CVSS 9,3, LangChainin serialisointihaavoittuvuus
  • LangChainin tietoturvailmoitus, langchain-ai/langchain GitHub, 2025
  • OWASP LLM Top 10: LLM01 Kehotteen injektio, LLM06 Arkaluonteisten tietojen paljastuminen
  • anonym.legal entiteettityyppidokumentaatio — yli 285 tuettua entiteettityyppiä

Valmiina suojaamaan tietojasi?

Aloita PII-anonymisointi yli 285 entiteettityypillä 48 kielellä.

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.