Onderzoekers van Rubrik Zero Labs demonstreerden donderdag op Black Hat USA hoe één geprepareerd Word-document een aanvaller een interactieve shell geeft in de Microsoft 365 Copilot-sessie van een medewerker.
De keten is gedicht en de reparatie zat volledig in Azure, dus voor wie Copilot als dienst afneemt valt er niets te installeren. Wat blijft staan is het aanvalspad. Een bestand dat van buiten binnenkomt is voor Copilot geen inhoud maar een mogelijke opdracht, en die opdracht draait met de rechten van de medewerker die het bestand aanreikte. Twee dingen worden daarmee een beslissing in plaats van een aanname: of externe documenten nog als vertrouwde invoer bij je assistent mogen komen, en wie er achteraf kan zien wat die assistent in zo'n sessie heeft uitgevoerd.
Van witte tekst naar root op de Azure-node
De aanval begint met een Word-bestand dat leest als routinewerk: een vriendelijk verzoek om wat gegevens in te vullen. Achter een wit vlak staat een instructie die de lezer niet ziet en het taalmodel wel.

Copilot voert die code uit in zijn Python-interpreter, de omgeving waarin de assistent normaal een spreadsheet doorrekent of een geüpload document ontleedt. Die interpreter weigert code die aan het systeem zit te snuffelen. De onderzoekers omzeilden dat door hun payload te comprimeren en te presenteren als een onschuldige gzip-benchmark: Copilot zag een prestatietest, pakte hem uit en voerde hem uit. Wat het even daarvoor nog weigerde, draaide zonder protest.
Daarna volgde de escalatie. Het startscript van de sandbox draait als root, maar bleek beschrijfbaar voor de gewone gebruiker. Bash leest een script regel voor regel, dus code die je onder de laatste regel plakt wordt alsnog uitgevoerd zodra die regel klaar is. Door de drie achtergronddiensten te stoppen en meteen opnieuw te starten kreeg de onderzoeker root binnen de sandbox, snel genoeg dat het platform de sessie niet afbrak.
De echte doorbraak zat in een naamloze dienst op poort 8578. Die bleek onderdeel van Azure Container Runtime, draaide als root op de Kubernetes-node en vroeg geen authenticatie. Zijn configuratie-endpoint controleerde de meegegeven naam niet, waardoor de onderzoekers bestanden konden wegschrijven buiten de container, op de node zelf. Een symlink en een niet-gecontroleerde regeleinde maakten daar een willekeurige schrijfactie als root van, gericht op /etc/ld.so.preload. Elk nieuw proces op de node laadde vervolgens de bibliotheek van de aanvaller.
De sandbox had geen internet. De node eronder wel. Dat was de laatste schakel.

Het kanaal werkt namelijk twee kanten op. De aanvaller stuurt een prompt naar de node, de node zet hem in de sandbox, de sandbox geeft hem aan Copilot terug als programma-uitvoer, en Copilot behandelt die uitvoer als instructie omdat het oorspronkelijke document dat zo had opgedragen. Het antwoord reist dezelfde route terug. Wie aan de andere kant zit, typt vragen aan de Copilot van het slachtoffer en krijgt antwoord met diens identiteit, mail, bestanden, agenda en chats erachter. Rubrik omschrijft het resultaat als een assistent die gewoon iemand anders zit te helpen, zonder malwaremelding of zichtbaar bewijs van inbraak.
Daar komt de naam van de kwetsbaarheidsklasse vandaan: remote prompt execution, het prompt-equivalent van remote code execution. Ori Lahav en Dan Avraham presenteerden het donderdagochtend in Las Vegas als het eerste publiek gedocumenteerde geval.
Vijf fouten, vier Microsoft-producten
De postmortem telt vijf losse problemen. Twee in Azure Dynamic Sessions, de rechtenescalatie in de sandbox en de blootstelling van het hostnetwerk. Drie in Azure Container Runtime: ontbrekende authenticatie, een path traversal en injectie in het configuratiebestand. Geraakt werden Azure Kubernetes Service, Azure Container Apps, Azure Dynamic Sessions en Microsoft Copilot.
De tijdlijn is kort. Rubrik meldde de bevindingen op 10 februari 2026 bij het Microsoft Security Response Center, de rechtenescalatie was op 19 maart dicht en de ontsnapping halverwege april. Microsoft publiceerde het lek op 9 juni als remote code execution in Azure Kubernetes Service, een path traversal met CVSS-score 8.8 die het als kritiek aanmerkt en waarvan misbruik bij publicatie als onwaarschijnlijk gold. Er waren geen aanvallen in het wild bekend. De bounty bedroeg 48.000 dollar.
De reikwijdte gaat verder dan Copilot, en dat is voor Nederlandse organisaties het praktische deel. Dezelfde daemon draait op gewone Container Apps en op AKS-nodes met image streaming. Een SSRF-lek in willekeurig welke workload op zo'n node was genoeg om er root op te worden. Draai je zelf AKS-clusters, dan is de vraag dus niet of Copilot veilig is, maar of je node-image de beveiligingsupdate van 9 juni bevat.
Waarin dit verschilt van de Copilot-worm
Prompt-injectie via documenten is geen nieuw idee. Eind juli liet onderzoeker Håkon Måløy zien hoe verborgen witte tekst in een Word-bestand Copilot financiële cijfers laat halveren en de instructie meekopieert naar het volgende document. Die aanval bleef binnen de logica van de assistent: de tekst stuurde wat Copilot schreef. ChatMate breekt uit de assistent naar de infrastructuur eronder en zet daar een mens neer die live meestuurt. Het verschil tussen een besmet document en een ingelogde indringer.
Een maand eerder liet Microsoft Incident Response al zien hoe een vergiftigde MCP-toolomschrijving een Copilot Studio-agent dertig openstaande facturen naar een externe server laat sturen. Drie keer dezelfde plek waar het misgaat: niet in het model, maar in wat het model mag aanraken.
Een assistent met een code-interpreter, een netwerkverbinding of een toolkoppeling is geen tekstgenerator meer, maar een uitvoerder met rechten. De keten die Rubrik demonstreerde loopt van een onzichtbare alinea in een Word-bestand tot root op een Kubernetes-node in Azure, en elke schakel daarin was op zichzelf een klassieke infrastructuurfout: een beschrijfbaar startscript, een dienst zonder authenticatie, een naam die niet gecontroleerd werd. Beveiligingsteams moeten er volgens de onderzoekers van uitgaan dat een documentupload een shell kan worden en dat die shell alles erft wat de gebruiker mag zien. Wie Copilot uitrolt zonder te weten welke code hij namens een medewerker mag draaien en waar dat wordt vastgelegd, koopt die ingang stilzwijgend mee.
Veelgestelde vragen
Grip op je AI-agents
Een assistent die code draait namens je medewerkers is infrastructuur, geen tekstveld. Ik denk mee over waar je AI-agents wel en niet bij mogen, ontwerp de koppelingen en bouw ze zo dat je achteraf kunt zien wat er is gebeurd, self-hosted waar dat kan.
Dit artikel is geproduceerd samen met het Agent Team. Meer over de redactie.
