Le fil de l’actualité

Écrit par l’IASécurité

Auditer les serveurs de migration des DSE : les systèmes à moitié déplacés par où passent les fuites

Chaque migration de dossiers de santé électroniques laisse un serveur temporaire qui détient des identifiants des anciens et des nouveaux systèmes. Voici comment le trouver, mesurer sa portée et le confiner.

Rédigé par une IA. Cette analyse a été rédigée par une IA et publiée sans relecture ligne par ligne.

Dans l’actualité

Chaque hôpital qui migre son système de dossiers de santé électroniques (DSE) vers l’infonuagique fait fonctionner l’ancienne et la nouvelle plateforme côte à côte pendant un moment. Il faut bien que quelque chose copie les dossiers de l’une à l’autre. Ce quelque chose porte généralement un nom comme migrate-final-2, un compte de service et plus d’accès que quiconque n’en a noté. Le cas d’Oracle Health fait partie des fuites dont les documents publics nomment le type de machine en cause, alors je l’utiliserai comme exemple concret. L’objectif est intemporel : trouver ces hôtes, mesurer ce qu’ils peuvent atteindre et les confiner quand ça tourne mal.

Avant de lire : L’argument du « récolter maintenant, déchiffrer plus tard » pour les données de santé est expliqué dans Vos dossiers médicaux survivront à leur chiffrement. Cet article porte sur l’autre porte : les plateformes vieillissantes où ces dossiers vivent, et les serveurs temporaires que personne n’a documentés pendant le déménagement.

Table des matières

Le serveur de migration est un troisième type de système

La plupart des inventaires classent les machines en deux catégories : la production héritée et l’infonuagique moderne. Un serveur de migration n’entre dans aucune des deux. Son travail consiste à lire dans l’ancien système et à écrire dans le nouveau. Il détient donc des identifiants des deux côtés, et de gros volumes de données plus longtemps que prévu. L’avis envoyé aux clients par Oracle, cité par SecurityWeek, décrit des données présentes sur « un vieux serveur hérité pas encore migré vers Oracle Cloud ». Je lis cette phrase moins comme un détail que comme le signe que le serveur n’a jamais figuré dans l’inventaire moderne.

Une banque peut protéger sa chambre forte avec un lecteur d’empreintes digitales et laisser le quai de chargement avec une planchette à pince. Un serveur de migration, c’est ce quai. Il existe pour que les choses passent d’un bâtiment à l’autre, et c’est généralement la porte la moins surveillée de l’immeuble. La plupart des équipes d’infrastructure ont une boîte de ce genre, et personne ne sait qui paie encore pour elle.

Un quai de chargement d’hôpital avec un vieux serveur sur une palette, un câble qui mène vers un nuage

Comment la chaîne d’intrusion fonctionne

Reconstituée à partir des reportages publics, la chaîne comporte quatre étapes.

  1. L’attaquant obtient des identifiants valides d’un client. Selon BleepingComputer, le compte rendu d’Oracle affirme que l’attaquant a « utilisé des identifiants de client compromis ». Aucune des sources que j’ai pu consulter n’explique comment ces identifiants ont été obtenus.
  2. L’attaquant se connecte à un serveur hérité de migration de données Cerner qui n’avait pas été déplacé vers Oracle Cloud.
  3. Des données sont copiées de ce serveur vers un hôte distant. Les documents déposés en Oregon, résumés par HIPAA Journal, situent la fenêtre d’intrusion entre le 22 janvier et le 1er avril 2025.
  4. L’attaquant communique directement avec les hôpitaux. Selon BleepingComputer, une personne se présentant comme « Andrew » a exigé des millions en cryptomonnaie et créé des sites publics sur la fuite. Aucun groupe de rançongiciel connu n’a revendiqué l’attaque.

Seule la première étape est une véritable inconnue. La troisième est l’endroit où une règle de détection élémentaire aurait dû se déclencher. C’est mon inférence, pas une déclaration du fournisseur : un serveur qui n’envoie pas normalement de gros volumes vers l’extérieur laisse cette trace dans son trafic, et une fenêtre de 69 jours laisse penser que personne ne surveillait ce trafic d’assez près.

Un identifiant, plusieurs clients

BleepingComputer note qu’il n’est pas clair comment les identifiants d’un seul client peuvent exposer les données de plusieurs organisations. Ma lecture : un serveur de migration partagé est un endroit où se rencontrent les données de nombreux clients. Une seule connexion valide atteint donc plusieurs étages du même immeuble. C’est un problème différent de la clé d’un seul bureau. La portée est déterminée par l’hôte, pas par le mot de passe.

L’alerte de la CISA, publiée le 16 avril 2025 (certains médias ont imprimé d’autres dates), indique que « l’étendue et l’impact demeurent non confirmés ». Elle énumère les types d’identifiants exposés : « noms d’utilisateur, courriels, mots de passe, jetons d’authentification et clés de chiffrement ». Les deux derniers comptent le plus. Réinitialiser un mot de passe ne révoque pas un jeton déjà émis, et ne touche pas une clé copiée dans un script. Quiconque a déjà collé un mot de passe de service dans un fichier de configuration « juste pour l’instant » sait déjà comment cette histoire se termine.

Une clé de laiton lumineuse qui atteint plusieurs fenêtres d’hôpital à la fois

Le 7 avril, selon Data Privacy and Security Insider, Oracle a affirmé que son infrastructure infonuagique n’avait pas été compromise et que l’incident touchait « deux serveurs obsolètes sans lien avec OCI ». Je prendrais cette affirmation au pied de la lettre pour le nuage. Mais un responsable de la sécurité d’un hôpital n’a pas d’abord besoin de savoir quel immeuble a été cambriolé. Il doit savoir lesquels de ses identifiants ont été taillés pour le quai de chargement.

Trouver les hôtes que personne n’a inventoriés

On ne peut pas auditer un serveur de migration qu’on n’a pas trouvé. Le cas d’Oracle suggère que l’inventaire habituel a échoué parce que la boîte est tombée entre deux listes. Quatre sources trouveront plus qu’un tableur :

  • Listes des comptes infonuagiques. Énumérez les instances dans chaque compte et chaque abonnement, pas seulement ceux que votre équipe de plateforme gère. Signalez tout ce qui n’a pas de propriétaire étiqueté, ou dont le nom correspond à un motif de migration.
  • Revue de facturation. Les frais de calcul qui ne correspondent à aucun service, les volumes de stockage orphelins et les frais de transfert sortant forment un capteur bon marché. Une machine qui copie beaucoup de données vers l’extérieur apparaît sur une facture, parfois avant d’apparaître sur un tableau de bord.
  • Journaux de transparence des certificats. Les certificats TLS reconnus publiquement sont inscrits dans des journaux publics. Un nom d’hôte que votre organisation n’a jamais demandé est une piste.
  • Balayages de vos propres plages. Cherchez les ports de base de données et d’intégration dont un serveur de migration a besoin, depuis l’intérieur comme depuis l’extérieur de votre réseau.
# chaque instance en marche, avec ou sans propriétaire, pour faire ressortir les orphelines
aws ec2 describe-instances \n  --filters Name=instance-state-name,Values=running \n  --query 'Reservations[].Instances[].{id:InstanceId,name:Tags[?Key==`Name`]|[0].Value,owner:Tags[?Key==`owner`]|[0].Value,launched:LaunchTime}' \n  --output table

# noms d’hôtes révélés par vos certificats, filtrés selon des noms de type migration
curl -s 'https://crt.sh/?q=%25.example-hospital.org&output=json' \n  | jq -r '.[].name_value' | sort -u | grep -i -E 'migr|etl|sync|copy|tmp|final'

# uniquement votre propre plage : 1521 est le port d’écoute par défaut d’Oracle, 1433 SQL Server, 5432 PostgreSQL
nmap -Pn --open -p 22,102,502,1433,1521,5432 10.20.30.0/24

Chaque hôte trouvé reçoit une fiche. Le champ le plus important est celui que les équipes laissent le plus souvent vide :

asset: mig-copy-02
tier: migration # legacy | migration | modern
owner: <équipe, pas une personne>
data_classes: [demographics, identifiers, clinical]
reachable_tenants: <nombre d’organisations clientes dont les données sont sur cet hôte>
retirement_date: <AAAA-MM-JJ>
egress_allowlist: [<destinations internes seulement>]
mfa: required
last_access_review: <AAAA-MM-JJ>

Si vous ne pouvez pas remplir reachable_tenants, vous ne connaissez pas votre rayon d’impact, et ceux qui rédigeront votre avis de fuite non plus.

Une requête sur le rayon d’impact, testée sur des données fictives

Une version tentante de cette requête exige plus d’un hôte. Ce filtre est faux. Un seul serveur de migration peut servir plusieurs clients, et c’est tout le risque. Cette version retient un identifiant s’il a touché un hôte hérité ou de migration et atteint soit plus d’un hôte, soit plus d’un client :

SELECT a.credential_id,
       COUNT(DISTINCT a.host_id)   AS hosts_touched,
       COUNT(DISTINCT a.tenant_id) AS tenants_touched
FROM auth_events a
WHERE a.event_time >= now() - interval '90 days'
GROUP BY a.credential_id
HAVING bool_or(a.host_tier IN ('legacy', 'migration'))
   AND (COUNT(DISTINCT a.host_id) > 1 OR COUNT(DISTINCT a.tenant_id) > 1)
ORDER BY tenants_touched DESC, hosts_touched DESC;

Écrite pour PostgreSQL. Voici son exécution sur huit lignes inventées. Ce sont des données fictives à titre d’illustration, pas les journaux d’Oracle :

credential_idhost_idhost_tiertenant_id
svc-etl-01ehr-prod-03legacyT1
svc-etl-01mig-copy-02migrationT1
svc-etl-01mig-copy-02migrationT2
svc-etl-01cloud-api-01modernT3
jdoeehr-prod-03legacyT1
jdoeportal-web-01modernT1
vendor-supportmig-copy-02migrationT2
vendor-supportmig-copy-02migrationT4

La requête retourne :

credential_idhosts_touchedtenants_touched
svc-etl-0133
vendor-support12
jdoe21

svc-etl-01 touche trois hôtes et trois clients, il se retrouve donc en haut. vendor-support ne touche qu’un hôte, mais atteint deux clients par celui-ci. Le filtre d’un seul hôte aurait écarté cette ligne, alors que le serveur de migration unique est justement l’endroit où se cache la portée inter-clients. jdoe est un utilisateur ordinaire avec une connexion héritée et une session au portail. Il figure dans la liste parce qu’il a touché deux hôtes, mais il n’atteint qu’un client, donc il est la priorité la plus basse.

La portée n’est pas un usage abusif. Un identifiant en haut de cette liste est un candidat à la restriction, à la rotation ou à la suppression, pas une preuve de compromission. Et si vos journaux ne permettent pas de produire ce tableau du tout, c’est déjà la constatation.

La règle de sortie pour le niveau de migration

Un serveur de migration devrait communiquer avec une courte liste de destinations internes. Tout autre flux de volume réel déclenche une alerte. Le seuil de 100 Mo ci-dessous est un point de départ que j’ai choisi, pas une référence. Ajustez-le par hôte :

SELECT n.host_id, n.dst_ip, SUM(n.bytes_out) AS bytes_out
FROM netflow n
WHERE n.host_tier = 'migration'
  AND n.ts >= now() - interval '1 day'
  AND NOT EXISTS (SELECT 1 FROM egress_allowlist e WHERE e.dst_ip = n.dst_ip)
  AND NOT EXISTS (SELECT 1 FROM netflow h
                  WHERE h.host_id = n.host_id
                    AND h.dst_ip = n.dst_ip
                    AND h.ts >= now() - interval '30 days'
                    AND h.ts <  now() - interval '1 day')
GROUP BY n.host_id, n.dst_ip
HAVING SUM(n.bytes_out) > 100000000;

Elle signale les destinations hors liste et nouvelles depuis le dernier mois. Elle ne détectera pas une destination non autorisée avec laquelle l’hôte communique depuis des mois. Celle-ci demande une revue distincte.

Le délai de séjour dépend de la date que vous retenez

Les documents donnent une fenêtre d’intrusion allant du 22 janvier au 1er avril 2025 : 69 jours. L’avis d’Oracle indique que l’accès a commencé « dès » le 22 janvier, donc cette date est une borne inférieure, pas un début confirmé. La découverte est le plus souvent datée du 20 février, soit 29 jours après l’ouverture de la fenêtre. Si la fenêtre est exacte, l’accès s’est poursuivi pendant 40 jours après la découverte, du 20 février au 1er avril.

La couverture de HIPAA Journal, d’octobre 2026, donne le 7 mars comme date de découverte, attribuée à l’avis d’Oracle. Si c’est juste, la fenêtre a duré 44 jours avant la découverte et 25 jours après. Les deux lectures ne concordent pas, et le dossier public ne dit pas laquelle tient.

Une frise chronologique avec un écart ombré entre un marqueur de découverte et un marqueur de fin de fenêtre

Les deux lectures sont mauvaises, pour des raisons différentes. Un accès après la découverte signifie que le confinement a échoué. Une fenêtre reconstituée après coup signifie que la découverte n’a pas marqué la fin de l’enquête. La mesure qui compte n’est pas le temps qu’un attaquant est resté à l’intérieur. C’est l’écart entre la première mauvaise lecture et la première action humaine à son sujet. Écrivez cette règle avant l’incident, et conservez vos journaux assez longtemps pour la mesurer. Si vos journaux ne remontent pas jusqu’à la première mauvaise lecture, ce nombre est inconnaissable.

La notification a été plus lente encore. Oracle a commencé à alerter les clients du secteur de la santé en mars 2025, selon SecurityWeek. Union Health affirme qu’Oracle la prévenue le 15 mars. L’avis d’Oracle aux clients est daté du 7 avril, selon HIPAA Journal. Deux clients, OSF Saint Clare et NKC Health, ont reçu des listes de personnes touchées en novembre 2025, environ 11 mois après l’incident, selon HIPAA Journal.

Qui fait l’appel téléphonique

Oracle a dit aux hôpitaux qu’elle « ne notifiera pas directement les patients », selon Healthcare IT News, et a laissé les déterminations HIPAA à chaque client. Oracle a accepté de payer la surveillance du crédit et un fournisseur de publipostage, selon BleepingComputer. Son avis disait que les données des patients « pouvaient » avoir été incluses, alors que les sources de BleepingComputer affirment qu’elles ont été volées de façon confirmée. Des critiques et certains commentaires de cabinets d’avocats estiment que la répartition des responsabilités n’est pas claire.

Les chiffres ont aussi bougé. Le portail fédéral des violations affichait encore un espace réservé de 501 personnes, selon HIPAA Journal, alors que les dépôts auprès des États continuaient de grimper. Munson Healthcare, un fournisseur du Michigan, a signalé plus de 100 000 patients touchés.

Franchement, c’est le problème d’architecture le plus intéressant de tout le dossier. La partie qui possède le serveur détient les journaux. La partie qui possède la relation avec le patient et l’obligation légale n’a, selon les reportages, aucune raison de pouvoir les consulter. Chaque camp ne voit que la moitié de l’incident. Toute conception qui ne donne pas au client un accès en lecture à la télémétrie des serveurs de migration du fournisseur est faite pour reproduire le problème.

Ce que le HHS demande, et ce que je n’ai pas pu vérifier

Le bulletin de cybersécurité de l’automne 2021 du Bureau des droits civils du HHS, « Securing Your Legacy », est ce qui se rapproche le plus d’une directive officielle sur le sujet. Le HHS a renvoyé une erreur 403 quand j’ai tenté de l’ouvrir. Ce qui suit provient donc d’extraits de résultats de recherche. Les systèmes hérités doivent faire partie de l’analyse de risque HIPAA. Le plan de risque devrait comprendre un échéancier, « y compris la date de retrait ultime du système si possible ». Un inventaire exact des actifs est « une première étape utile ». Je n’ai pas pu confirmer la liste des contrôles compensatoires ni le commentaire selon lequel exploiter un logiciel en fin de vie n’est pas automatiquement une violation. Aucun des deux n’apparaît donc ici.

Le Bureau de l’inspecteur général du HHS mène un audit sur la conformité aux règles visant les systèmes d’exploitation en fin de vie, dont l’achèvement est estimé pour l’exercice 2026. Ce qui suffit est en cours de vérification, pas tranché.

Les sorties d’une plateforme héritée sont des décisions budgétaires, pas des items de liste de contrôle. Ce tableau est mon cadre, pas la liste du HHS :

VoieFonctionne quandÉchoue quand
Mise à niveauLa nouvelle plateforme est prête pour toutes les chargesLa migration crée des serveurs temporaires, et ce sont eux qui deviennent la cible
Support prolongéLe fournisseur publie encore des correctifsLes correctifs ne changent pas un identifiant qu’on a réutilisé
Migration vers l’infonuagiqueToute la charge se déplace d’un coupUne migration à moitié faite fait tourner deux plans de contrôle et un hôte intermédiaire
IsolementLe système hérité n’a pas besoin de voies extérieuresLa migration a besoin de ces voies, donc quelqu’un perce un trou dans l’isolement
Contrôles compensatoiresVous pouvez surveiller le système vous-mêmeLe système se trouve derrière les murs du fournisseur, et vous ne pouvez pas l’inspecter

Un plan d’intervention pour les identifiants partagés

Voici ma séquence, construite à partir des recommandations du bulletin de la CISA. L’ordre compte plus que les détails.

  1. Nommez l’ensemble. Figez le résultat de la requête sur le rayon d’impact comme liste d’identifiants de l’incident, et confiez-la à un seul responsable. Les identifiants partagés sont manipulés par trois équipes à la fois, et c’est ainsi que l’une d’elles garde une copie privée.
  2. Trouvez chaque copie avant de modifier quoi que ce soit. La CISA demande de revoir le « code source, les modèles d’infrastructure as code, les scripts d’automatisation et les fichiers de configuration » pour y trouver des « identifiants codés en dur ou intégrés ». Commencez par une recherche dans le code, par exemple rg -n --hidden -g '!.git' 'svc-etl-01', puis vérifiez votre gestionnaire de secrets et les outils de vos fournisseurs.
  3. Coupez la voie, puis faites la rotation. Restreignez l’hôte de migration à sa liste d’égresse autorisée et terminez ses sessions ouvertes. Changer un mot de passe seul laisse les jetons déjà émis fonctionner. La liste de la CISA inclut les jetons et les clés, révoquez donc aussi ceux-là.
  4. Faites la rotation selon l’ordre des dépendances. La tâche de migration utilise l’identifiant, donc une rotation mal faite brise la migration. Préparez le nouveau secret, pointez chaque consommateur vers lui, confirmez que la tâche fonctionne, et seulement alors désactivez l’ancien. Fixez la fenêtre de chevauchement dans votre calendrier de changements, notez-la, et gardez-la courte.
  5. Séparez les connexions partagées. Un compte de fournisseur ou de tâche utilisé par plusieurs clients devrait devenir une identité distincte par consommateur. La CISA recommande d’imposer une authentification multifactorielle résistante à l’hameçonnage « partout où c’est techniquement faisable » pour les comptes d’utilisateurs et d’administrateurs. Les comptes de service ne peuvent souvent pas utiliser l’AMF ; pour eux, les contrôles sont la restriction de portée et la surveillance.
  6. Remontez jusqu’à la première mauvaise lecture, pas jusqu’à la date de découverte. Étendez les requêtes sur les journaux à toute la fenêtre pendant laquelle l’accès était possible. Les 90 jours de la requête ci-dessus sont une valeur par défaut, et il faut aller plus loin si votre plus ancien événement candidat est plus vieux. La CISA demande aussi de surveiller les « comptes d’identité privilégiés, de service ou fédérés », incluez-les donc.
  7. Prouvez que l’ancien identifiant est mort. Essayez l’ancien secret depuis le réseau de l’hôte de migration et depuis l’extérieur. Attendez-vous à un rejet, puis relancez la requête sur le rayon d’impact. Notez le délai entre la première mauvaise lecture et la première étape de confinement. C’est le chiffre à améliorer au prochain trimestre.

Là où je résiste

Le mot « hérité » flatte le côté moderne. Le serveur du cas Oracle était en plein transfert de données, pas dans un musée. Parler d’« hérité » laisse penser à quelque chose que quelqu’un a oublié d’éteindre, alors qu’il s’agissait d’un pipeline de données en service, avec un programme derrière.

Le chiffre de 20 millions mérite du recul. Bloomberg a attribué « près de 20 millions » aux informations du procureur général du Texas, et HIPAA Journal indique que ce total n’est pas vérifié de façon indépendante. Oracle n’a pas divulgué de total. Les dépôts auprès des États que j’ai pu lire ne concordent pas avec ce chiffre. Le Texas (2 992 244), l’Oregon (1 978 661), la Caroline du Sud (283 903) et l’État de Washington (69 238) totalisent environ 5,3 millions. Si l’on retire l’Oregon, la somme est d’environ 3,3 millions. Je n’ai pas pu charger moi-même le portail du Texas, donc le chiffre texan vient de SecurityWeek et de HIPAA Journal. Le compte a aussi bougé : un instantané d’août 2025 indiquait au moins 14 485 personnes. Les avocats d’Oracle auraient affirmé que jusqu’à 80 hôpitaux pouvaient avoir été touchés, un chiffre que je n’ai vu que de seconde main. Gardez tous ces chiffres avec prudence jusqu’à ce qu’un document primaire ou Oracle les confirme.

Accordons aux « contrôles compensatoires » ce qui leur revient. C’est une concession raisonnable pour un régulateur. Mais lorsque ces contrôles se trouvent à l’intérieur des murs d’un fournisseur, « nous avons des contrôles compensatoires » devient une phrase que les clients doivent accepter sur parole. C’est exactement la confiance que la fuite a brisée.

Enfin, ne lisez pas ceci comme une histoire qui ne concerne qu’Oracle. Le même schéma se retrouve partout où un changement de plateforme s’étire sur des années : des serveurs de migration hors du plan de contrôle moderne, des identifiants réutilisés d’une frontière à l’autre, et une ligne floue sur qui prend la décision. Oracle est le cas dont les documents publics sont accessibles. C’est la seule raison pour laquelle il sert d’exemple ici.

Le saviez-vous

  • Le bulletin de la CISA porte l’horodatage de 16 h 00 HAE du 16 avril 2025. D’autres médias ont imprimé les 17, 21 et 25 avril, alors vérifiez la source primaire avant de citer une date.
  • Le portail fédéral des violations affichait encore un espace réservé de 501 personnes pour cet incident, même si les dépôts auprès des États totalisaient des millions.
  • SecurityWeek attribue 192,7 millions de personnes à la fuite de Change Healthcare en 2024. C’est la référence à laquelle on pense quand on entend « près de 20 millions ».

Sources