Race Conditions et Smashing the State Machine

Découvrez comment l'attaque « Smashing the State Machine » a révolutionné l'exploitation des race conditions web.

CVSS 9.2
CVE-2024-6387 regreSSHion dans OpenSSH
1 ms
Spread médian entre requêtes synchronisées
7M+
Instances OpenSSH vulnérables identifiées
5 000 $
Primes HackerOne pour race conditions

1. Qu'est-ce qu'un « état » dans une machine ?

Un état représente une situation particulière dans laquelle se trouve un système à un instant donné. Ce concept, fondamental en informatique, régit le fonctionnement de pratiquement toutes les applications que nous utilisons quotidiennement.

Prenons l'exemple concret d'un distributeur automatique de billets. Cette machine traverse plusieurs états distincts lors d'une transaction : état « prêt à l'emploi » (attente d'une carte), état « lecture de la carte » (validation des informations), état « saisie du code PIN », état « validation du code », état « sélection de l'opération », et enfin état « distribution d'argent » ou « fin de transaction ».

Machine à états finie

Chaque état est associé à un ensemble d'actions possibles et à des transitions permettant de passer à l'état suivant. Ces transitions peuvent être conditionnelles : la machine ne passera à l'état « sélection de l'opération » que si le code PIN saisi est valide.

Cette logique s'applique identiquement aux applications web. Lorsque vous effectuez un achat en ligne, le serveur traverse plusieurs états : affichage du panier, application d'un code promo, validation du paiement. C'est précisément dans ces transitions d'état que se cachent les vulnérabilités exploitables par race condition.

Diagramme des états d'une machine lors d'un achat en ligne
Les différents états d'une machine lors d'un processus d'achat en ligne

2. Les race conditions : quand le timing devient une arme

Une race condition (condition de concurrence en français) se produit lorsque plusieurs processus s'exécutent simultanément et accèdent à la même ressource sans coordination adéquate. Le résultat final dépend alors de l'ordre d'exécution, qui devient imprévisible.

Illustrons avec un exemple parlant : un site de vente de billets d'avion avec un seul siège disponible. Deux utilisateurs cliquent sur « Acheter » au même instant. Logiquement, seul le premier devrait obtenir le billet. Mais si le système vérifie d'abord la disponibilité puis effectue la réservation dans deux opérations séparées, les deux utilisateurs peuvent passer la vérification avant que la réservation ne soit enregistrée.

2.1 La fenêtre de course (race window)

La période pendant laquelle une collision est possible s'appelle la fenêtre de course (race window). Cette fenêtre peut être extrêmement courte, de l'ordre de quelques microsecondes, ce qui rendait historiquement ces attaques difficiles à exploiter à distance.

Impacts potentiels des race conditions

Utilisation multiple d'un code promo à usage unique, dépassement de limite de retrait bancaire, contournement de l'anti-bruteforce, duplication de paiements, corruption de données utilisateur.

2.2 Le problème du network jitter

Le network jitter désigne la variation du temps de latence entre l'émission et la réception des paquets réseau. Sur Internet, les paquets empruntent des chemins différents avec des latences variables, créant une irrégularité qui rendait les attaques par race condition imprévisibles.

Pour exploiter une race condition, il faut que plusieurs requêtes arrivent dans la même fenêtre temporelle sur le serveur. Avec des variations de latence de plusieurs dizaines de millisecondes, synchroniser des requêtes à distance semblait impossible. C'est précisément ce problème que la technique « Smashing the State Machine » résout.

3. La révolution Smashing the State Machine

Présentée à Black Hat USA 2023 par James Kettle, directeur de recherche chez PortSwigger, la technique Smashing the State Machine a transformé l'exploitation des race conditions web. L'innovation centrale : la single-packet attack.

Le principe est élégant : au lieu d'envoyer 20 requêtes dans 20 paquets TCP séparés (chacun subissant le jitter réseau), on encapsule les 20 requêtes dans un seul paquet TCP. Le serveur reçoit alors toutes les requêtes simultanément, éliminant totalement le problème du jitter.

01

Single-Packet Attack

Encapsulation de multiples requêtes HTTP/2 dans un seul paquet TCP pour éliminer le network jitter

02

Multiplexage HTTP/2

Exploitation du multiplexage en retenant stratégiquement le dernier octet de chaque requête

03

Libération synchronisée

Libération simultanée de tous les octets finaux pour une synchronisation à la milliseconde

L'algorithme exploite le multiplexage HTTP/2 : il retient stratégiquement le dernier octet de chaque requête, puis les libère tous simultanément. Les mesures de performance sont impressionnantes : avec un spread médian d'une milliseconde et un écart-type de seulement 0,3 ms entre Melbourne et Dublin (17 000 km), la synchronisation atteint une précision inégalée.

3.1 Les cinq classes de vulnérabilités identifiées

La recherche de Kettle identifie cinq catégories distinctes de vulnérabilités exploitables :

  • Limit overrun : dépassement de limites sur codes promo, cartes cadeaux, retraits bancaires
  • Multi-endpoint race conditions : collision entre endpoints différents partageant des données
  • Single-endpoint collisions : un endpoint entrant en collision avec lui-même
  • Partial construction attacks : exploitation d'objets partiellement initialisés
  • Deferred collisions : collisions retardées via traitement batch
Diagramme de flux montrant le traitement d'une requête d'application de code promo
Flux de traitement d'un code promo : l'attaque vise à injecter plusieurs requêtes avant la fin du traitement

3.2 CVE critiques exploitant des race conditions en 2024-2025

Les race conditions ne sont pas qu'un problème théorique. L'année 2024 a vu plusieurs CVE critiques exploitant ce type de vulnérabilité :

CVE Produit CVSS Impact
CVE-2024-6387 OpenSSH regreSSHion 9.2 RCE non authentifiée avec privilèges root
CVE-2024-50379 Apache Tomcat 9.8 TOCTOU lors de la compilation JSP
CVE-2024-0132 NVIDIA Container Toolkit 9.0 Container escape vers système hôte

CVE-2024-6387 : regreSSHion

Cette vulnérabilité dans OpenSSH permet une exécution de code à distance non authentifiée avec privilèges root sur les systèmes Linux glibc. Qualys a identifié environ 7 millions d'instances vulnérables dans le monde, et la CISA a confirmé son exploitation active.

4. Démonstration pratique : exploiter une race condition

PortSwigger propose des laboratoires pratiques sur sa Web Security Academy pour s'exercer à ces techniques. Voici une démonstration complète sur un scénario classique : l'exploitation multiple d'un code promo à usage unique.

4.1 Contexte du laboratoire

Le scénario est le suivant : nous devons acheter un article à 1 337 $ avec seulement 50 $ de crédit disponible. Un code promo « PROMO20 » offrant 20 % de réduction est disponible, mais il est censé être à usage unique. L'objectif : appliquer ce code plusieurs fois pour réduire suffisamment le prix.

Interface du laboratoire PortSwigger montrant le panier initial
État initial : après une première application du code promo, le prix passe de 1 337 $ à 1 069,60 $

4.2 Capture et analyse des requêtes avec Burp Suite

Avec Burp Suite, nous capturons les requêtes HTTP échangées avec le serveur. La requête POST d'application du code promo est notre cible principale. En tentant de renvoyer cette requête une seconde fois, nous obtenons le message « Coupon already applied », confirmant que le serveur vérifie bien l'unicité.

Capture Burp Suite montrant la requête POST
Requête POST capturée : l'application du code promo via /cart/coupon

4.3 Vérification du stockage de session

Pour confirmer que le panier est stocké côté serveur et lié à notre session, nous analysons les requêtes GET. En modifiant le cookie de session, le panier apparaît vide, confirmant que l'état est bien maintenu côté serveur. Cette vérification confirme une opportunité de race condition.

4.4 Préparation de l'attaque parallèle

Nous créons un groupe de requêtes identiques dans Burp Suite. La fonction « Send group (parallel) » permet d'envoyer toutes ces requêtes simultanément, exploitant le principe de la single-packet attack.

Interface Burp Suite montrant un groupe de requêtes
Groupe de requêtes préparées pour l'envoi parallèle dans Burp Suite

4.5 Exécution et résultats

Après avoir retiré le code promo du panier pour revenir à l'état initial, nous lançons l'attaque. Les résultats montrent que plusieurs requêtes réussissent à appliquer le code promo « simultanément », avant que le serveur n'ait eu le temps de marquer le code comme utilisé.

Requête n°17

« Coupon applied » - le code a été accepté

Requête n°20

« Coupon applied » - encore un succès !

Requête n°22

« Coupon already applied » - celle-ci a été bloquée

En répétant l'opération, nous parvenons à réduire le prix jusqu'à 24,07 $, bien en dessous de notre crédit de 50 $. Le laboratoire est résolu avec succès.

Message de succès du laboratoire
Laboratoire résolu : démonstration réussie de l'exploitation d'une race condition

Leçon clé de la démonstration

Cette démonstration illustre parfaitement comment une vérification « check-then-act » séparée (vérifier si le code est utilisé, puis l'appliquer) crée une fenêtre d'exploitation. La solution : combiner vérification et action dans une seule opération atomique.

5. Prévention et remédiation

La prévention des race conditions repose sur plusieurs principes fondamentaux issus de la gestion des transactions en base de données et de la programmation concurrente.

5.1 Le modèle ACID et les transactions atomiques

Une transaction doit respecter les propriétés ACID :

  • Atomicité : la transaction s'exécute entièrement ou pas du tout
  • Cohérence : la base reste cohérente avant et après la transaction
  • Isolation : les transactions concurrentes n'interfèrent pas entre elles
  • Durabilité : une fois validée, la modification est permanente

Le pattern recommandé combine vérification et action dans une seule opération SQL. Cette approche élimine la fenêtre TOCTOU (Time-of-check Time-of-use) en évitant un SELECT préalable suivi d'un UPDATE séparé.

Exemple de requête atomique

UPDATE accounts SET balance = balance - 100 WHERE id = ? AND balance >= 100;

Cette requête atomique vérifie et débite en une seule opération indivisible.

5.2 Les idempotency keys

Pour les APIs REST, les idempotency keys constituent la défense la plus efficace. Chaque requête POST critique inclut un identifiant unique (UUID v4) dans un header dédié. Le serveur stocke atomiquement cette clé et rejette toute requête avec une clé déjà vue.

Stripe et Adyen implémentent ce pattern avec une durée de cache de 24 à 48 heures. Cette approche garantit qu'une même opération ne peut pas être exécutée plusieurs fois, même en cas de retry réseau légitime.

5.3 Outils de détection et tests

Tests manuels

Burp Suite avec Turbo Intruder et « Send group in parallel » pour tester les endpoints critiques

Détection automatique

ThreadSanitizer en C/C++, Go Race Detector (go test -race) intégrés dans les pipelines CI/CD

5.4 Mesures complémentaires

  • Verrous distribués : Redis SETNX avec TTL ou Etcd pour les architectures microservices
  • Niveaux d'isolation : SERIALIZABLE offre la protection maximale au prix de performances réduites
  • Rate limiting : limiter le nombre de requêtes simultanées par session
  • Monitoring : détecter les patterns d'attaque via l'analyse des logs

Recommandation MITRE

Le MITRE souligne un conseil contre-intuitif pour CWE-367 (TOCTOU) : ne pas effectuer de vérification avant l'utilisation si cette vérification peut être invalidée. Verrouillez AVANT la vérification et utilisez des opérations atomiques combinant check et action.

6. Contexte réglementaire français : NIS2, DORA et nouvelles obligations

La gestion des race conditions prend une dimension réglementaire nouvelle avec l'entrée en vigueur de plusieurs textes européens imposant des tests de sécurité applicative documentés.

6.1 NIS2 et la sécurité du développement

La transposition française de NIS2 est attendue au premier trimestre 2026 avec une conformité complète exigée fin 2027. Environ 15 000 entités françaises sont concernées.

L'article 21 impose explicitement la « sécurisation du développement/maintenance incluant la gestion des vulnérabilités », avec obligation de tests réguliers de résilience. Les sanctions atteignent 10 millions d'euros ou 2 % du CA mondial pour les entités essentielles, bien que l'ANSSI ait annoncé une période de grâce de 3 ans.

6.2 DORA et les tests de pénétration obligatoires

DORA (Digital Operational Resilience Act) s'applique depuis le 17 janvier 2025 au secteur financier. L'article 24-27 impose des programmes de tests couvrant :

  • Scans de vulnérabilités
  • Revues de sécurité réseau
  • Analyses de code source
  • Tests basés sur des scénarios

Les TLPT (Tests de Pénétration Fondés sur la Menace) deviennent obligatoires tous les 3 ans pour les entités systémiques.

6.3 Cyber Resilience Act

Le Cyber Resilience Act (Règlement 2024/2847) impose :

  • À partir de septembre 2026 : notification obligatoire des vulnérabilités activement exploitées
  • À partir de décembre 2027 : interdiction de mettre sur le marché des produits contenant des vulnérabilités connues exploitables

Impact sur les tests de sécurité

Ces trois réglementations créent une obligation documentable de tests de sécurité applicative incluant la recherche de race conditions pour les entités concernées. Les RSSI doivent intégrer ces tests dans leurs programmes de conformité.

6.4 Les race conditions dans les bug bounty

Les race conditions figurent parmi les vulnérabilités les mieux récompensées sur HackerOne avec des primes atteignant 5 000 dollars. Les scénarios les plus valorisés concernent l'exploitation financière : codes promo multiples, paiements dupliqués, bypass de limites de retrait.

Cette valorisation économique confirme l'importance stratégique de ces vulnérabilités pour les organisations, particulièrement dans les secteurs e-commerce, fintech et services bancaires.

Points clés à retenir

  • Les race conditions exploitent des accès concurrents non synchronisés aux ressources partagées
  • La technique single-packet attack élimine le network jitter en encapsulant 20-30 requêtes HTTP/2 dans un seul paquet TCP
  • Les CVE critiques 2024 (regreSSHion CVSS 9.2, Apache Tomcat CVSS 9.8) confirment l'actualité de cette menace
  • La prévention repose sur les transactions atomiques respectant le modèle ACID et les idempotency keys
  • NIS2, DORA et le Cyber Resilience Act créent des obligations réglementaires de tests de sécurité applicative
  • Les outils clés : Burp Suite avec Turbo Intruder, ThreadSanitizer, Go Race Detector

Questions fréquentes

Une race condition est une vulnérabilité qui survient lorsque plusieurs processus ou requêtes accèdent simultanément à une même ressource partagée sans synchronisation adéquate. Le résultat de l'opération dépend alors de l'ordre d'exécution, créant une fenêtre d'exploitation pour les attaquants. C'est un problème classique de programmation concurrente qui peut conduire à des comportements imprévisibles et exploitables.

Smashing the State Machine est une technique d'exploitation des race conditions web développée par James Kettle de PortSwigger en 2023. Elle utilise la single-packet attack pour synchroniser parfaitement l'envoi de multiples requêtes HTTP/2 dans un seul paquet TCP, éliminant le network jitter qui rendait ces attaques imprévisibles. Cette innovation a révolutionné l'exploitation des race conditions en permettant une synchronisation à la milliseconde près.

Les CVE majeures incluent CVE-2024-6387 (regreSSHion) dans OpenSSH avec un score CVSS jusqu'à 9.2, CVE-2024-50379 dans Apache Tomcat (CVSS 9.8), et CVE-2024-0132 dans NVIDIA Container Toolkit (CVSS 9.0). Ces vulnérabilités permettent l'exécution de code à distance sans authentification. La CVE regreSSHion affecte environ 7 millions d'instances OpenSSH dans le monde et permet un accès root complet.

Utilisez Burp Suite avec Turbo Intruder et la fonction « Send group in parallel » pour les tests manuels. Pour le code, activez ThreadSanitizer en C/C++ ou le Go Race Detector (go test -race). Les outils SAST traditionnels sont généralement inefficaces car ils n'exécutent pas le code. La détection nécessite une exécution réelle avec plusieurs threads concurrents pour identifier les accès non synchronisés aux ressources partagées.

Implémentez des idempotency keys sur les endpoints POST critiques, utilisez des transactions atomiques combinant vérification et action, évitez le pattern check-then-act séparé, et utilisez des verrous distribués pour les architectures microservices. Le principe ACID des bases de données est essentiel. Privilégiez les requêtes SQL atomiques de type UPDATE avec WHERE plutôt que SELECT puis UPDATE séparés.

NIS2 impose la sécurisation du développement incluant la gestion des vulnérabilités pour 15 000 entités françaises. DORA exige des tests de résilience couvrant l'analyse de code source et les scans de vulnérabilités pour le secteur financier. Ces réglementations créent une obligation documentable de tests de sécurité applicative incluant la recherche de race conditions. Le Cyber Resilience Act renforce ces exigences avec l'interdiction de commercialiser des produits vulnérables à partir de 2027.

Protégez vos applications contre les race conditions

Nos experts en sécurité applicative peuvent auditer vos systèmes critiques et identifier les vulnérabilités de type race condition avant qu'elles ne soient exploitées. Découvrez comment Beareye peut vous aider à sécuriser votre infrastructure et respecter vos obligations NIS2 et DORA.