🔍 Contexte

Publié le 28 mai 2026 par Yair Balilti (Token Security Research Team), cet article détaille une chaîne d’attaque en 5 étapes baptisée Zapocalypse, découverte sur la plateforme d’automatisation Zapier. La recherche a débuté le 10 février 2026 et a été divulguée le 12 février 2026 via HackerOne. Zapier a confirmé la remédiation complète le 5 mars 2026.

🧱 Chaîne d’exploitation

Étape 1 — Évasion du sandbox Python : La fonctionnalité “Code by Zapier” exécute du Python arbitraire dans une Lambda AWS (python3.11, us-east-1). L’appel os.system('env') révèle l’environnement Lambda. Le code utilisateur est injecté via exec() dans le même processus que celui ayant détenu les credentials AWS.

Étape 2 — Récupération de credentials STS depuis la mémoire : Bien que le code Lambda supprime les variables d’environnement AWS via del os.environ[k], les bytes restent en mémoire heap. Via /proc/self/mem et des regex ciblées (préfixes AKIA, ASIA, IQoJ), les tokens STS orphelins sont récupérés — y compris ceux d’invocations précédentes sur des containers warm-started.

Étape 3 — Mouvement latéral via allow_nothing_role : Les credentials récupérés appartiennent à allow_nothing_role. L’énumération IAM révèle que ce rôle autorise ecr:DescribeRepositories, ecr:BatchGetImage, ecr:ListImages, ecr:GetDownloadUrlForLayer sur 1 111 dépôts ECR privés de Zapier. L’absence de ecr:GetAuthorizationToken est contournée par des appels directs aux APIs ECR (sans Docker).

Étape 3b — Clé MCP hardcodée dans un container LiteLLM : Un container LiteLLM privé contient une clé API Zapier Actions MCP (sk-ak-…) hardcodée dans le code source, appartenant à un co-fondateur de LiteLLM. Cette clé donne accès à gmail_send_email, edit_actions, add_actions — permettant l’envoi d’emails depuis le compte Gmail réel du co-fondateur (DMARC/DKIM valides).

Étape 4 — Token NPM dans les métadonnées de l’image : Un token NPM de publication est découvert dans l’historique de build (history[]) du config blob d’une image ECR récente. Le token présente : action: write, scope.name: null, bypass_2fa: true — soit des droits de publication non scopés sur tous les packages du compte, sans MFA.

Étape 5 — Supply chain vers XSS stocké sur zapier.com : Le package @zapier/zapier-design-system (chargé sur chaque page authentifiée de zapier.com) est dans le périmètre de publication. Une version malveillante aurait exécuté du JavaScript attaquant dans chaque session authentifiée Zapier, permettant un Account Takeover (ATO) complet de tous les utilisateurs.

📦 Packages concernés

  • zapier-platform-core (public, SDK développeurs)
  • zapier-platform-cli (public)
  • zapier-design-system (privé, chargé sur zapier.com)
  • Autres packages internes @zapier/*

📅 Timeline de divulgation

  • 10 fév. 2026 : Début de la recherche
  • 12 fév. 2026 : Rapport HackerOne #3552705 déposé
  • 16 fév. 2026 : Révocation du token NPM, durcissement du rôle ECR
  • 26 fév. 2026 : Bounty payé (3 000 $, maximum du programme)
  • 5 mars 2026 : Remédiation complète confirmée

📌 Type d’article

Il s’agit d’une analyse technique / publication de recherche détaillant une chaîne d’exploitation originale sur une plateforme SaaS majeure, avec scripts, raisonnement et timeline de divulgation responsable.

🧠 TTPs et IOCs détectés

TTP

  • T1059.006 — Command and Scripting Interpreter: Python (Execution)
  • T1552.001 — Unsecured Credentials: Credentials In Files (Credential Access)
  • T1552.007 — Unsecured Credentials: Container API (Credential Access)
  • T1530 — Data from Cloud Storage (Collection)
  • T1610 — Deploy Container (Defense Evasion)
  • T1195.001 — Supply Chain Compromise: Compromise Software Dependencies and Development Tools (Initial Access)
  • T1078 — Valid Accounts (Defense Evasion)
  • T1083 — File and Directory Discovery (Discovery)
  • T1046 — Network Service Discovery (Discovery)
  • T1190 — Exploit Public-Facing Application (Initial Access)

IOC

  • Fichiers : lambda_function.py
  • Fichiers : extract_secrets_from_memory.py
  • Fichiers : postinstall.js
  • Chemins : /proc/self/mem
  • Chemins : /proc/self/maps
  • Chemins : /var/task

Malware / Outils

  • enumerate-iam (tool)

🟡 Indice de vérification factuelle : 50/100 (moyenne)

  • ⬜ token.security — source non référencée (0pts)
  • ✅ 26693 chars — texte complet (fulltext extrait) (15pts)
  • ✅ 7 IOCs (IPs/domaines/CVEs) (10pts)
  • ⬜ 0/1 IOCs confirmés externellement (0pts)
  • ✅ 10 TTPs MITRE identifiées (15pts)
  • ✅ date extraite du HTML source (10pts)
  • ⬜ aucun acteur de menace nommé (0pts)
  • ⬜ pas de CVE à vérifier (0pts)

🔗 Source originale : https://www.token.security/blog/zapocalypse-the-attack-chain-that-could-have-hijacked-zapier