Các nhà nghiên cứu an ninh mạng đã phát hiện mã dễ bị tổn thương trong các gói Python cũ, có khả năng mở đường cho một cuộc tấn công chuỗi cung ứng trên Python Package Index (PyPI) thông qua một cuộc tấn công chiếm quyền miền.
Công ty bảo mật chuỗi cung ứng phần mềm ReversingLabs cho biết họ đã tìm thấy "lỗ hổng" này trong các tệp khởi động do công cụ tự động hóa xây dựng và triển khai có tên "zc.buildout" cung cấp.
Nhà nghiên cứu bảo mật Vladimir Pezo cho biết: "Các script này tự động hóa quá trình tải xuống, xây dựng và cài đặt các thư viện và công cụ cần thiết. Cụ thể, khi script khởi động được thực thi, nó sẽ tìm nạp và thực thi một script cài đặt cho gói Distribute từ python-distribute[.]org – một miền cũ hiện đang được rao bán với giá cao cấp trong khi được quản lý để tạo doanh thu quảng cáo."
Các gói PyPI bao gồm một script khởi động truy cập miền nói trên gồm có tornado, pypiserver, slapos.core, roman, xlutils và testfixtures.
Cốt lõi của vấn đề liên quan đến một script khởi động cũ ("bootstrap.py") được sử dụng cùng với công cụ zc.buildout để khởi tạo môi trường Buildout. Script Python này cũng hỗ trợ khả năng cài đặt một tiện ích đóng gói tên "Distribute", một nhánh tồn tại trong thời gian ngắn của dự án Setuptools, vào môi trường cục bộ.
Để đạt được điều này, script cài đặt Distribute ("distribute_setup.py") được tìm nạp từ python-distribute[.]org, một miền đã được rao bán từ năm 2014. Khi thêm tùy chọn này, ý tưởng là hướng dẫn script khởi động tải xuống và cài đặt gói Distribute thay vì gói Setuptools cũ hơn để quản lý eggs và các dependency cho buildout.
Điều quan trọng cần lưu ý là nhánh Distribute ra đời do thiếu sự phát triển tích cực của Setuptools, công cụ quản lý gói chính được sử dụng vào thời điểm đó. Tuy nhiên, các tính năng từ Distribute đã được tích hợp trở lại vào Setuptools vào năm 2013, khiến Distribute trở nên lỗi thời.
Vấn đề được ReversingLabs xác định liên quan đến thực tế là nhiều gói vẫn tiếp tục vận chuyển script khởi động mà mặc định cố gắng cài đặt Distribute hoặc khi tùy chọn dòng lệnh ("-d" hoặc "--distribute") được chỉ định. Điều này, cùng với việc miền nói trên đang được rao bán, đặt người dùng vào rủi ro tiềm ẩn vì kẻ tấn công có thể vũ khí hóa thiết lập này để phân phát mã độc khi script khởi động vô tình được chạy và có khả năng đánh cắp dữ liệu nhạy cảm.
Trong khi một số gói bị ảnh hưởng đã thực hiện các bước để loại bỏ script khởi động, gói slapos.core vẫn tiếp tục vận chuyển mã dễ bị tổn thương. Nó cũng được bao gồm trong phiên bản phát triển và bảo trì của Tornado.
Một khía cạnh quan trọng khác cần xem xét ở đây là script khởi động không được thực thi tự động trong quá trình cài đặt gói và được viết bằng Python 2. Điều này có nghĩa là script không thể được thực thi bằng Python 3 nếu không có sửa đổi. Nhưng sự hiện diện đơn thuần của tệp để lại một "bề mặt tấn công không cần thiết" mà kẻ tấn công có thể khai thác nếu nhà phát triển bị lừa chạy mã kích hoạt việc thực thi script khởi động.
Mối đe dọa chiếm quyền miền không phải là lý thuyết. Năm 2023, đã có thông tin cho rằng gói npm fsevents đã bị một kẻ xấu xâm nhập, kẻ này đã giành quyền kiểm soát một tài nguyên đám mây không được xác nhận được lưu trữ tại fsevents-binaries.s3-us-west-2.amazonaws[.]com để đẩy các tệp thực thi độc hại đến người dùng cài đặt các phiên bản nhất định của gói (CVE-2023-45311, điểm CVSS: 9.8).
Pezo nói: "Vấn đề nằm ở mô hình lập trình bao gồm việc tìm nạp và thực thi một payload từ một miền được mã hóa cứng, đây là một mô hình thường thấy trong các phần mềm độc hại có hành vi downloader. Việc không chính thức ngừng hoạt động mô-đun Distribute đã cho phép các script khởi động dễ bị tổn thương tồn tại và khiến một số lượng không xác định các dự án bị phơi nhiễm với một cuộc tấn công tiềm tàng."
Thông tin tiết lộ này được đưa ra khi HelixGuard phát hiện một gói độc hại trong PyPI có tên "spellcheckers" tự nhận là một công cụ kiểm tra lỗi chính tả bằng OpenAI Vision, nhưng lại chứa mã độc được thiết kế để kết nối với một máy chủ bên ngoài và tải xuống một payload giai đoạn tiếp theo, sau đó thực thi một remote access trojan (RAT).
Gói này, lần đầu tiên được tải lên PyPI vào ngày 15 tháng 11 năm 2025, bởi một người dùng có tên leo636722, đã được tải xuống 955 lần. Hiện nó không còn khả dụng để tải xuống.
HelixGuard cho biết: "RAT này có thể nhận lệnh từ xa và thực thi mã Python do kẻ tấn công kiểm soát thông qua exec(), cho phép kiểm soát hoàn toàn máy chủ của nạn nhân. Khi người dùng cài đặt và chạy gói độc hại, backdoor sẽ hoạt động, cho phép kẻ tấn công điều khiển máy tính của người dùng từ xa."