Giải Phẫu Cuộc Tấn Công Chuỗi Cung Ứng LiteLLM — Khi Công Cụ Bảo Mật Trở Thành Vũ Khí
Phân tích toàn diện vụ xâm nhập chuỗi cung ứng LiteLLM tháng 3/2026 — cách kẻ tấn công biến Trivy thành vũ khí để cài backdoor vào 3,4 triệu lượt tải mỗi ngày, payload mã độc ba giai đoạn, và các lệnh cụ thể để kiểm tra và khắc phục.
Table of Contents
Phát Hiện Như Thế Nào
Nhà nghiên cứu bảo mật Callum McMahon tại FutureSearch phát hiện vụ xâm nhập gần như hoàn toàn tình cờ. Trong khi đang thử nghiệm một plugin Cursor MCP, máy của anh đột ngột bị cạn kiệt RAM ngay sau khi Python khởi động. Điều tra bất thường này, anh tìm thấy một file đáng ngờ nặng 34.628 byte tên litellm_init.pth trong thư mục site-packages của Python, được mã hóa bằng double base64.
Lý do nó bị phát hiện hoàn toàn là do một lỗi ngoài ý muốn trong chính mã độc — payload .pth sinh ra các tiến trình con Python liên tục kích hoạt lại cơ chế khởi động .pth, tạo ra một fork bomb ngốn hết bộ nhớ. Nếu không có lỗi đó, backdoor sẽ hoạt động hoàn toàn âm thầm.
Chuỗi Tấn Công
Đây là một cuộc tấn công chuỗi cung ứng phần mềm nhiều giai đoạn do nhóm tác nhân đe dọa TeamPCP thực hiện (các bí danh: PCPcat, Persy_PCP, ShellForce, DeadCatx3). Đây là cách nó diễn ra.
Giai Đoạn 1 — Xâm Nhập Trivy (Công Cụ Quét Bảo Mật)
Vào cuối tháng 2 năm 2026, kẻ tấn công khai thác lỗ hổng workflow pull_request_target trong pipeline CI/CD của Aqua Trivy để đánh cắp thông tin xác thực aqua-bot. Vào ngày 19 tháng 3, chúng viết lại các Git tag trong trivy-action để chuyển hướng người dùng đến phiên bản độc hại v0.69.4.
Đúng vậy — chính công cụ quét bảo mật là điểm xâm nhập.
Giai Đoạn 2 — Đầu Độc LiteLLM Qua Pipeline CI/CD
Vào ngày 24 tháng 3, pipeline build của LiteLLM sử dụng Trivy từ apt mà không ghim phiên bản. Khi chạy GitHub Action Trivy đã bị xâm nhập, action này đánh cắp token PYPI_PUBLISH của LiteLLM.
Sử dụng token đánh cắp, kẻ tấn công đã phát hành hai phiên bản PyPI chứa mã độc:
- v1.82.7 (10:39 UTC) — Nhúng payload base64 độc hại trực tiếp vào
litellm/proxy/proxy_server.py, thực thi khi import. - v1.82.8 (10:52 UTC) — Cài
litellm_init.pthvào site-packages, thực thi mỗi khi Python interpreter khởi động — không cần import. Bao gồm cảpip,python -c, và ngay cả language server của IDE.
PyPI cách ly cả hai phiên bản khoảng 3 giờ sau, nhưng LiteLLM nhận ~3,4 triệu lượt tải mỗi ngày.
Giai Đoạn 3 — Payload Mã Độc Ba Tầng
Sau khi cài đặt, mã độc thực thi payload ba giai đoạn tàn khốc:
| Giai đoạn | Hành động |
|---|---|
| Tầng 1: Thu Thập Thông Tin Xác Thực | Thu thập SSH key, file .env, cấu hình Git, lịch sử shell, thông tin xác thực cloud (AWS/GCP/Azure bao gồm IMDSv2 + Secrets Manager + SSM), thông tin Docker registry, kubeconfig + service account token Kubernetes, và cả ví tiền mã hóa (BTC, ETH, SOL, ADA, XMR) |
| Tầng 2: Trích Xuất Dữ Liệu Mã Hóa | Sử dụng mã hóa lai (AES-256-CBC + RSA OAEP 4096-bit), đóng gói tất cả thành tpcp.tar.gz, và POST đến https://models.litellm.cloud/ |
| Tầng 3: Duy Trì & Di Chuyển Ngang | Cài dịch vụ systemd (sysmon.service) kiểm tra https://checkmarx.zone/raw mỗi 5 phút để tải payload mới. Trong môi trường Kubernetes, nó đọc tất cả secret trên mọi namespace và triển khai pod đặc quyền (node-setup-{node}) lên mọi node, mount filesystem của host để cài backdoor hạ tầng bên dưới |
Kế Hoạch Khắc Phục — Từng Bước
Nếu bạn sử dụng LiteLLM vào cuối tháng 3 năm 2026, đây là chính xác những gì cần làm.
Bước 1: Xác Định Bạn Có Bị Ảnh Hưởng Không
# Check installed LiteLLM version
pip show litellm | grep Version
# If version is 1.82.7 or 1.82.8, you are affected
Bước 2: Kiểm Tra Dấu Vết Mã Độc
# Check for the malicious .pth file in site-packages
find $(python3 -c "import site; print(' '.join(site.getsitepackages()))") \
-name "*.pth" -exec grep -l "base64\|subprocess\|exec" {} \;
# Verify file hashes (if files exist)
# litellm_init.pth (v1.82.8):
sha256sum $(python3 -c "import site; print(site.getsitepackages()[0])")/litellm_init.pth
# Expected malicious hash: 71e35aef03099cd1f2d6446734273025a163597de93912df321ef118bf135238
# Check for persistence backdoor
ls -la ~/.config/sysmon/sysmon.py
ls -la /root/.config/sysmon/sysmon.py
# Check for the malicious systemd service
systemctl --user status sysmon.service
# Check for network indicators
# Look for connections to attacker infrastructure
ss -tunap | grep -E "models\.litellm\.cloud|checkmarx\.zone"
# Check DNS resolution logs if available
grep -r "models.litellm.cloud\|checkmarx.zone" /var/log/
# Kubernetes: Check for malicious pods
kubectl get pods -A | grep "node-setup-"
# Check for temporary malware files
ls -la /tmp/pglog /tmp/.pg_state 2>/dev/null
Bước 3: Gỡ Bỏ Mã Độc (Nếu Bị Xâm Nhập)
# Uninstall compromised LiteLLM
pip uninstall litellm -y
# Remove the malicious .pth file
find $(python3 -c "import site; print(' '.join(site.getsitepackages()))") \
-name "litellm_init.pth" -delete
# Remove persistence mechanism
rm -rf ~/.config/sysmon/
systemctl --user stop sysmon.service
systemctl --user disable sysmon.service
rm -f ~/.config/systemd/user/sysmon.service
systemctl --user daemon-reload
# Remove temp files
rm -f /tmp/pglog /tmp/.pg_state
# Kubernetes: Remove malicious pods
kubectl delete pods -n kube-system -l app=node-setup --all-namespaces
# Install a safe version
pip install "litellm<=1.82.6"
Bước 4: Xoay Vòng TẤT CẢ Thông Tin Xác Thực (Quan Trọng)
Đây là bước quan trọng nhất. Mã độc đã trích xuất mọi thứ nó tìm được — hãy giả định rằng mọi thông tin xác thực trên máy bị ảnh hưởng đều đã bị lộ.
# SSH Keys — regenerate
ssh-keygen -t ed25519 -C "[email protected]"
# Update authorized_keys on all servers
# AWS credentials
aws iam create-access-key --user-name <username>
aws iam delete-access-key --user-name <username> --access-key-id <OLD_KEY>
# Audit AWS Secrets Manager for unauthorized access
aws secretsmanager list-secrets
aws cloudtrail lookup-events --lookup-attributes \
AttributeKey=EventName,AttributeValue=GetSecretValue \
--start-time "2026-03-24T00:00:00Z"
# Audit AWS SSM Parameter Store
aws ssm describe-parameters
aws cloudtrail lookup-events --lookup-attributes \
AttributeKey=EventName,AttributeValue=GetParameter \
--start-time "2026-03-24T00:00:00Z"
# GCP — rotate service account keys
gcloud iam service-accounts keys list --iam-account=<SA_EMAIL>
gcloud iam service-accounts keys create new-key.json --iam-account=<SA_EMAIL>
gcloud iam service-accounts keys delete <OLD_KEY_ID> --iam-account=<SA_EMAIL>
# Docker registry credentials
docker logout
docker login # with new credentials
# Kubernetes — rotate service account tokens
kubectl delete secret <sa-token-secret> -n <namespace>
# Git tokens / API keys
# Rotate all tokens found in: .env, .git/config, shell history
# Check what was exposed:
grep -r "API_KEY\|SECRET\|TOKEN\|PASSWORD" ~/.bashrc ~/.zshrc ~/.bash_history ~/.env
Bước 5: Ghim Phiên Bản Dependency Từ Đây Về Sau
# Pin litellm in requirements.txt
echo "litellm<=1.82.6" >> requirements.txt
# Use hash-pinning for maximum security
pip install --require-hashes -r requirements.txt
# Generate hashes for your requirements
pip-compile --generate-hashes requirements.in
Bài Học Rút Ra
Tấn Công Chuỗi Cung Ứng Có Tính Bắc Cầu
Một công cụ quét bảo mật (Trivy) — chính công cụ được thiết kế để bảo vệ bạn — đã trở thành vector tấn công. LiteLLM không có lỗ hổng trực tiếp; nó bị xâm nhập thông qua dependency CI/CD dựa trên một công cụ bảo mật đã bị xâm nhập. Sự tin tưởng có tính bắc cầu và rất mong manh.
File .pth Là Cơ Chế Nguy Hiểm Trong Python
Kỹ thuật startup hook .pth (MITRE ATT&CK T1546.018) thực thi mỗi khi Python interpreter khởi động mà không cần import gì cả. Hầu hết lập trình viên không biết cơ chế này tồn tại, dù nó đã có trong Python hàng thập kỷ. Nó vượt qua mọi kiểm soát bảo mật ở tầng ứng dụng.
Xác Minh Hash Không Đủ Cho Tấn Công Chuỗi Cung Ứng
Các kiểm tra tính toàn vẹn tiêu chuẩn (xác minh hash của pip, file RECORD trong wheel) đều pass vì nội dung mã độc được phát hành bằng thông tin xác thực hợp lệ bị đánh cắp. Package là “chính hãng” theo góc nhìn của PyPI.
Dependency Không Ghim Phiên Bản Trong CI/CD Là Rủi Ro Nghiêm Trọng
LiteLLM kéo Trivy mà không ghim phiên bản, nghĩa là bất kỳ xâm nhập nào ở upstream đều tự động lan truyền xuống. Mọi dependency trong pipeline build cần được ghim vào phiên bản cụ thể và xác minh.
Phát Hiện Tình Cờ Không Phải Là Chiến Lược
Mã độc chỉ bị phát hiện vì một lỗi trong code của kẻ tấn công (fork bomb). Một backdoor hoạt động đúng có thể đã chạy không bị phát hiện trong nhiều tuần hoặc nhiều tháng trên hàng triệu máy.
Phản Ứng Cộng Đồng Có Thể Bị Dập Tắt
Kẻ tấn công sử dụng 88 comment bot từ 73 tài khoản bị xâm nhập trong 102 giây và chiếm quyền tài khoản maintainer để đóng các issue phơi bày sự cố. Việc có nhiều kênh liên lạc và kế hoạch ứng phó sự cố là thiết yếu.
Điều Này Có Ý Nghĩa Gì Cho Tương Lai
Tự Động Hóa Tấn Công Bằng AI
TeamPCP đã vận hành hackerbot-claw, một hệ thống AI agent cho việc nhắm mục tiêu tự động. Kẻ tấn công trong tương lai sẽ dùng AI để tự động phát hiện lỗi cấu hình CI/CD ở quy mô lớn, tạo payload tinh vi hơn, và thích ứng mã độc theo thời gian thực dựa trên môi trường mục tiêu.
Hạ Tầng C2 Phi Tập Trung
Kẻ tấn công sử dụng canister Internet Computer Protocol (ICP) làm hạ tầng C2 (CanisterWorm), khiến nó có khả năng chống lại việc hạ domain truyền thống. Hãy chờ đợi các cuộc tấn công tương lai ngày càng sử dụng hạ tầng blockchain/phi tập trung mà không thể bị tịch thu.
Vũ Khí Hóa Công Cụ Bảo Mật
Cuộc tấn công này nhắm cụ thể vào các công cụ quét bảo mật (Trivy, Checkmarx KICS) — các công cụ vốn chạy với quyền cao trong pipeline CI/CD. Mẫu “đảo ngược tin tưởng” này nhiều khả năng sẽ được tái sử dụng với các công cụ SAST/DAST, quét container image, kiểm tra dependency, và hạ tầng ký mã.
Lan Truyền Worm Gốc Kubernetes
Khả năng di chuyển ngang — tự động triển khai pod đặc quyền trên mọi node — chứng minh rằng hạ tầng cloud-native tạo ra các đường lan truyền worm mới. Các biến thể tương lai có thể nhắm vào service mesh (Istio/Linkerd sidecar), GitOps controller (ArgoCD/Flux), và admission webhook.
Lớp Hook Trước Import Kiểu .pth
Mọi hệ sinh thái ngôn ngữ đều có cơ chế tương tự: Node.js --require, thao tác $LOAD_PATH của Ruby, Java agent. Hãy chờ đợi các kỹ thuật tương tự xuất hiện trên mọi hệ sinh thái nơi startup hook có thể thực thi code trước khi ứng dụng kịp nhận biết.
Những Điều Cần Nhớ
Sự cố này là hồi chuông cảnh tỉnh rằng chuỗi cung ứng phần mềm hiện đại có mối quan hệ tin tưởng sâu và có tính bắc cầu. Kẻ tấn công xâm nhập công cụ bảo mật để xâm nhập pipeline build để xâm nhập package để xâm nhập hệ thống người dùng cuối — một chuỗi bốn bước nhảy mà các mô hình bảo mật truyền thống không được thiết kế để phát hiện.
Những gì bạn có thể làm ngay hôm nay:
- Ghim mọi dependency trong pipeline CI/CD — bao gồm cả công cụ quét bảo mật
- Sử dụng requirements ghim hash (
pip-compile --generate-hashes) cho dự án Python - Kiểm tra file
.pthtrong site-packages thường xuyên - Giám sát hành vi bất thường của tiến trình — fork bomb, kết nối mạng lạ, dịch vụ systemd mới
- Coi xoay vòng thông tin xác thực là bắt buộc sau bất kỳ nghi ngờ xâm nhập chuỗi cung ứng nào — không phải tùy chọn
Tham Khảo
- Snyk: Poisoned Security Scanner Backdooring LiteLLM
- Snyk Vulnerability ID: SNYK-PYTHON-LITELLM-15762713
- MITRE ATT&CK: T1546.018 (Python Startup Hooks)
Bai viet lien quan
- Axios Bị Chiếm Quyền Trên npm — RAT Ẩn Trong Thư Viện HTTP Client Phổ Biến Nhất
- Khi Malware Gọi Lên Cloud Xin Chỉ Thị — Case Study Về Tấn Công Mạng Bằng AI
- Bleeding Llama — Khi Một File GGUF Có Thể Hút Cạn Bộ Nhớ Máy Chủ Ollama Của Bạn
- Claude Code vs OpenClaw vs NemoClaw — AI Agent Nào Phù Hợp Với Bạn?
- Parallelization: Thực thi đồng thời cho quy trình Agentic