anonym.legal
Назад към блогаТехнически

LangChain CVE-2025-68664: Как личните данни изтичат през RAG тръбопровода ви

CVSS 9.3. Функциите за сериализация на LangChain излагат променливи на средата и тайни пред LLM-и, контролирани от атакуващи. Как да разпознаете и поправите изтичането на лични данни.

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 разполага с две функции за сериализация: dumps() и dumpd(). Те конвертират Python обекти в текст.

Уязвимостта е в обработката на затваряния (closures).

Когато LangChain сериализира извикваем обект, той улавя контекста на затварянето.

Атакуващ, контролиращ отговора на LLM, може да задейства dumps(). Функцията след това чете променливи на средата от Python процеса.

Резултатът е разкриване на данни. API ключове, низове за връзка с бази данни, JWT тайни и AWS идентификационни данни могат да се появят в изхода на модела.

Атакуващ, инжектирал текст в изходен документ на RAG, може да прочете производствените ви тайни.

Засегнати версии: LangChain под 0.3.22 (Python). Версия 0.3.22 съдържа поправката.

Данните от PyPI показват широко използване на по-стари версии до март 2026 г.

Как личните данни изтичат в RAG тръбопроводи

CVE-2025-68664 е драматичен. Но е само един случай от по-широк проблем.

Данните изтичат рутинно през RAG тръбопроводи. Не е нужен атакуващ.

Ето стандартна корпоративна RAG конфигурация.

Първо, индексиране. Индексирате фирмени документи в векторно хранилище. Представете си тикети за поддръжка, клиентски имейли, договори и HR записи.

Чести векторни хранилища са Pinecone, Weaviate и pgvector.

След това, извличане. Потребител задава въпрос. Системата извлича петте най-подходящи фрагмента от хранилището.

После, генериране. Тези фрагменти се изпращат до LLM — GPT-4o, Claude или Gemini — като контекст.

Втората стъпка е проблемът. Извлечените фрагменти съдържат всичко, което са съдържали изходните документи. Включително:

  • Имена на клиенти, имейл адреси и телефонни номера
  • Стойности на договори, номера на сметки и данъчни идентификатори
  • Данни за заплати на служители и бележки от оценки на изпълнението
  • Имена на пациенти в клинични бележки
  • Национални идентификационни номера в имиграционни файлове

Тези данни отиват до LLM непроменени. Могат да се появят в изхода на модела.

Биват журналирани от доставчика на LLM. Стоят в историята на разговора ви. Текат в стека ви за наблюдаемост.

Не е нужна атака. Така работи RAG по дизайн. Дизайнът създава реален риск за поверителността.

68 шаблона на тайни в корпоративни хранилища на документи

Инструментите за сигурност следят 68 известни шаблона на тайни. Те се появяват по-често, отколкото екипите очакват.

Ето най-честите.

  • AWS Access Key ID (AKIA...)
  • API ключове на OpenAI (sk-...)
  • API ключове на Anthropic (sk-ant-...)
  • URI на бази данни (postgresql://user:password@host/db)
  • JWT токени (base64-кодирани заглавни части)
  • GitHub Personal Access Tokens
  • Тайни ключове на Stripe (sk_live_...)
  • API ключове на SendGrid
  • SID-ове и токени за автентикация на акаунт в Twilio
  • Блокове от частни ключове PEM

Тикет за поддръжка може да съдържа API ключ на клиент от сесия за отстраняване на грешки.

Договор може да включва идентификационни данни за база данни от техническо предаване.

Конфигурационен файл, индексиран по грешка, може да разкрие цяло хранилище за тайни.

Когато тези файлове влизат в векторно хранилище без дезинфекция, всяка заявка може да предаде тайните до LLM.

Могат да достигнат и до крайния потребител.

Решение: анонимизирайте преди вграждане

Правилният подход анонимизира документите преди фрагментирането и вграждането.

Тази стъпка е задължителна за всяка система, обработваща клиентски данни.

Ето пример на Python, използващ 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]:
    """Анонимизиране на лични данни преди вграждане."""
    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"Премахнати {len(entities)} обекта с лични данни от документа")
    vectorstore.add_texts(anonymized_docs)

anonym.legal API покрива 285+ типа обекти. Имена, имейли, телефонни номера, национални идентификационни номера, API ключове и URI на бази данни — всичко се улавя.

Нищо чувствително не достига до векторното хранилище. Следователно нищо чувствително не може да изтече до потребителите.

Вижте ръководството за разработчици за шаблони за настройка на LangChain и LlamaIndex.

Поправете CVE-2025-68664 сега

Ако изпълнявате LangChain под 0.3.22, актуализирайте незабавно:

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

След закърпването проверете конфигурациите на веригите за риск от инжектиране. Ето три стъпки.

Първо, валидирайте извлечените фрагменти. Направете това, преди да достигнат до LLM.

Изчистете съдържание, съответстващо на шаблони за инжектиране като ignore previous instructions, system: или <INST>.

Второ, анонимизирайте преди вграждане. Това свива повърхността на атаката.

Ако инжектирането се случи, чувствителните данни няма да бъдат налице за извличане.

Трето, ограничете разрешенията на веригата. LangChain веригите не трябва да четат променливи на средата извън това, от което се нуждаят.

Използвайте служебен акаунт с минимален обхват.

Математиката е проста

CVSS резултатът е 9.3. Поправката е едно 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 Prompt Injection, LLM06 Sensitive Information Disclosure
  • Документация на типовете обекти на anonym.legal — 285+ поддържани типа обекти

Готови ли сте да защитите данните си?

Започнете анонимизация на PII с 285+ типа субекти на 48 езика.

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.