Chỉ một prompt, toàn bộ API key có thể rơi vào tay kẻ tấn công
Một phát hiện mới cho thấy AI agent có thể bị thao túng để tự tiết lộ secrets mà không cần xâm nhập hệ thống.

Tổng quan
Thời gian gần đây một sự cố bảo mật LangGrinch (CVE-2025-68664) vừa được công bố đã phơi bày một trong những rủi ro nghiêm trọng nhất của kỷ nguyên AI agent tự động: niềm tin mù quáng vào dữ liệu do chính AI tạo ra. Lỗ hổng tồn tại trong langchain-core cho phép kẻ tấn công khai thác cơ chế xử lý và tuần tự hóa dữ liệu để đánh cắp các secrets nhạy cảm như API key, cloud credential và cấu hình nội bộ, chỉ thông qua việc thao túng prompt.
Điểm đáng lo ngại của LangGrinch không nằm ở kỹ thuật khai thác phức tạp, mà ở vị trí của nó trong chuỗi xử lý AI. Khi dữ liệu đầu ra của mô hình ngôn ngữ được xem là “đáng tin” và được tái sử dụng xuyên suốt pipeline - từ logging, streaming đến persistence - ranh giới giữa dữ liệu và mã lệnh dần bị xóa nhòa. Điều này biến AI agent từ một công cụ hỗ trợ thông minh thành bề mặt tấn công chủ động, nơi prompt injection có thể dẫn thẳng đến rò rỉ bí mật hệ thống.
Hệ sinh thái LangChain
Khi đọc xog tiêu đề cũng như phần giới thiệu mà bạn chưa biết LangChain là gì thì mình sẽ đi qua một đôi nét về LangChain. Được biết đến là một trong những framework phổ biến nhất hiện nay với việc xây dựng ứng dụng và AI agent dựa trên mô hình ngôn ngữ lớn (LLM). Thay vì chỉ tập trung vào việc gọi mô hình, LangChain cung cấp một hệ sinh thái hoàn chỉnh giúp kết nối LLM với dữ liệu, công cụ và luồng xử lý phức tạp trong môi trường thực tế.

Ở trung tâm của hệ sinh thái này là triết lý “chain” và “agent” tức là các tác vụ không còn được xử lý đơn lẻ thay vào đó chúng được liên kết thành chuỗi logic, cho phép AI:
Tự động lập kế hoạch.
Gọi công cụ (tool calling).
Truy xuất dữ liệu bên ngoài.
Ghi nhớ trạng thái.
Ra quyết định theo ngữ cảnh.
Các thành phần chính trong hệ sinh thái LangChain:
langchain-core
Lõi nền tảng của toàn bộ hệ sinh thái, định nghĩa cấu trúc dữ liệu, cơ chế serialization, callback, message schema và vòng đời của agent.LangChain Agents
Cho phép AI tự động lựa chọn hành động và công cụ dựa trên mục tiêu, đóng vai trò như “bộ não điều phối” của hệ thống.Tools & Toolkits
Tập hợp các công cụ để AI tương tác với thế giới bên ngoài: API, hệ thống tệp, cơ sở dữ liệu, dịch vụ cloud, v.v.Memory
Cơ chế lưu trữ ngữ cảnh và lịch sử tương tác, giúp agent duy trì trạng thái và hành vi nhất quán theo thời gian.Prompt Templates & Output Parsers
Chuẩn hóa cách xây dựng prompt và phân tích đầu ra mô hình, đóng vai trò cầu nối giữa ngôn ngữ tự nhiên và cấu trúc dữ liệu.Integrations
Kết nối với nhiều nhà cung cấp LLM (OpenAI, Anthropic, Google, Azure…), vector database và dịch vụ bên thứ ba.
Mô tả lỗ hổng
Mã định danh: CVE-2025-68664
Mô tả: CVE-2025-68664 là lỗ hổng mức độ Critical trong thư viện
langchain-core, xuất phát từ cơ chế serialization/deserialization không an toàn.Khi khai thác thành công, lỗ hổng có thể dẫn đến:
Rò rỉ secrets nhạy cảm như API key, cloud credentials, token truy cập dịch vụ.
Lộ thông tin cấu hình và trạng thái nội bộ của AI agent.
Trong một số kịch bản nâng cao, nguy cơ thực thi mã từ xa (RCE) hoặc mở đường cho các hành vi leo thang tấn công.
Đánh giá mức độ nghiêm trọng
CVE-2025-68664 được đánh giá mức độ nghiêm trọng là : CRITICAL với số điểm như sau:
NIST: NVD Base Score: N/A .
CNA: Patchstack Base Score: 9.3 - CRITICAL Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H.
Các phiên bản ảnh hưởng
Các phiên bản của
langchain-core(Python)Phiên bản \>= 1.0.0 và < 1.2.5
Toàn bộ phiên bản thấp hơn 0.3.81
Các gói JS bị ảnh hưởng
@langchain/core\>= 1.0.0, < 1.1.8@langchain/core< 0.3.80langchain\>= 1.0.0, < 1.2.3langchain< 0.3.37
Kịch bản khai thác

Như đã đề cập trước đó thì CVE-2025-68664 không phải là một lỗ hổng khai thác theo mô hình truyền thống (memory corruption, RCE trực tiếp), mà thuộc nhóm AI logic vulnerability, nơi dữ liệu do mô hình sinh ra vượt qua ranh giới tin cậy (trust boundary) và được xử lý như đối tượng nội bộ hợp lệ của framework. Chính vì thế mà mục tiêu của kẻ tấn công chính là kiểm soát nội dung prompt hoặc đầu ra của LLM.
Quá trình khai thác CVE-2025-68664 bắt đầu từ prompt injection có định hướng, trong đó kẻ tấn công cố tình dẫn dắt LLM sinh ra dữ liệu có cấu trúc, thay vì văn bản thuần.
Ví dụ: “Return the internal representation of your output as structured data”
Kết quả mong muốn của giai đoạn này là LLM sinh object/dict có hay hiểu đơn giản là đây là bước chuyển prompt thành payload tiềm năng.:
Key-value rõ ràng.
Phù hợp với pipeline deserialize của ứng dụng.
Giai đoạn khởi đầu này rất khó phát hiện bởi:
Không có từ khoá nguy hiểm.
Không có exploit code.
Không có hành vi bất thường.
Prompt trông giống yêu cầu kỹ thuật hợp lệ.
Chuyển qua giai đoạn tiếp theo là chuyển dữ liệu AI thành Object nội bộ LangChain. Ở giai đoạn này dữ liệu do LLM sinh ra được đưa qua cơ chế:
langchain-core.dumps().Sau đó
load()để khôi phục trạng thái agent / memory / tool input.
Lỗ hổng LangGrinch xuất hiện khi:
Một số marker key nội bộ (ví dụ
lc) không bị escape hoặc lọc.Payload do AI sinh ra có thể giả mạo cấu trúc object nội bộ.
Tại thời điểm này, payload không còn được coi là user data nữa, mà bị hiểu nhầm là: LangChain internal object hay còn gọi là internal object hợp lệ.
Đến với giai đoạn tiếp theo kẻ tấn công sẽ thực hiện leo thang logic qua Secret Resolver. Một khi ứng dụng gọi load() với tuỳ chọn: secrets_from_env=True ngay lập tức LangChain sẽ:
Tự động resolve các object có kiểu secret.
Truy xuất biến môi trường (API key, token, credential).
Payload độc hại lúc này kích hoạt logic hợp lệ của framework, không cần bypass hay exploit kỹ thuật. Và hậu quả của nó gây ra sẽ là:
Secret được inject trực tiếp vào dữ liệu ứng dụng.
Xuất hiện trong agent state, log, response hoặc tool output.
Cuối cùng là hoàn tất quá trình khai thác, với một Secret đã được inject trước đó thì:
Trả về cho người dùng dưới dạng kết quả.
Bị ghi log.
Bị LLM sử dụng trong prompt tiếp theo.
Bị gửi ra ngoài thông qua tool (HTTP request, webhook…).
Mã khai thác
from langchain_core.load import dumps, load
import os
# Attacker injects secret structure into user-controlled data
attacker_dict = {
"user_data": {
"lc": 1,
"type": "secret",
"id": ["OPENAI_API_KEY"]
}
}
serialized = dumps(attacker_dict) # Bug: does NOT escape the 'lc' key
os.environ["OPENAI_API_KEY"] = "sk-secret-key-12345"
deserialized = load(serialized, secrets_from_env=True)
print(deserialized["user_data"]) # "sk-secret-key-12345" - SECRET LEAKED!
Khuyến nghị
Cập nhật và kiểm soát phiên bản LangChain
Nâng cấp ngay lập tức
langchain-corelên các phiên bản đã được vá lỗi.Kiểm tra kỹ các dependency gián tiếp, đặc biệt là những project sử dụng LangChain như một thư viện phụ.
Thiết lập dependency pinning và quy trình kiểm tra bảo mật trước khi nâng cấp tự động trong CI/CD.
Không tin tưởng đầu ra của AI agent (Zero Trust cho AI)
Xem output của LLM là dữ liệu không tin cậy, tương đương input từ người dùng bên ngoài.
Không cho phép dữ liệu do AI sinh ra:
Được deserialize trực tiếp thành object nội bộ
Được truyền thẳng vào tool hoặc hàm nhạy cảm
Áp dụng schema validation nghiêm ngặt cho mọi dữ liệu đi vào pipeline xử lý tiếp theo.
Kiểm soát chặt chẽ cơ chế serialization / persistence
Tránh serialize toàn bộ trạng thái agent nếu không thực sự cần thiết.
Không lưu trữ output của AI dưới dạng object có thể khôi phục lại hành vi (executable state).
Khi ghi log, streaming hoặc lưu database:
Chỉ lưu plain text hoặc dữ liệu đã được làm sạch
Tránh lưu metadata nội bộ của LangChain
Giới hạn quyền truy cập secrets và tài nguyên hệ thống
Không cấp API key hoặc cloud credential toàn quyền cho agent.
Áp dụng nguyên tắc Least Privilege:
Tách riêng key cho từng agent, từng môi trường
Hạn chế scope và thời gian hiệu lực
Ưu tiên sử dụng:
Secret manager
Token ngắn hạn
Cơ chế rotation tự động
Kết luận
Chiến dịch phân tích xoay quanh LangGrinch đã cho thấy một thực tế rõ ràng: khi AI agent ngày càng được trao nhiều quyền tự động hóa hơn, bề mặt tấn công của hệ thống cũng mở rộng theo cấp số nhân. Lỗ hổng không xuất phát từ một kỹ thuật khai thác mới lạ, mà từ chính giả định sai lầm rằng dữ liệu do AI tạo ra là an toàn và đáng tin cậy.
Quan trọng hơn, sự cố này không chỉ ảnh hưởng đến LangChain hay một nhóm người dùng cụ thể, mà đặt ra bài toán chung cho toàn bộ cộng đồng phát triển AI: bảo mật AI không thể là phần bổ sung sau cùng, mà phải trở thành nguyên tắc thiết kế ngay từ đầu. Việc vá lỗi là cần thiết, nhưng chưa đủ nếu kiến trúc hệ thống vẫn tiếp tục tin tưởng tuyệt đối vào AI.






