L’incident Binance à 6,3 milliards de dollars : ce qui s’est passé et comment réduire le risque

Croissance produit chez Semaphore UI
12 min de lecture

Un ordinateur d’employé compromis peut mettre en danger bien plus que les fichiers locaux. Nous examinons l’attaque contre Binance et montrons comment une automatisation contrôlée avec Semaphore UI peut limiter ce qu’un attaquant peut atteindre, modifier et continuer à utiliser.

Discuter de cet article avec une IA

Vue d’ensemble

Le 29 octobre 2026, des attaquants ont atteint les systèmes de signature des portefeuilles de Binance. Dans son rapport préliminaire du 3 novembre, Binance a estimé les actifs concernés à environ 6,34 milliards de dollars, dont 2,85 milliards gelés ou interceptés. L’intrusion a commencé sur des ordinateurs d’employés.

Ce point de départ est familier bien au-delà des cryptomonnaies. Un poste de travail compromis peut exposer des identifiants de production, des droits de déploiement et des outils internes permettant d’atteindre les appareils d’autres employés. Le défi technique consiste à empêcher ces permissions de transformer un compte compromis en prise de contrôle d’un service critique.

Comment l’attaque s’est déroulée

Les premières conclusions de Binance décrivent des compromissions d’ordinateurs d’employés en juin et en septembre, suivies d’une intrusion plus large via des outils internes d’IA le 20 octobre. Les attaquants ont atteint les ordinateurs de deux collègues et trouvé un jeton de déploiement de conteneurs. Le 29 octobre, ils l’ont utilisé pour déployer un code malveillant qui a atteint les systèmes de signature des portefeuilles et déclenché des transferts non autorisés.

  1. Programme d’installation Homebrew altéré

    Binance a remplacé l’appareil et renouvelé les identifiants. L’attaquant avait découvert le rôle de l’ingénieur et l’identité de ses collègues.

  2. Exercice d’entretien malveillant

    Un dépôt malveillant a donné aux attaquants un point d’entrée sur l’ordinateur d’un autre employé.

  3. Obtention du jeton de déploiement

    Les outils internes d’IA ont aidé les attaquants à atteindre des collègues et à trouver le jeton.

  4. 17:15–19:56 UTC

    Déploiement du conteneur malveillant

    Le jeton de déploiement volé a permis au code malveillant d’atteindre les systèmes de signature des portefeuilles.

  5. 20:05–20:09 UTC

    Début des transferts non autorisés

  6. 23:56 UTC

    Règlement du dernier transfert non autorisé

  7. 00:10 UTC

    Révocation de la délégation Ethereum

    La permission sur la chaîne nécessitait sa propre révocation.

Chronologie de l’incident Binance, 2026. Toutes les heures sont indiquées en UTC.

Les attaquants ont aussi utilisé le service de signature pour créer une délégation EIP-7702, c’est-à-dire une permission permettant à un code qu’ils contrôlaient d’agir pour un portefeuille Ethereum. Cette permission existait sur la blockchain, indépendamment des systèmes de retrait de Binance. Suspendre les retraits ne pouvait pas la supprimer. Binance devait la révoquer séparément sur la chaîne.

Il faut distinguer l’arrêt d’une activité de la suppression de l’autorité qui la permet. Remplacer un appareil, révoquer un identifiant de déploiement et annuler une permission dans un autre système répondent chacun à une partie différente de l’intrusion.

Ce que l’incident révèle sur la sécurité en production

Un ordinateur portable, un système de déploiement et un service sensible remplissent des fonctions différentes. Le risque augmente lorsque l’accès à l’un ouvre automatiquement le suivant. Un jeton volé peut permettre à un attaquant de remplacer un logiciel. Celui-ci peut ensuite agir avec des permissions que l’employé n’a jamais détenues directement.

Quatre questions permettent de repérer où interrompre cette progression :

  1. Exposition des identifiants. Quels accès à la production un attaquant peut-il obtenir depuis l’appareil d’un employé ?
  2. Privilèges de déploiement. Qui peut modifier le code exécuté avec ces accès ?
  3. Autorisation du service. Quelles actions un service sensible acceptera-t-il de ce code ?
  4. Accès persistant. Quelles nouvelles permissions pourraient subsister après la désactivation du compte d’origine ?

L’objectif est de limiter la transmission de l’autorité entre les systèmes, puis d’identifier et de révoquer tout accès supplémentaire créé pendant une intrusion. Les sections suivantes examinent quatre contrôles qui contribuent à cet objectif.

Ordinateur portable compromis

L’attaquant contrôle l’appareil

1Limiter les identifiants
Jeton de déploiement
Système de déploiement

Accepte une modification logicielle

2Protéger les modifications
Code malveillant
Charge de travail en cours

Le code hérite de ses permissions

Identité de service
Service sensible

Exécute des requêtes privilégiées

3Autoriser les requêtes
4
Endiguement et révocation

Identifier et révoquer les nouveaux identifiants et permissions dans tous les systèmes affectés.

Un jeton volé peut autoriser un nouveau code, qui utilise ensuite les permissions de la charge de travail. Les contrôles 1–3 limitent ce chemin. Le contrôle 4 traite les accès créés à tout endroit pendant l’intrusion.

Contrôle 1. Réduire les identifiants qu’un ordinateur portable peut exposer

Un identifiant est utile à un attaquant parce qu’un autre système l’accepte comme preuve d’autorité. Conserver moins d’identifiants de production sur les appareils des employés réduit ce qui peut être volé lorsqu’un outil, un dépôt ou une session de navigateur est compromis.

Pour les opérations courantes, un employé a souvent besoin de l’autorisation de demander une opération, comme le redémarrage d’un service. L’identifiant qui l’exécute peut rester associé à une identité d’exécution distincte. Réduire l’exposition implique donc à la fois de supprimer les copies inutiles et de gérer les identifiants restants :

  • Remplacez les accès directs courants par des opérations précisément définies lorsque c’est possible.
  • Utilisez des identités distinctes pour des fonctions distinctes et limitez leur périmètre et leur durée de validité.
  • Tenez un inventaire des identifiants, de leurs responsables et de leur procédure de révocation.

Cela applique le principe des recommandations d’OWASP sur la gestion des secrets : réduire la manipulation humaine des secrets et n’accorder à chaque identité que les accès nécessaires. Un poste compromis expose alors moins d’identifiants réutilisables, et les intervenants savent qui gère ceux qu’il reste à révoquer.

Contrôle 2. Traiter les droits de déploiement comme des privilèges de production

Un secret peut être caché à une personne tout en restant accessible au code qu’elle déploie. Quiconque peut modifier ce code pourrait lire le secret, appeler une API interne ou agir avec le compte de service de l’application. Les accès de déploiement doivent donc être évalués en fonction des permissions de la charge de travail résultante.

Les recommandations d’OWASP sur la sécurité CI/CD considèrent les modifications du dépôt, la configuration du pipeline et les hôtes d’exécution comme des composantes d’un même problème de sécurité. La protection doit couvrir le code avant le déploiement et ses permissions après celui-ci :

  • Exigez une revue du code de production et protégez la branche du dépôt exécutée par l’automatisation.
  • Contrôlez les modifications des définitions de tâches, des dépendances et des paramètres de lancement, ainsi que du script principal.
  • N’accordez aux charges de travail que les identifiants et les accès réseau nécessaires à leur fonction.

Deux ensembles de contrôles doivent fonctionner ensemble. Les permissions du dépôt et du déploiement déterminent qui peut modifier le code. Des politiques distinctes portant sur les identités, les hôtes et le réseau limitent ce que ce code peut faire une fois exécuté. Le stockage centralisé des secrets réduit l’exposition, tandis que ces politiques restreignent le programme qui utilise le secret.

Contrôle 3. Autoriser l’opération, pas seulement l’appelant

Un service de signature peut garder sa clé privée secrète tout en acceptant une demande de signature nuisible. La même distinction s’applique à une base de données ou à une API cloud : l’authentification d’une charge de travail identifie l’appelant, tandis que l’autorisation décide de ce qu’il peut faire.

OWASP recommande de vérifier l’autorisation à chaque requête et de refuser l’accès s’il n’est pas explicitement autorisé. Pour le service destinataire, cela signifie vérifier à la fois l’action et sa cible : destinataires et montants de paiement autorisés, opérations sur la base de données ou modifications de l’infrastructure.

Le résultat attendu est un service qui évalue l’action demandée même si l’appelant est déjà digne de confiance. L’automatisation encadre la manière de demander le travail. Le service destinataire détermine les opérations qu’il accepte.

Contrôle 4. Révoquer les accès créés pendant l’intrusion

Un attaquant peut utiliser une identité légitime pour ajouter un identifiant ou accorder des permissions supplémentaires. MITRE ATT&CK décrit la manipulation de comptes comme un moyen de conserver ou d’étendre des accès, notamment en ajoutant des identifiants cloud et des clés SSH. Désactiver la session d’origine ne supprime pas nécessairement ces modifications.

La délégation sur la chaîne chez Binance montre pourquoi les intervenants doivent examiner les permissions dans le système affecté lui-même. L’endiguement doit couvrir à la fois le point d’entrée initial et l’autorité créée à partir de celui-ci :

  • Limitez les identités d’automatisation autorisées à créer d’autres identifiants ou à accorder des permissions.
  • Incluez les comptes, sessions et délégations nouvellement créés dans le plan de réponse.
  • Vérifiez la révocation dans le système qui applique la permission, au lieu de considérer une tâche arrêtée comme une preuve d’endiguement.

Ces étapes donnent aux intervenants un ensemble défini d’identités et de permissions à examiner et à révoquer. Elles rendent aussi l’endiguement vérifiable : l’équipe peut contrôler que chaque voie connue vers le service affecté est réellement fermée.

Ces contrôles agissent à différents niveaux : l’appareil de l’employé, le système de déploiement, le service destinataire et le processus de réponse. Chacun exige un responsable et un moyen de vérifier que ses restrictions tiennent lorsqu’un autre niveau est compromis.

Comment l’automatisation contrôlée aide

Les plateformes de gestion de l’automatisation traitent la partie de ce problème située entre la demande d’un employé et l’exécution en production. Dans Semaphore UI, une équipe peut préparer une tâche définie, contrôler qui peut l’exécuter ou la modifier, puis l’exécuter avec une identité distincte. L’autorisation dans le service cible et la révocation des permissions créées ailleurs restent la responsabilité de ces systèmes et de l’équipe de réponse.

Prenons un ingénieur d’astreinte qui doit redémarrer un service d’API. Un responsable de maintenance prépare un playbook et un Task Template qui fixent les hôtes cibles et le déroulement du redémarrage. L’ingénieur lance la tâche et consulte le résultat sans ouvrir de session SSH en production. Les deux chemins ci-dessous réalisent le même redémarrage, mais confient l’identifiant d’exécution à des acteurs différents.

Accès direct

Ordinateur de l’employé Détient la clé de production
Accès SSH direct
Hôte de production

Le service redémarre

Un ordinateur portable compromis peut exposer l’identifiant de production réutilisable.

Via Semaphore UI

Ordinateur de l’employé

Permission d’exécuter la tâche enregistrée

Demander la tâche
Limite d’exécution Serveur ou runner Semaphore Utilise une clé à portée limitéeKey Store ou gestionnaire de secrets externe
Exécuter l’opération
Hôte de production

Le service redémarre

Dans cette configuration, la clé d’exécution reste hors de l’appareil de l’employé. Une session volée peut toujours exécuter les tâches autorisées.

Un redémarrage, deux modèles d’accès : des identifiants directs de production ou la permission d’exécuter une tâche contrôlée.

Construire le flux de redémarrage demande quatre étapes liées : créer une identité d’exécution restreinte, définir ce que les utilisateurs peuvent exécuter ou modifier, choisir l’environnement d’exécution et rendre le résultat visible. Une fois ces étapes en place, la même approche peut être étendue aux déploiements.

Étape 1. Créer une identité d’exécution restreinte

Commencez sur les hôtes cibles. Créez un compte d’automatisation dont l’accès privilégié se limite au redémarrage du service d’API. Il ne doit pas pouvoir modifier la définition du service ni exécuter d’autres commandes privilégiées. Utilisez un identifiant distinct en lecture seule pour récupérer le dépôt du playbook. Ces restrictions déterminent ce que l’automatisation peut faire même en cas d’utilisation abusive de son identifiant.

Dans le Key Store du projet, enregistrez l’identifiant SSH et sélectionnez-le dans l’inventaire de production qui liste les hôtes cibles. Choisissez un stockage dans la base de données locale ou une référence à un fichier serveur protégé ou à une variable d’environnement. Pour le stockage local, configurez les clés de chiffrement et protégez ces clés séparément des sauvegardes de la base de données.

Si l’équipe utilise déjà un gestionnaire de secrets pris en charge, comme OpenBao dans Pro ou AWS Secrets Manager dans Enterprise, enregistrez-le sous Key Store → Storages et référencez le secret existant lors de la création de la clé. Limitez l’intégration aux secrets nécessaires à ce flux. L’opérateur peut alors demander le redémarrage sans récupérer l’identifiant d’exécution.

Étape 2. Définir ce que l’opérateur peut exécuter ou modifier

Enregistrez ensuite un modèle “Restart API” avec le playbook relu, l’inventaire de production et les variables nécessaires. Réservez les modifications de ces ressources aux responsables de maintenance. Pour les opérateurs, choisissez un rôle de projet permettant l’exécution sans modification : le rôle intégré Task Runner peut exécuter tous les modèles du projet, ils doivent donc tous convenir à ce groupe.

Pour donner accès à certains modèles, utilisez les rôles personnalisés et permissions de modèles d’Enterprise avec un rôle de base qui n’accorde pas déjà l’exécution à l’échelle du projet. Ces droits s’additionnent, donc attribuer un rôle personnalisé restreint n’annule pas les permissions plus larges que l’utilisateur détient déjà.

Cette distinction peut ainsi être appliquée : les opérateurs peuvent demander un redémarrage préparé, tandis que les responsables de maintenance contrôlent le code, les cibles et les identifiants correspondants. Testez les permissions combinées avec un compte opérateur avant d’accorder un accès à la production.

Étape 3. Confier l’exécution à un runner restreint

Installez un runner distant sur un hôte dédié capable d’atteindre les serveurs d’API. Lorsque l’opérateur lance “Restart API”, le runner exécute le playbook et renvoie sa sortie à Semaphore. Les employés ont besoin d’accéder à Semaphore, tandis que les règles de pare-feu peuvent limiter la connexion d’administration de production au runner.

N’accordez à cet hôte d’exécution que les accès nécessaires aux tâches qui lui sont confiées :

  • Séparez l’exécution en production des charges de travail moins fiables et des environnements de développement.
  • Limitez les privilèges système du runner, ses connexions sortantes et les identifiants montés. Protégez son jeton d’authentification et utilisez HTTPS avec vérification pour le connecter à Semaphore.
  • Utilisez les tags de runner dans Pro, comme production, pour diriger le modèle vers les runners prévus. Appliquez les restrictions réseau sur ces hôtes.

Cela limite les endroits où les identifiants de production peuvent être utilisés et les systèmes accessibles à la tâche. Un runner n’est pas automatiquement un bac à sable : ses tâches peuvent utiliser les fichiers, les identifiants et le réseau accessibles à leur processus. Séparez l’exécution en production des tâches non fiables, puis durcissez et mettez à jour le runner comme le serveur Semaphore.

Étape 4. Examiner l’exécution et rendre les abus visibles

Après le redémarrage, l’opérateur ouvre le résultat de la tâche pour examiner son statut, sa sortie et la révision du dépôt. Incluez un contrôle de santé du service dans le playbook afin que le résultat indique si l’API s’est rétablie, pas seulement si la commande de redémarrage a réussi. N’exposez pas de secrets dans cette sortie.

Configurez des notifications de résultats de tâches vers un canal surveillé par l’équipe d’astreinte et convenez de qui examine les exécutions inattendues. Une tâche réussie peut malgré tout correspondre à une activité non autorisée. Pendant une investigation, corrélez le journal d’exécution avec ceux des hôtes, du fournisseur d’identité et du gestionnaire de secrets pour comprendre comment l’accès a été obtenu et utilisé.

L’équipe dispose désormais d’un enregistrement partagé de l’opération demandée et de son résultat. Cela facilite l’examen des activités inhabituelles, à condition qu’une personne les surveille et dispose d’une procédure de réponse claire.

Appliquer les mêmes contrôles aux déploiements

Un déploiement utilise le même modèle d’accès, mais installe aussi un logiciel. Créez un modèle distinct “Deploy API” avec une identité de déploiement dont les permissions se limitent à cette application. Sa configuration doit encadrer à la fois le code qui effectue le déploiement et la version installée :

  • Fixer le code de déploiement et la cible. Utilisez deploy_api.yml depuis une branche main protégée et l’inventaire production-api. Désactivez les invites de sélection de branche, d’inventaire et d’arguments CLI.
  • Réserver les modifications aux responsables de maintenance. Les opérateurs peuvent lancer le modèle, tandis que les responsables de maintenance contrôlent son code, ses identifiants et sa configuration.
  • Valider la sélection de la version dans le playbook. Vérifiez chaque variable de lancement susceptible d’influencer la version. Faites correspondre un identifiant de version autorisé à un artefact immuable issu du processus de build de confiance, puis vérifiez son origine et son intégrité avant le déploiement. Rejetez les références d’images arbitraires et les paramètres non reconnus.

Ces contrôles limitent ce qu’une session opérateur volée peut déployer. Semaphore applique les droits d’accès aux tâches. La revue Git et le playbook encadrent le code et les artefacts. Le droit de modifier ce playbook reste un privilège de production.

Que la tâche redémarre un service ou déploie une version, l’opérateur reçoit son résultat sans recevoir l’identifiant d’exécution. L’équipe peut maintenant tester la distinction essentielle : quelles actions en production restent possibles via la session de cet opérateur ?

Ce qu’une session volée peut encore faire

Une session opérateur volée peut toujours demander les opérations que ce compte est autorisé à exécuter. Même un redémarrage autorisé peut perturber un service s’il est déclenché à répétition. Testez le flux configuré avec un compte opérateur réaliste en préproduction, en examinant à la fois ses possibilités et la réponse de l’équipe à un abus :

  • Permissions sur les tâches et les paramètres. Essayez les rôles réels et les options de lancement, notamment les branches, inventaires et arguments alternatifs.
  • Accès au-delà de l’opération prévue. Vérifiez les accès à d’autres modèles, identifiants et systèmes de production, y compris ce que le processus du runner peut atteindre.
  • Détection et impact opérationnel. Confirmez qui reçoit les résultats, qui examine les activités inattendues et si des exécutions répétées peuvent entraîner des perturbations inacceptables.
  • Révocation. Testez la révocation des sessions et des jetons, puis identifiez les permissions que l’identité d’exécution pourrait créer ailleurs.

Documentez les accès conservés par le compte de test et fermez toute voie qui dépasse l’objectif de l’opération. À l’issue de l’exercice, l’équipe doit savoir ce qu’une session volée pourrait faire et comment détecter et contenir ces abus.

La sécurité au quotidien

Les contrôles d’accès complètent la protection des postes et une équipe qui sait réagir. Rendez le flux préparé assez pratique pour être utilisé sans revenir aux clés partagées ni aux raccourcis non documentés. Appuyez-le sur quelques habitudes quotidiennes :

  • Exécutez les programmes d’installation inconnus et les exercices d’entretien dans des environnements jetables et isolés, sans identifiants d’entreprise, montages de l’hôte ni accès aux réseaux internes.
  • Facilitez le signalement rapide des activités suspectes, sans chercher de coupable. Donnez aux personnes un contact clair et une procédure de réponse aux incidents.
  • Réexaminez les accès lorsque les fonctions changent, maintenez une procédure contrôlée d’accès d’urgence et répétez les révocations avant un incident.

Ces pratiques relient la prévention, la détection et la récupération au travail quotidien. Elles contribuent à garder le modèle d’accès cohérent avec l’évolution des responsabilités et donnent à l’équipe une réponse connue lorsqu’un événement suspect survient.

Limiter la portée de la prochaine compromission

La leçon centrale est de limiter l’autorité qu’une identité compromise peut accumuler. Moins d’identifiants sur les ordinateurs portables, une automatisation relue, des hôtes d’exécution restreints et une autorisation dans les services de production réduisent chacun les chemins qu’un attaquant peut emprunter.

Semaphore intègre plusieurs de ces contrôles dans un flux reproductible : tâches préparées, permissions distinctes pour l’exécution et la modification, identifiants fournis de façon centralisée et journaux d’exécution visibles. Les opérateurs disposent des actions nécessaires à leur travail, tandis que les responsables de maintenance gardent le contrôle du code et des identifiants sous-jacents.

Commencez par une opération de production fréquente : préparez son modèle de tâche, attribuez les permissions opérateur nécessaires et testez les accès obtenus avant de retirer la connexion directe qu’il remplace. Le bon indicateur de progrès est le peu de choses qu’un attaquant peut faire avec le prochain compte qu’il compromet.

Sources

  1. Binance, “29 October 2026 Binance Security Incident: Initial Findings and Response Update”. URL: https://www.binance.com/en/blog/community/3229153443759566763 (consulté le : ).
  2. OWASP Foundation, “Secrets Management Cheat Sheet”. URL: https://cheatsheetseries.owasp.org/cheatsheets/Secrets_Management_Cheat_Sheet.html (consulté le : ).
  3. OWASP Foundation, “CI/CD Security Cheat Sheet”. URL: https://cheatsheetseries.owasp.org/cheatsheets/CI_CD_Security_Cheat_Sheet.html (consulté le : ).
  4. OWASP Foundation, “Authorization Cheat Sheet”. URL: https://cheatsheetseries.owasp.org/cheatsheets/Authorization_Cheat_Sheet.html (consulté le : ).
  5. MITRE ATT&CK, “Account Manipulation (T1098)”. URL: https://attack.mitre.org/techniques/T1098/ (consulté le : ).
  6. Semaphore UI, “Task Templates”. URL: https://semaphoreui.com/docs/user-guide/task-templates (consulté le : ).
  7. Semaphore UI, “Key Store”. URL: https://semaphoreui.com/docs/user-guide/key-store (consulté le : ).
  8. Semaphore UI, “Inventory”. URL: https://semaphoreui.com/docs/user-guide/inventory (consulté le : ).
  9. Semaphore UI, “Encryption Keys”. URL: https://semaphoreui.com/docs/admin-guide/security/encryption (consulté le : ).
  10. Semaphore UI, “AWS Secrets Manager secret storage”. URL: https://semaphoreui.com/docs/user-guide/key-store/aws-secrets-manager (consulté le : ).
  11. Semaphore UI, “Teams”. URL: https://semaphoreui.com/docs/user-guide/team (consulté le : ).
  12. Semaphore UI, “Runners”. URL: https://semaphoreui.com/docs/admin-guide/runners (consulté le : ).
  13. Semaphore UI, “Tasks”. URL: https://semaphoreui.com/docs/user-guide/tasks (consulté le : ).
  14. Semaphore UI, “Alerts”. URL: https://semaphoreui.com/docs/user-guide/alerts (consulté le : ).