Nếu các hacker có thể cẩn trọng hơn và không mắc phải sai lầm tương tự, liệu cơ hội cứu vãn sẽ lại xuất hiện lần thứ hai?
Câu chuyện bắt đầu từ một thao tác quá đỗi quen thuộc với lập trình viên: cài đặt thư viện qua lệnh “pip install”. Không có cảnh báo hay thông báo bất thường, quá trình diễn ra như mọi lần trước đó. Nhưng lần này, chỉ một dòng lệnh đơn giản đã mở ra cơ hội cho một trong những cuộc tấn công nguy hiểm nhất trong thế giới phần mềm ngày nay.
Thư viện này mang tên LiteLLM, một package Python cực kỳ phổ biến với 97 triệu lượt tải hàng tháng. Nó không chỉ được sử dụng trực tiếp mà còn là phần phụ thuộc trong hàng loạt dự án lớn, nghĩa là ngay cả khi lập trình viên không chủ động cài đặt, nó vẫn có thể lặng lẽ xuất hiện trong hệ thống. Chính đặc điểm này khiến nguy cơ lan rộng của sự cố trở nên đáng lo ngại.

Tấn công thầm lặng người dùng
Vào sáng ngày 24/3, một phiên bản mới của LiteLLM đột ngột được tải lên hệ thống PyPI. Phiên bản này không có bản ghi phát hành hay thông báo cập nhật trên GitHub như thường lệ. Nó được đẩy thẳng vào kho phân phối mà không qua bất kỳ bước kiểm soát nào.
Ẩn chứa trong phiên bản này là một đoạn mã độc tinh vi. Khi thư viện được cài đặt, một file .pth sẽ tự động được chạy mỗi lần Python khởi động. Điều đáng chú ý là quá trình này diễn ra mà không cần phải gọi hàm hay nhập khẩu, người dùng hoàn toàn không nhận thức được rằng có điều gì đó đang diễn ra trong nền.
Từ thời điểm này, toàn bộ hệ thống bắt đầu bị “khám xét”. Mã độc thu thập mọi dữ liệu nhạy cảm có sẵn: khóa SSH, thông tin đăng nhập các nền tảng đám mây như AWS, GCP, Azure, cấu hình Kubernetes, mật khẩu cơ sở dữ liệu, file .env chứa API key, lịch sử lệnh terminal, cấu hình Git, thậm chí cả ví tiền điện tử.

Sau khi thu thập đủ dữ liệu, chúng được nén lại, mã hóa bằng thuật toán AES-256 và khóa RSA 4096-bit, rồi gửi về một máy chủ bên ngoài thông qua kết nối HTTP. Tất cả quá trình diễn ra âm thầm, không để lại bất kỳ dấu hiệu rõ ràng nào cho người dùng.
Không chỉ dừng lại ở việc đánh cắp thông tin, mã độc còn tìm cách mở rộng quyền kiểm soát. Nếu phát hiện môi trường Kubernetes, nó sẽ cố gắng truy cập toàn bộ secret trong cluster, sau đó triển khai các container có quyền cao trên từng node để cài đặt backdoor. Trên máy cá nhân, nó cũng tạo ra cơ chế tồn tại lâu dài thông qua các service chạy nền, đảm bảo rằng ngay cả khi máy khởi động lại, quyền truy cập vẫn được duy trì.
Trong một kịch bản hoàn hảo, đây có thể trở thành một cuộc tấn công quy mô lớn mà không ai hay biết. Với hàng chục triệu lượt tải mỗi tháng và vô số dự án phụ thuộc, chỉ cần vài ngày, mã độc có thể lẩn vào hàng nghìn hệ thống, từ các startup nhỏ cho đến cơ sở hạ tầng của các tập đoàn lớn.
Nhưng rồi một chi tiết tưởng chừng như không quan trọng lại làm thay đổi toàn bộ tình hình.
Bị phát hiện do một sơ suất bất ngờ
Một lập trình viên đang sử dụng Cursor với plugin MCP vô tình kéo LiteLLM về như một dependency gián tiếp. Anh không hề hay biết rằng mình vừa cài đặt một phiên bản nhiễm mã độc. Nhưng ngay sau đó, máy tính bắt đầu xuất hiện những dấu hiệu lạ. RAM bị chiếm dụng liên tục, hệ thống ngày càng chậm dần rồi đột ngột sập hoàn toàn.

Ban đầu, sự cố này chỉ giống như một lỗi kỹ thuật thông thường. Tuy nhiên, khi kiểm tra kỹ hơn, nguyên nhân thực sự mới dần dần lộ ra. Đoạn mã độc bên trong Litellm tự tạo ra một vòng lặp vô hạn: mỗi khi Python khởi động, một tiến trình mới lại được tạo ra và tiến trình đó tiếp tục kích hoạt lại đoạn mã ban đầu. Hiện tượng “fork bomb” này nhanh chóng tiêu tốn tài nguyên hệ thống, khiến máy tính bị treo.
Chính lỗi lập trình này vô tình đã “vạch trần” toàn bộ cuộc tấn công.
Nếu mã độc được lập trình cẩn thận hơn, nó hoàn toàn có thể hoạt động âm thầm, thu thập dữ liệu và gửi đi mà không để lại bất kỳ dấu vết nào. Khi đó, việc phát hiện có thể bị trì hoãn hàng tuần, thậm chí lâu hơn, và hậu quả sẽ còn nghiêm trọng hơn nhiều.
Các chuyên gia nhận định rằng đây là một minh chứng rõ ràng cho một nguy cơ ngày càng lớn trong ngành phần mềm: tấn công chuỗi cung ứng. Mỗi lần cài đặt thư viện không chỉ là tin tưởng vào tác giả của nó, mà còn là đặt niềm tin vào toàn bộ các dependency phía sau – một mạng lưới phức tạp mà ngay cả lập trình viên cũng khó lòng kiểm soát hoàn toàn.
Điều làm vụ việc trở nên đáng chú ý là cách nó bị phát hiện. Không phải nhờ một hệ thống bảo mật hiện đại, cũng không phải do kiểm tra chủ động, mà chỉ vì kẻ tấn công đã… viết code quá ẩu. Trong bối cảnh “vibe-coding” – phương pháp lập trình nhanh, dựa nhiều vào AI và tự động hóa – ngày càng trở nên phổ biến, chi tiết này mang một ý nghĩa đặc biệt.
Lần này, chính sự cẩu thả đã cứu hệ thống khỏi một cuộc tấn công âm thầm. Tuy nhiên, điều đó cũng cho thấy một thực tế đáng lo ngại: nếu lần sau kẻ tấn công không mắc phải sai lầm tương tự, có thể sẽ không còn cơ hội thứ hai để phát hiện kịp thời.
