12 điểm bởi darjeeling 2026-03-13 | Chưa có bình luận nào. | Chia sẻ qua WhatsApp

Tóm tắt cốt lõi
Để ứng phó với các cuộc tấn công chuỗi cung ứng nhắm vào hệ sinh thái gói Python, cần có chiến lược phòng thủ nhiều lớp không phụ thuộc vào một cơ chế kiểm soát đơn lẻ. Bài viết khuyến nghị sử dụng quy tắc S (Bandit) của Ruff để chặn lỗ hổng tĩnh, cố định dependency bằng hàm băm mật mã với uv, đồng thời chạy pip-audit và tạo SBOM (CycloneDX) trong môi trường CI. Khi phát hành gói, nên áp dụng Trusted Publishing dựa trên OIDC thay cho API token dài hạn, và xây dựng pipeline thực tiễn bằng cách cố ý trì hoãn việc tiếp nhận gói mới (Delayed Ingestion) để cộng đồng có thời gian xác minh các gói độc hại.

Phân tích chuyên sâu

  • Vector tấn công chuỗi cung ứng và dependency bắc cầu (Transitive Dependency): Hiện PyPI có hơn 740.000 gói, và các sự cố bảo mật quy mô lớn vẫn liên tiếp xảy ra như chiếm quyền tên miền ctx, chèn mã vào script CI của Ultralytics (YOLO), hay đánh cắp token trong GhostAction. Ngay cả khi chỉ cài một gói duy nhất (ví dụ: Flask), rất nhiều dependency bắc cầu (ví dụ: MarkupSafe) cũng sẽ được cài kèm, khiến cả những gói mà lập trình viên không khai báo trực tiếp cũng trở thành một bề mặt tấn công khổng lồ.
  • Chặn trước lỗ hổng trong mã nội bộ: Trước cả package bên ngoài, cần ngăn ngừa lỗi trong chính mã nguồn nội bộ. Secret hardcode, thuật toán băm yếu (MD5, SHA1), request mạng không có timeout (gây DoS), hay serialization không an toàn (pickle) đều rất dễ bị bỏ sót trong quá trình code review. Để ngăn điều này, việc tích hợp quy tắc bảo mật Bandit của Ruff vào pipeline CI/CD và IDE để tự động phát hiện và chặn là điều thiết yếu.
  • Cố định dependency và trì hoãn tiếp nhận (Delayed Ingestion): Khi cài dependency, không chỉ nên chỉ định version mà còn phải cố định cả hàm băm mật mã của package để ngăn sửa đổi trái phép trong môi trường runtime. Đồng thời, để giảm rủi ro từ các gói độc hại mới phát hành trước khi chúng bị chặn, có thể dùng cờ --exclude-newer của uv, hoặc thiết lập một "hàng đợi tiếp nhận 7 ngày" trong kho mirror nội bộ để chỉ những package đã qua bước xác minh ban đầu của cộng đồng mới được đưa vào mạng nội bộ.
  • Phát hành package an toàn: Các maintainer mã nguồn mở và nhà phát hành package nên loại bỏ API token tĩnh vốn luôn có nguy cơ bị đánh cắp, và chuyển sang Trusted Publishing dựa trên OIDC (OpenID Connect) với Sigstore. Cách này cho phép tự động tạo attestation để chứng minh bằng mật mã mối liên kết với source repository.

Mã và dữ liệu chính

1. Kiểm tra dependency bắc cầu (Transitive Dependencies)

# Kiểm tra cây dependency ẩn được kéo theo khi cài một package duy nhất (Flask)  
uv pip install flask  
uv pip tree  
  
# Output:  
flask v3.1.0  
├── blinker v1.9.0  
├── click v8.1.8  
├── itsdangerous v2.2.0  
├── jinja2 v3.1.5  
│   └── markupsafe v3.0.2  
└── werkzeug v3.1.3  
    └── markupsafe v3.0.2  
  
2. Áp dụng bộ quy tắc bảo mật (Bandit) bằng Ruff  
# Ví dụ cấu hình `pyproject.toml`  
[tool.ruff]  
line-length = 120  
# Kích hoạt S (quy tắc bảo mật Bandit) cùng với E (Error), F (Pyflakes)  
lint.select = ["E", "F", "S"]  
  
# Ví dụ các mẫu lỗ hổng tiêu biểu được bộ quy tắc 'S' của Ruff tự động phát hiện  
# FLAGGED: S301 - `pickle.loads()` có nguy cơ thực thi mã tùy ý (`json.loads()` được khuyến nghị)  
import pickle  
data = pickle.loads(untrusted_input)  
  
# FLAGGED: S608 - Lỗ hổng SQL injection do định dạng chuỗi  
cursor.execute(f"SELECT * FROM users WHERE name = '{user_input}'")  
  
# FLAGGED: S113 - Request ra bên ngoài không thiết lập timeout (dễ treo vô hạn và lộ DoS)  
import requests  
response = requests.get("[https://api.example.com/data](https://api.example.com/data)")  
  
3. Kiểm soát package mới bằng trì hoãn tiếp nhận (Delayed Ingestion)  
# Chỉ compile dependency từ các package được phát hành trước một ngày nhất định (ví dụ: 7 ngày trước) để tránh malware/lỗi ban đầu  
uv pip compile --exclude-newer 2026-03-02 requirements.in -o requirements.txt  
  
4. Pipeline kiểm soát tiếp nhận (Ingestion Control) trong tổ chức  
| Giai đoạn xử lý | Thành phần hệ thống | Mục tiêu bảo mật và mô tả |  
|---|---|---|  
| Tiếp nhận | PyPI ➜ Ingestion Queue | Không triển khai ngay các package mới đăng lên PyPI vào hệ thống nội bộ mà đưa vào hàng đợi chờ |  
| Chờ | Wait (vd. 7 ngày) | Dành đủ thời gian tuyệt đối để cộng đồng và các nhà nghiên cứu bảo mật phân tích package xem có mã độc hay lỗ hổng hay không |  
| Xác minh | Security Scan ➜ Approved | Sau thời gian chờ, chỉ phê duyệt nếu package vượt qua quét lỗ hổng đã biết (CVE) và mã độc |  
| Phát hành | Internal Mirror ➜ Developers | Chỉ cache các package đã xác minh vào kho mirror nội bộ để đội phát triển sử dụng an toàn |

Chưa có bình luận nào.

Chưa có bình luận nào.