Une triche Roblox, un consentement OAuth et une fuite Vercel à $2M
La brèche Vercel divulguée cette semaine a commencé par un employé de Context.ai téléchargeant des exploits Roblox sur son PC personnel, et s'est terminée par un attaquant lisant les variables d'environnement des clients de Vercel. Bromure Enterprise, livré cette semaine, est conçu précisément pour cette chaîne.
Un employé cherche des triches Roblox sur son ordinateur portable personnel. Deux mois plus tard, un attaquant met en vente la base de données clients de Vercel pour 2 millions de dollars sur BreachForums. Entre ces deux événements se trouve une chaîne de décisions ordinaires — une machine personnelle, un clic « Tout autoriser » sur un écran OAuth, un outil d'IA tiers avec un compte support@ — que toute équipe informatique d'entreprise devrait scruter cette semaine. Bromure Enterprise, que nous avons livré hier, a été conçu pour le milieu de cette chaîne.
Le 20 avril, Vercel a divulgué qu'un attaquant « hautement sophistiqué » avait pénétré ses systèmes internes via un outil d'IA tiers compromis nommé Context.ai, et accédé à des variables d'environnement non sensibles appartenant à un sous-ensemble de projets clients. Le PDG Guillermo Rauch a décrit les attaquants comme « significativement accélérés par l'IA » et a demandé aux clients de faire tourner toute information d'identification marquée comme non sensible. Un groupe se faisant appeler ShinyHunters tente désormais de vendre les données volées pour $2M sur BreachForums.
Le montant de la rançon fait la une. La chaîne d'attaque est la leçon. Hudson Rock a retracé l'infection jusqu'à février 2026, lorsqu'un employé de Context.ai a cherché des scripts Roblox d'« auto-farm » et des exécuteurs d'exploits de jeu, en a téléchargé un et s'est retrouvé avec Lumma Stealer — un infostealer de grande diffusion qui récolte les cookies de navigateur, les identifiants enregistrés et les jetons OAuth. CyberScoop et SpecterOps ont ensuite reconstitué le reste. Ce que Lumma a extrait n'était pas seulement un mot de passe Context.ai ; c'était l'ensemble complet des identifiants professionnels mis en cache dans le navigateur — sessions Google Workspace, clés Supabase, connexions Datadog, jetons Authkit.
À partir de là, l'attaquant a pivoté vers l'environnement AWS de Context.ai, lu les jetons OAuth que Context.ai détenait pour le compte de ses clients, et trouvé un employé de Vercel qui s'était autrefois inscrit à l'« AI Office Suite » de Context.ai avec son compte Google professionnel — et avait coché la case de portée « Tout autoriser ». Ce seul consentement, donné des mois plus tôt, était la seule primitive dont l'attaquant avait besoin. Il a généré une session au nom de cet employé, est entré dans le Google Workspace de Vercel, puis dans l'API produit interne de Vercel, où il a énuméré et déchiffré toutes les variables d'environnement qu'un client n'avait pas explicitement marquées comme sensibles.
Quatre aspects de cette chaîne méritent d'être soulignés, car chacun correspond à un contrôle spécifique que nous avons livré dans Bromure Enterprise cette semaine. Nous n'allons pas prétendre que la sortie aurait purement et simplement arrêté la brèche — elle ne l'aurait pas fait. Ce qu'elle aurait fait, c'est rompre la chaîne à quatre points distincts, chacun d'eux suffisant.
Le portable personnel était porteur
Le détail le plus sous-rapporté dans les comptes-rendus publics, c'est que la machine infectée était un appareil personnel. L'employé de Context.ai cherchait des exploits Roblox — ce qui n'est pas une tâche d'entreprise typique — et l'infection a atterri sur une machine qui faisait probablement à la fois du travail et de la navigation personnelle. Lumma Stealer se moque de savoir à quel profil un cookie appartient ; il lit tous les fichiers d'identifiants Chrome et Edge qu'il peut trouver, et expédie le tout.
C'est le schéma central de l'ère BYOD. L'hôte n'est pas managé. Les cookies professionnels sont dans le même pot à cookies que la triche Roblox que l'utilisateur vient de télécharger. Un agent EDR peut être installé ou non ; sur une machine personnelle, c'est très peu probable. Et même quand il l'est, Lumma est régulièrement observé en train de contourner les antivirus grand public.
La réponse de Bromure Enterprise, c'est une VM managée sur un hôte non managé. La DSI émet un profil de travail Bromure. L'employé installe Bromure sur son portable personnel, s'authentifie avec l'IdP de l'entreprise (Google Workspace, Okta, Entra, Authentik), et le profil de travail démarre comme sa propre machine virtuelle Linux. Cette VM a son propre noyau, son propre système de fichiers, son propre répertoire de profil Chromium. Les cookies professionnels, les mots de passe enregistrés professionnels et les jetons de rafraîchissement OAuth professionnels vivent à l'intérieur de cette VM. Un stealer qui s'exécute sur le macOS ou le Windows hôte — récolté via un téléchargement Roblox ou autre chose — ne peut pas les énumérer, les lire ou les exfiltrer. Il n'y a pas de profil Chrome partagé sur le disque qu'il puisse voler. Le pot à cookies est à l'intérieur d'une image de VM que l'OS hôte traite comme un fichier disque opaque.
Ce n'est pas une séparation théorique. C'est l'objet même de l'architecture. L'hôte peut être compromis toute la journée ; le navigateur professionnel est dans un autre ordinateur.
Le clic « Tout autoriser » était le vrai trophée
Regardez de près le chemin de l'attaquant. Le stealer a récolté des identifiants pour Google Workspace, Supabase, Datadog, Authkit. Ceux- ci étaient utiles pour pivoter à l'intérieur de Context.ai. Mais ce qui a atteint Vercel n'était pas un mot de passe volé — c'était un jeton OAuth. Plus précisément, le jeton généré lorsqu'un employé de Vercel s'était inscrit à l'AI Office Suite de Context.ai, avait cliqué sur l'écran de consentement Google et approuvé le bouquet de portées « Tout autoriser ». Ce consentement datait de plusieurs mois. Il n'avait jamais été réévalué. Il était resté là, valide, à attendre.
C'est l'angle mort OAuth que SpecterOps a mis en avant : les arêtes de confiance créées par des employés individuels qui cliquent sur des écrans de consentement opèrent entièrement en dehors du workflow de provisionnement de la DSI. Le chemin était ouvert avant que quiconque sache qu'il fallait le chercher.
Bromure Enterprise rétrécit cette surface dans deux directions à la fois.
La liste des tuiles SaaS autorisées est le goulot d'étranglement à l'entrée. Les admins publient l'ensemble des applis de travail sanctionnées sur la page d'accueil Travail de chaque utilisateur enrôlé. Ces tuiles sont ce sur quoi les employés cliquent pour s'inscrire à un nouvel outil. Context.ai n'était pas sur cette liste chez Vercel — il ne pouvait pas l'être ; c'était l'expérimentation d'un employé isolé. Sans tuile, il n'y a pas de flux d'inscription en un clic dans le profil de travail managé. L'employé peut, bien sûr, naviguer manuellement vers Context.ai ; c'est là qu'intervient le deuxième contrôle.
Le profil de travail est verrouillé par SSO et sa surface de consentement est visible. Les consentements OAuth initiés depuis un profil de travail Bromure managé passent par l'IdP de l'entreprise, sous la politique des admins. Un admin qui veut contrôler quelles applications tierces peuvent recevoir des portées Google Workspace — ce que tout admin Google Workspace devrait faire, et que presque personne ne fait — a son point d'application à l'intérieur du moteur de politique Bromure, et non éparpillé selon ce que chaque employé a cliqué il y a quelques semaines. La case « Tout autoriser » cesse d'être une surprise qui refait surface dix-huit mois plus tard lors d'une réponse à incident.
Rien de tout cela ne révoque rétroactivement un consentement OAuth émis avant que l'employé ne passe à Bromure. Mais à partir de maintenant, la catégorie « un employé a accordé de larges portées Google à une appli SaaS aléatoire dont je n'ai jamais entendu parler » est visible et contrôlable.
Ensuite, le journal d'audit est la seule façon de cadrer les dégâts
Le bulletin public de Vercel est honnête sur ce qu'a trouvé son enquête : l'attaquant a énuméré et déchiffré des variables d'environnement d'un sous-ensemble de projets clients. Le périmètre est encore en cours d'affinage. La raison pour laquelle il est encore en cours d'affinage, c'est que reconstruire « qu'a réellement lu le compte employé entre fin mars et mi-avril ? » à partir des journaux d'audit de Google Workspace plus des journaux de produit internes de Vercel est un projet de reconstruction forensique, pas une requête.
C'est l'écart que le journal d'audit par requête de Bromure Enterprise est conçu pour combler. Chaque requête HTTP effectuée depuis chaque session de travail, sur chaque appareil enrôlé, est journalisée centralement : utilisateur, URL, verbe, horodatage. « Qui a envoyé des identifiants à evil.com hier entre 8 h et 8 h 15 » était l'exemple que nous avons utilisé au lancement. Un meilleur exemple cette semaine : « Pour chaque point de terminaison de variable d'environnement sur notre API produit Vercel, qui l'a appelé, d'où, et quand, sur les quatre-vingt-dix derniers jours. » Une requête, pas un projet.
C'est la pièce EDR-rencontre-journal-d'audit-web. L'EDR répond à la même question pour les processus natifs : qu'a touché ce processus ? Bromure y répond pour la navigation : qu'a touché le navigateur de cet utilisateur ? Dans un incident comme celui de Vercel, où l'empreinte de l'attaquant est entièrement à l'intérieur d'une session de navigateur compromise, la réponse de l'EDR est vide et la réponse de Bromure est la chronologie de l'incident.
Les contrôles anti-exfiltration sont étroits ici — et c'est honnête
Nous voulons être précis sur les endroits où Bromure Enterprise aide
et ceux où il n'aide pas. Les contrôles de copier-coller, de
téléchargement de fichiers, de capture d'écran et de réseau local
sont réels, et ce sont de vrais gains pour l'exfiltration de données
en général — un onglet compromis dans un profil managé ne peut pas
glisser des variables d'environnement client vers scp sur l'hôte,
ni en faire une capture d'écran, ni les téléverser vers un pair sur
le LAN. Pour la chaîne Vercel spécifiquement, cependant, l'étape
d'exfiltration s'est entièrement déroulée par le réseau depuis le
backend même de Vercel vers un point de terminaison contrôlé par
l'attaquant. L'attaquant passait des appels API authentifiés, il ne
glissait pas des fichiers hors d'une fenêtre de navigateur. Les
contrôles coller/téléchargement/LAN n'auraient pas détecté cela.
Ce qui aurait aidé, et qui est listé dans le journal d'audit par requête ci-dessus, c'est le relevé des appels API eux-mêmes. Les contrôles anti-exfiltration sont la deuxième ligne ; la première ligne consiste à s'assurer que l'attaque ne parvient jamais à générer une session dans un navigateur managé.
Ce que Bromure Enterprise ne fait pas
Trois limites honnêtes, parce que l'histoire les mérite.
Il n'arrête pas les malwares sur un hôte personnel non managé. Une triche Roblox téléchargée hors de la VM Bromure reste une triche Roblox qui installe un infostealer sur l'OS personnel de l'utilisateur. Bromure ne nettoie pas cela. Ce qu'il fait, c'est s'assurer que le rendement du malware, pour l'attaquant, ne soit que les cookies personnels de l'utilisateur — pas ses cookies professionnels.
Il ne révoque pas rétroactivement les portées OAuth. Les consentements émis des mois avant que l'entreprise ne déploie Bromure Enterprise sont dans la liste d'accords de Google Workspace, pas dans la nôtre. Le bon mouvement opérationnel après le déploiement de Bromure reste un audit des accords d'applications tierces existants — nous vous aidons à prévenir le prochain, nous ne réécrivons pas le dernier.
Il ne remplace pas la discipline du cadrage des portées. L'employé de Vercel a cliqué sur « Tout autoriser ». Si un futur employé clique sur « Tout autoriser » sur une tuile sanctionnée, l'accord est toujours large. Bromure rend la surface visible et le chemin d'enrôlement plus étroit ; il ne se substitue pas à un admin qui décide quelles portées Google sont et ne sont pas autorisées pour une catégorie donnée d'application.
L'argument centré sur le navigateur n'est pas « aucune attaque ne peut avoir lieu ». C'est que le point de contrôle à plus fort levier, pour toute la catégorie d'attaques qui passent par la session de navigateur d'un utilisateur, c'est le navigateur lui-même — et il se trouve que le navigateur est la seule pièce de logiciel d'entreprise qui n'a jamais eu de véritable histoire de management sur les appareils non managés.
La forme du remède
Les brèches de la chaîne d'approvisionnement via des accords OAuth SaaS sont l'équivalent moderne des attaques par bourrage d'identifiants VPN d'il y a dix ans. Les deux sont les conséquences d'une arête de confiance qui était bon marché à créer, difficile à inventorier et impossible à révoquer en temps voulu lorsque le contrepartie se faisait compromettre. Le bulletin de Vercel est soigné et honnête ; la chaîne qu'il décrit n'est pas de la faute de Vercel. C'est ce qui se passe lorsque le même navigateur sur le même portable personnel détient la session professionnelle de l'employé, son historique de téléchargements Roblox et ses consentements « Tout autoriser » accumulés pour chaque outil d'IA avec lequel il a expérimenté le trimestre dernier.
La réponse structurelle consiste à donner à la session de travail son propre ordinateur. Pas un deuxième portable — une deuxième machine, matérialisée sur le même portable, avec son propre noyau, son propre système de fichiers, son propre pot à cookies, son propre moteur de politique, sa propre prise d'audit vers la journalisation centrale. C'est cela Bromure Enterprise. Si vous gérez la DSI dans une entreprise dont les employés accordent régulièrement des portées OAuth à des applis SaaS tierces — autrement dit, toutes les entreprises — le bulletin Vercel de cette semaine est la raison de le mettre sur la liste restreinte.
Sources primaires