Thư viện Python 97 triệu lượt tải nhiễm mã độc: Lỗi lập trình ẩu đã vô tình cứu hệ thống
Lỗi vibe-coding vô tình phát hiện mã độc trong thư viện Python

Thư viện Python phổ biến bị nhiễm mã độc tinh vi

Một thao tác quen thuộc với mọi lập trình viên - cài đặt thư viện bằng lệnh "pip install" - đã trở thành cánh cửa mở ra một trong những kịch bản tấn công nguy hiểm nhất trong thế giới phần mềm hiện đại. Thư viện LiteLLM, một package Python cực kỳ phổ biến với khoảng 97 triệu lượt tải mỗi tháng, đã bị chèn mã độc cực kỳ nguy hiểm.

Cuộc tấn công âm thầm vào hệ thống phần mềm

Vào sáng ngày 24/3, một phiên bản mới của LiteLLM bất ngờ xuất hiện trên hệ thống PyPI mà không đi kèm bất kỳ bản ghi phát hành hay cập nhật nào trên GitHub. Phiên bản này được đưa thẳng lên kho phân phối, bỏ qua toàn bộ các bước kiểm soát quen thuộc. Điều đáng lo ngại là LiteLLM không chỉ được sử dụng trực tiếp mà còn nằm sâu trong hàng loạt dự án lớn dưới dạng dependency, khiến mức độ lan rộng tiềm tàng của sự cố trở nên đặc biệt nguy hiểm.

Ẩn bên trong phiên bản này là một đoạn mã độc được thiết kế cực kỳ tinh vi. Ngay khi thư viện được cài đặt, một file .pth sẽ tự động được thực thi mỗi lần Python khởi động mà không cần import, không cần gọi hàm, khiến người dùng hoàn toàn không hay biết.

Banner rộng Pickt — ứng dụng danh sách mua sắm cộng tác cho Telegram

Quy mô thu thập dữ liệu đáng báo động

Mã độc bắt đầu "lục soát" toàn bộ hệ thống, thu thập mọi dữ liệu nhạy cảm có thể tìm thấy:

  • Khóa SSH và thông tin đăng nhập các nền tảng đám mây như AWS, GCP, Azure
  • Cấu hình Kubernetes và mật khẩu database
  • File .env chứa API key và lịch sử lệnh terminal
  • Cấu hình Git và cả ví tiền điện tử

Sau khi gom đủ 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ả diễn ra âm thầm, không để lại dấu hiệu rõ ràng nào cho người dùng.

Mở rộng quyền kiểm soát hệ thống

Không 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 backdoor. Trên máy cá nhân, nó cũng thiết lập cơ chế tồn tại lâu dài thông qua các service chạy nền, đảm bảo ngay cả khi khởi động lại máy, 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ể len lỏi vào hàng nghìn hệ thống, từ startup nhỏ đến hạ tầng của các tập đoàn lớn.

Lỗi lập trình ẩu đã vô tình cứu hệ thống

Mọi chuyện thay đổi khi một lập trình viên đang sử dụng Cursor cùng plugin MCP vô tình kéo LiteLLM về như một dependency gián tiếp. Ngay sau đó, máy tính bắt đầu có dấu hiệu bất thường: RAM bị chiếm dụng liên tục, hệ thống chậm dần rồi đột ngột sập hoàn toàn.

Khi kiểm tra sâu hơn, nguyên nhân thực sự mới dần lộ diện. Đ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, nó lại sinh ra một tiến trình mới, và tiến trình đó lại kích hoạt chính đoạn mã ban đầu. Hiện tượng "fork bomb" này nhanh chóng làm cạn kiệt tài nguyên hệ thống và khiến máy bị treo.

Banner sau bài viết Pickt — ứng dụng danh sách mua sắm cộng tác với hình minh họa gia đình

Bài học về tấn công chuỗi cung ứng

Theo nhận định của các chuyên gia, đây là minh chứng rõ ràng cho một rủi ro 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 một thư viện không chỉ là tin tưởng vào tác giả của nó, mà còn là 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ó kiểm soát hoàn toàn.

Điều khiến vụ việc trở nên đáng chú ý hơn là cách nó bị phát hiện. Không phải nhờ một hệ thống bảo mật tinh vi, 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" – cách lập trình nhanh, dựa nhiều vào AI và tự động hóa – ngày càng 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 cả hệ thống khỏi một cuộc tấn công âm thầm. Nhưng điều đó cũng đồng nghĩa với một thực tế đáng lo ngại hơn: nếu lần sau kẻ tấn công không mắc 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. Câu hỏi đặt ra là liệu cộng đồng phần mềm có học được bài học từ sự cố này để cải thiện an ninh chuỗi cung ứng, hay sẽ tiếp tục dựa vào may mắn từ những lỗi lập trình của chính kẻ tấn công?