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+ поддържани типа обекти