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.pth và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ạnHành động
Tầng 1: Thu Thập Thông Tin Xác ThựcThu 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óaSử 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 NgangCà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:

  1. Ghim mọi dependency trong pipeline CI/CD — bao gồm cả công cụ quét bảo mật
  2. Sử dụng requirements ghim hash (pip-compile --generate-hashes) cho dự án Python
  3. Kiểm tra file .pth trong site-packages thường xuyên
  4. 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
  5. 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