Quay lại BlogKỹ Thuật

LangChain CVE-2025-68664: PII rò rỉ qua pipeline RAG như thế nào

CVSS 9,3. Hàm serialization của LangChain phơi lộ biến môi trường và secret cho LLM do kẻ tấn công kiểm soát. Cách phát hiện và khắc phục rò rỉ PII.

March 16, 2026article.updated: June 14, 20268 phút đọc
LangChainRAG pipelineCVEPII leakagedeveloper securityAPI keysLLM security

CVE-2025-68664: Chuyện gì đã xảy ra

Cuối năm 2025, các nhà nghiên cứu bảo mật tiết lộ CVE-2025-68664, một lỗ hổng nghiêm trọng trong các hàm serialization của LangChain — cụ thể là dumps()dumpd(). Điểm CVSS là 9,3 (Nghiêm trọng).

Lỗ hổng hoạt động như sau: các phương thức serialization của LangChain chuyển đổi đối tượng Python, bao gồm cả hàm callable, bằng cách bắt giữ ngữ cảnh closure của chúng. Khi kẻ tấn công kiểm soát phản hồi LLM trong một chain LangChain — thông qua prompt injection trong tài liệu được truy xuất, kết quả công cụ độc hại hoặc mục vector store bị đầu độc — họ có thể tạo ra phản hồi khiến dumps() serialize các biến môi trường mà tiến trình Python có thể truy cập.

Kết quả: API key, chuỗi kết nối cơ sở dữ liệu, JWT secret và thông tin xác thực AWS nhúng trong môi trường của chain LangChain có thể bị đánh cắp qua đầu ra của mô hình. Kẻ tấn công có thể inject văn bản vào tài liệu nguồn trong pipeline RAG của bạn và đọc các secret production.

Phiên bản bị ảnh hưởng: LangChain < 0.3.22 (Python). Bản vá đã phát hành trong 0.3.22, nhưng việc áp dụng chậm — dữ liệu tải xuống PyPI cho thấy sử dụng đáng kể các phiên bản dễ bị tấn công đến tháng 3 năm 2026.

PII rò rỉ trong pipeline RAG — Vấn đề tổng quát

CVE-2025-68664 là ví dụ kịch tính của một vấn đề âm thầm rộng hơn: PII rò rỉ qua pipeline RAG thường xuyên, qua các cơ chế không cần CVE và không cần kẻ tấn công.

Xét thiết lập RAG doanh nghiệp điển hình:

  1. Thu thập: Bạn index tài liệu của công ty — ticket hỗ trợ, email khách hàng, hợp đồng pháp lý, hồ sơ HR — vào vector database (Pinecone, Weaviate, pgvector).
  2. Truy xuất: Khi người dùng đặt câu hỏi, hệ thống truy xuất 5 đoạn tài liệu tương đồng nhất.
  3. Tạo: Các đoạn đó được truyền làm ngữ cảnh cho LLM (GPT-4o, Claude, Gemini), tạo ra phản hồi.

Vấn đề là bước 2. Các đoạn được truy xuất chứa bất cứ thứ gì trong tài liệu gốc, bao gồm:

  • Tên khách hàng, địa chỉ email, số điện thoại
  • Giá trị hợp đồng, số tài khoản, mã số thuế
  • Dữ liệu lương nhân viên, nội dung đánh giá hiệu suất
  • Tên bệnh nhân trong ghi chú lâm sàng
  • Số ID quốc gia trong pipeline tài liệu di trú

PII đó được truyền nguyên văn cho LLM trong cửa sổ ngữ cảnh. Nó xuất hiện trong đầu ra của mô hình nếu truy vấn kích gợi nó. Nó được ghi log bởi nhà cung cấp LLM. Nó được lưu trong lịch sử cuộc trò chuyện LangChain. Nó chảy vào nền tảng quan sát của bạn.

Không cần lỗ hổng nào. Đây là hành vi dự định của hệ thống RAG — và nó tạo ra phơi lộ PII có hệ thống.

68 mẫu secret phổ biến

Công cụ bảo mật theo dõi 68 mẫu secret đã biết thường xuất hiện trong kho tài liệu doanh nghiệp:

  • AWS Access Key ID (AKIA...)
  • OpenAI API key (sk-...)
  • Anthropic API key (sk-ant-...)
  • Chuỗi kết nối cơ sở dữ liệu (postgresql://user:password@host/db)
  • JWT token (header mã hóa base64)
  • GitHub Personal Access Token
  • Stripe secret key (sk_live_...)
  • SendGrid API key
  • Twilio account SID và auth token
  • Khối PEM khóa riêng tư

Những mẫu này xuất hiện trong tài liệu doanh nghiệp thường xuyên hơn lập trình viên dự đoán. Một ticket hỗ trợ có thể chứa API key của khách hàng họ dán vào khi debug. Một hợp đồng có thể bao gồm thông tin xác thực cơ sở dữ liệu chia sẻ trong quá trình tích hợp kỹ thuật. Một file cấu hình bị index nhầm lộ ra toàn bộ kho secret.

Khi các tài liệu này được index vào vector database mà không làm sạch, mọi truy vấn truy xuất chúng đều truyền secret cho LLM — và có thể đến người dùng gửi truy vấn.

Giải pháp: Ẩn danh trước khi nhúng vector

Kiến trúc đúng cho pipeline RAG an toàn với PII sẽ ẩn danh tài liệu trước khi chúng được phân đoạn và nhúng vector. Đây không phải tùy chọn đối với hệ thống production xử lý dữ liệu khách hàng.

Dưới đây là cách triển khai bằng Python dùng 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]:
    """Ẩn danh PII trong văn bản tài liệu trước khi nhúng vector."""
    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):
    """Xây dựng RAG index chỉ với tài liệu sạch."""
    anonymized_docs = []
    for doc in documents:
        clean_text, entities = anonymize_before_embedding(doc)
        anonymized_docs.append(clean_text)
        print(f"Đã loại bỏ {len(entities)} thực thể PII khỏi tài liệu")
    vectorstore.add_texts(anonymized_docs)

anonym.legal API hỗ trợ hơn 285 loại thực thể. Tên, email, số điện thoại, ID quốc gia, định danh tài chính, API key (qua loại thực thể CRYPTO), database URI và hơn 270 mẫu bổ sung đều được phát hiện và loại bỏ trước khi tài liệu nào đến vector store của bạn.

Xem hướng dẫn dành cho lập trình viên để biết các mẫu tích hợp LangChain và LlamaIndex.

Khắc phục CVE-2025-68664

Nếu bạn đang chạy LangChain < 0.3.22, cập nhật ngay:

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

Sau khi vá lỗi, kiểm toán cấu hình chain của bạn để tìm rủi ro prompt injection:

  1. Xác thực các đoạn được truy xuất trước khi truyền cho LLM — loại bỏ nội dung khớp với mẫu injection đã biết như ignore previous instructions, system:, <INST>
  2. Dùng anonymize_before_embedding trong pipeline thu thập — giảm bề mặt tấn công ngay cả khi injection xảy ra, vì dữ liệu nhạy cảm không có mặt trong các đoạn được truy xuất
  3. Giới hạn quyền chain — chain LangChain không nên có quyền truy cập biến môi trường vượt quá mức cần thiết

Bức tranh toàn cảnh

Điểm CVSS là 9,3. Biện pháp khắc phục là một lệnh gọi API cho mỗi tài liệu. Phép tính đơn giản.

Sự kết hợp của CVE-2025-68664 và rủi ro PII trong ngữ cảnh RAG nói chung là trách nhiệm pháp lý thực sự. Giải pháp là kiến trúc đúng: ẩn danh tại thời điểm thu thập, không phải tại thời điểm truy vấn.

Kiểm tra trang tổng quan bảo mật và tuân thủ để biết yêu cầu RAG doanh nghiệp.

Nguồn

  • NVD CVE-2025-68664, CVSS 9,3, lỗ hổng serialization LangChain
  • Tư vấn bảo mật LangChain, langchain-ai/langchain GitHub, 2025
  • OWASP LLM Top 10: LLM01 Prompt Injection, LLM06 Sensitive Information Disclosure
  • Tài liệu loại thực thể anonym.legal — hơn 285 loại thực thể được hỗ trợ

Sẵn sàng bảo vệ dữ liệu của bạn?

Bắt đầu ẩn danh PII với 285+ loại thực thể trên 48 ngôn ngữ.

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.