Souba SOUBA

La ligne de code qui coupa le téléphone

Le 15 janvier 1990, la moitié du réseau longue distance d'AT&T s'effondre pendant neuf heures. Pas une attaque : une instruction mal placée, dans le code même censé gérer les pannes.

1 min · 26 août 2026 · 3 min de lecture

La ligne de code qui coupa le téléphone

En bref

Un commutateur se réinitialise, annonce son retour, et fait planter ses voisins — qui à leur tour annoncent leur retour et propagent la panne. Comme les 114 commutateurs partageaient le même logiciel récent, la réaction en chaîne a paralysé le réseau. La cause : un défaut dans la logique de récupération, déclenché par deux messages arrivant à moins de dix millisecondes d'écart.

Un réseau conçu pour ne jamais tomber

À la fin des années 1980, le réseau longue distance d'AT&T reposait sur 114 commutateurs électroniques appelés 4ESS, répartis dans tout le pays et reliés par un réseau de signalisation, le CCS7. Chacun pouvait router des centaines de milliers d'appels par heure. Le système était pensé pour la fiabilité : si un commutateur tombait, ses voisins reprenaient le trafic. C'est cette redondance, paradoxalement, qui a permis à la panne de se propager.

L'étincelle

Le 15 janvier, en début d'après-midi, un commutateur de New York détecte une anomalie sur un équipement et lance sa procédure de récupération : il se réinitialise, ce qui prend quatre à six secondes, et prévient les autres qu'il n'accepte plus de trafic. Jusqu'ici, tout est normal — c'est exactement le comportement prévu. Le problème survient quand ce commutateur revient en service et annonce son retour aux autres.

Le défaut, précisément

Quand un commutateur voisin recevait ce message de retour, il commençait à mettre à jour son état. Si un second message arrivait moins de dix millisecondes après le premier, alors que le traitement du premier n'était pas terminé, le programme aurait dû mettre ce second message en attente. Au lieu de cela, à cause d'une instruction break mal placée dans une branche else, il sortait prématurément du traitement et écrasait des données critiques en mémoire. Le logiciel de correction détectait l'écrasement et déclenchait… une réinitialisation du commutateur.

c
switch (message) {
  case INCOMING_MESSAGE:
    if (sending_switch_out_of_service) {
      if (ring_write_buffer_empty)
        send_in_service_to_status_map();
      else
        break;   /* <-- sort du switch trop tot : ecrase les donnees */
    }
    process_incoming_message();
    break;
}
Reconstitution simplifiée : le break de la branche else fait quitter le switch avant le traitement du message.

La cascade

Le piège est là : en se réinitialisant, le commutateur touché renvoyait à son tour un message de retour à ses voisins. Si l'un d'eux recevait deux messages trop rapprochés, il subissait le même écrasement, se réinitialisait, et propageait le message à l'étape suivante. La panne se répandait donc par le mécanisme même censé la corriger. Comme les 114 commutateurs exécutaient le même logiciel — déployé mi-décembre, passé au travers de tous les tests et resté invisible pendant les fêtes — la réaction en chaîne s'est propagée à l'ensemble du réseau.

9heures

de panne, environ la moitié des appels longue distance bloqués

source : RISKS Digest / Telephony, 1990

La sortie de crise, contre-intuitive

On aurait pu croire qu'il fallait relancer les commutateurs. C'est l'inverse qui a fonctionné : les ingénieurs ont réduit la charge de messages sur le réseau CCS7. Avec moins de messages, les commutateurs cessaient de recevoir ces paires trop rapprochées, pouvaient enfin terminer leurs réinitialisations, et le réseau s'est stabilisé. Le correctif logiciel définitif a été déployé ensuite.

Ce qu'on imagine

  • Un piratage du réseau
  • Une panne matérielle massive

La réalité

  • Une instruction mal placée
  • Le code de récupération qui propage la panne

→ La redondance a diffusé le défaut au lieu de l'absorber : tous les nœuds étaient identiques.

À retenir

  • Le 15 janvier 1990, le réseau longue distance d'AT&T (114 commutateurs 4ESS) s'effondre pendant environ neuf heures.
  • Un commutateur qui se réinitialisait annonçait son retour ; deux messages à moins de 10 ms d'écart déclenchaient un écrasement mémoire chez le voisin.
  • La cause n'est pas un break manquant mais un break mal placé (branche else), qui faisait quitter le switch avant le traitement.
  • La panne se propageait par le code de récupération lui-même, et l'uniformité du logiciel l'a répandue aux 114 commutateurs.
  • La solution a été de réduire la charge de messages du réseau CCS7, pas de relancer les commutateurs.
  • Aucune attaque : un défaut logiciel passé au travers de tous les tests.

Sources · la preuve

  1. [01] Cause of AT&T network failure (RISKS Digest, Vol. 9 Issue 62) RISKS Digest / Telephony · tech-insider.org Source d'époque : déclaration de Larry Seese (AT&T), chronologie, mécanisme des messages trop rapprochés et sortie par réduction de charge.
  2. [02] All Circuits are Busy Now: The 1990 AT&T Long Distance Network Collapse California Polytechnic State University · users.csc.calpoly.edu Analyse académique avec le pseudo-code annoté : le break de la branche else et l'écrasement des données.
  3. [03] The Crash of the AT&T Network in 1990 Telephone World · telephoneworld.org Récit détaillé du 4ESS, du CCS7 et de la réaction en chaîne, reprenant les sources de 1990.
  4. [04] How a Simple Bug in C Code Crippled AT&T's Network Cloud Native Journey · cloudnativejourney.in Synthèse du mécanisme : boucle plantage/récupération, logiciel identique sur 114 commutateurs, ~60 000 clients.
at&t 19904esscascaderéseau téléphoniqueccs7

Aussi dans Shorts