Trực giác và AI cứu lập trình viên Python khỏi cuộc tấn công chuỗi cung ứng nguy hiểm

16 tháng 6, 2026·6 phút đọc

Một nhà phát triển Python đã thoát khỏi một cuộc tấn công chuỗi cung ứng tinh vi nhờ trực giác và sự trợ giúp của một tác nhân AI. Kẻ tấn công, giả làm tuyển dụng, đã gửi mã độc chứa backdoor, nhưng AI đã phát hiện ra mối nguy hiểm ngay lập tức trước khi mã được thực thi.

Trực giác và AI cứu lập trình viên Python khỏi cuộc tấn công chuỗi cung ứng nguy hiểm

Trực giác và AI cứu lập trình viên Python khỏi cuộc tấn công chuỗi cung ứng nguy hiểm

Nhà phát triển Python Roman Imankulov suýt chút nữa đã trở thành nạn nhân của một cuộc tấn công mạng tinh vi. Sự may mắn của anh đến từ trực giác của con người và khả năng kiểm tra mã của AI.

Một người tự nhận là tuyển dụng viên từ một startup tiền điện tử nhỏ đã liên hệ qua LinkedIn, nhờ anh giúp đỡ sửa một đoạn mã khái niệm (proof-of-concept) không hoạt động. Công ty này allegedly cần một kỹ sư trưởng. Tuy nhiên, yêu cầu xem xét một mô-đun Node đã bị khai thác (deprecated) đã khiến Imankulov cảm thấy có gì đó không ổn.

"Tôi đã nghe nói về những loại cuộc tấn công này, giống như chúng ta đều đã nghe vậy," Imankulov chia sẻ. "Và tôi tự nghĩ, 'điều gì sẽ xảy ra nếu tôi là mục tiêu?' Đó chỉ dựa trên kinh nghiệm quá khứ của tôi."

Thay vì chạy mã trực tiếp trên máy của mình, Imankulov đã thực hiện một bước bất thường: tạo một máy chủ ảo (VPS) trên Hetzner để clone kho chứa (repo) mã nguồn. Sau đó, anh sử dụng tác nhân AI Pi (chạy Codex) để thực hiện phân tích mã ở chế độ chỉ đọc (read-only).

"Tôi chạy tác nhân để xem nó hoạt động như thế nào, và tôi gần như chắc chắn nó sẽ trả lời rằng 'mọi thứ đều ổn, mã xấu nhưng nhìn chung an toàn để chạy'," anh giải thích. "Đến ngỡ ngàng, ngay lập tức tác nhân trả lời: 'Đừng chạy mã này, hãy bỏ đi vì có cái bẫy'."

Mô hình AI đã gắn cờ tệp app/test/index.js. Tệp này chứa một cửa sau (backdoor) dưới dạng một URL máy chủ bị phân mảnh để trông giống như cấu hình bộ kiểm thử, cùng với một yêu cầu mạng sẽ thực thi bất kỳ thứ gì máy chủ gửi về.

Imankulov thừa nhận tác nhân AI đã phát hiện ra những chi tiết mà anh đã bỏ sót. "Tôi tự mở mã này và lướt qua, nó trông giống như một tệp lộn xộn thông thường của một lập trình viên cẩu thả. Nhưng tác nhân đã tìm ra lỗ hổng chính xác mà tôi đã bỏ qua trong cùng một tệp đó."

Chỉ cần cài đặt repo bằng npm là đủ để kích hoạt cửa sau. Tệp package.json chứa một hook prepare sau cài đặt được thiết kế để chạy tập lệnh ngay sau quá trình cài đặt.

Cơ chế tấn công tinh vi

Devashri Datta, kiến trúc sư bảo mật mã nguồn mở độc lập, giải thích: "Điều khiến cuộc tấn công này nguy hiểm là cách nó chiếm đoạt quy trình làm việc tiêu chuẩn của nhà phát triển. Kẻ tấn công không dựa vào việc mục tiêu thực thi một tệp nhị phân đáng ngờ; họ dựa vào việc mục tiêu chạy một lệnh thường nhật: npm install."

Bằng cách chôn logic thực thi bên trong hook vòng đời prepare trong package.json, tải độc (payload) sẽ tự động kích hoạt trong quá trình giải quyết phụ thuộc. Việc phân mảnh chuỗi để lắp ráp URL độc hại là một kỹ thuật che giấu có chủ đích để đánh bại các công cụ phân tích tĩnh quét các chỉ số bị xâm phạm (indicators of compromise) được mã hóa cứng.

Kho chứa độc hại ban đầu dường như là công việc của một nhà phát triển có uy tín, nhưng khi Imankulov liên hệ, người này xác nhận tài khoản GitHub của họ đã bị mạo danh. Hồ sơ LinkedIn của tuyển dụng viên cũng tham chiếu đến một nhà báo nghệ thuật thực sự, nhưng Imankulov tin rằng hồ sơ liên quan là giả mạo.

Xu hướng bảo mật mới

Cuộc tấn công này là một phần của xu hướng gia tăng các cuộc tấn công kỹ thuật xã hội (social engineering) nhắm vào chuỗi cung ứng phần mềm. Gần đây, các nhóm lừa đảo liên quan đến Triều Tiên cũng đã chạy các chiến dịch tương tự để xâm phạm tài khoản của nhà phát triển thông qua các cuộc phỏng vấn giả và lời mời làm việc.

Datta nhận định phản ứng của Imankulov làm nổi bật sự thay đổi trong cách các nhà phát triển có ý thức bảo mật tiếp cận quy trình xem xét mã.

"Về mặt lịch sử, hướng dẫn là sandbox mã không đáng tin cậy hoặc xem xét thủ công," bà nói. "Ở đây, Roman đã triển khai một tác nhân AI cục bộ trong môi trường bị giới hạn để phân tích cơ sở mã trước khi thực thi bất cứ thứ gì. Đây là một phản bổ ích cho câu chuyện phổ biến về AI như một vectơ đe dọa tấn công. Khi được sử dụng phòng thủ tại điểm cuối của nhà phát triển, tác nhân AI không bị mệt mỏi hay áp lực xã hội; nó đơn giản chỉ làm nổi bật hành vi bất thường, chẳng hạn như bộ kiểm thử khởi tạo kết nối mạng ngoài để lấy mã chưa được xác minh, chỉ trong vài giây."

npm 12 và giải pháp trong tương lai

Nếu là một sự an ủi, vectơ tấn công này dự kiến sẽ được giải quyết vào tháng tới. GitHub, đơn vị duy trì npm, đang chuẩn bị phát hành npm 12 với sự thay đổi trong hành vi của lệnh npm install. Cài đặt allowScripts sẽ mặc định là tắt.

"npm install sẽ không còn thực thi các tập lệnh preinstall, install hoặc postinstall từ các phụ thuộc trừ khi chúng được cho phép rõ ràng trong dự án của bạn," GitHub giải thích.

"Các tập lệnh vòng đời thời gian cài đặt là bề mặt thực thi mã lớn nhất trong hệ sinh thái npm," Leo Balter, quản lý sản phẩm của GitHub giải thích trong một bài đăng thảo luận cộng đồng. "Mỗi lệnh npm install đều chạy tập lệnh từ mọi phụ thuộc chuyển tiếp, vì vậy một gói bị xâm phạm duy nhất bất cứ đâu trong cây của bạn có thể thực thi mã tùy ý trên máy của nhà phát triển hoặc trình chạy CI. Việc thực thi tập lệnh trở thành opt-in (tùy chọn tham gia) sẽ đóng đường dẫn đó trong khi vẫn giữ nó cách một lệnh đối với các gói bạn tin tưởng."

Imankulov cho biết anh không có ý kiến mạnh mẽ về việc thay đổi này, nhưng vì sự an toàn cá nhân, anh đã chuyển sang sử dụng pnpm để đảm bảo không thực thi các tập lệnh đó theo mặc định.

Vụ việc nhấn mạnh tầm quan trọng của việc mở rộng bảo mật chuỗi cung ứng phần mềm doanh nghiệp ra ngoài perimeter của mạng lưới nội bộ. Các nhà phát triển cần thực hiện các biện pháp phòng thủ như sử dụng container cách ly hoặc máy trạm đám mây bảo mật để đánh giá mã nguồn bên thứ ba không đáng tin cậy.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗