De 'deathray' is een kwetsbaarheid op MacOS waarbij een WebGPU-shader een oneindige lus creëert. Dit blokkeert de GPU-resources, waardoor de WindowServer niet meer reageert en de gebruikersinterface onbruikbaar wordt. Uiteindelijk triggert een systeem-Watchdog een kernel panic, wat resulteert in een geforceerde herstart van de computer.
Belangrijke details:
- Compatibiliteit: Het probleem is cross-browser (Chrome, Firefox, Safari) op M-serie Macs, maar niet reproduceerbaar op andere besturingssystemen.
- Technische oorzaak: De zwakke inputvalidatie in WebGPU en de specifieke architectuur van de M-serie chips (met name de ASC-coprocessor) maken effectieve GPU-pre-emption lastig.
- Apple's reactie: Hoewel Apple het probleem kan reproduceren, beschouwen zij een systeemcrash momenteel niet als een beveiligingsprobleem, waardoor de prioriteit voor een fix laag is.
- Precedent: Het doet denken aan de ShadyShader uit 2023, die gebruikmaakte van WebGL.
The Deathray: Een eenvoudige manier voor onbetrouwbare sites om een Mac te laten vastlopen
Samenvatting
Een WebGPU-shader op een onbetrouwbare site kan de graphics van een Mac laten vastlopen, waardoor de desktop-UI onbruikbaar wordt tot er een geforceerde herstart plaatsvindt. Het slachtoffer hoeft alleen op een link te klikken. Dit probleem is cross-browser reproduceerbaar op MacOS, maar niet op andere besturingssystemen.
Reikwijdte
De 'deathray' is gereproduceerd op MacOS in Chrome, Firefox en Safari. Op andere besturingssystemen is dit niet reproduceerbaar. Tot nu toe is er alleen getest op M-serie Macbooks die Tahoe draaien; het is nog onbekend of andere Macs ook worden beïnvloed.
Hoe werkt het?
De deathray maakt gebruik van een relatief nieuwe webtechnologie: WebGPU. WebGPU biedt ingebouwde browser-API's waarmee sites shaders kunnen indienen om op de GPU van het apparaat te draaien. Het is bedoeld als vervanger voor WebGL en wordt ondersteund door alle grote browsers op de meeste besturingssystemen.
De volledige deathray past in één klein bestand. Het belangrijkste onderdeel bestaat uit de WebGPU-shaders.
Compute Shader
@group(0) @binding(0) var<storage, read_write> data : array<vec4f>;
@compute @workgroup_size(1) fn compute() {
// geen i++, loop draait oneindig door
for(var i = 0u; i < 1;) {
data[i+1] = data[i];
}
}
Render Shaders
@group(0) @binding(0) var<storage, read> data : array<vec4f>;
@vertex fn vert(@builtin(vertex_index) vertexIdx : u32)
-> @builtin(position) vec4f {
// probeert te lezen uit dezelfde buffer waar de compute shader naar schrijft
let datum = data[vertexIdx];
return datum;
}
@fragment fn frag(@builtin(position) pos : vec4f)
-> @location(0) vec4f {
return pos;
}
In de compute-shader kopieert een oneindige busy loop telkens dezelfde vector in een buffer. De vertex-shader is afhankelijk van dezelfde databuffer waar de compute-shader mee bezig is. Omdat de compute-shader in een oneindige lus zit, kan de vertex-shader niet verdergaan.
Dit effect sijpelt door naar andere processen die de GPU willen gebruiken, in het bijzonder de WindowServer. Als gevolg van deze WebGPU-opstopping wordt ook de WindowServer niet meer responsief. Dit manifesteert zich niet altijd op dezelfde manier: soms kan de muis nog bewogen worden, soms niet. Soms verschijnt het 'beachball'-icoon, en soms verschijnt er magenta-kleurige ruis op delen van het scherm.
Opmerkelijk is dat de rest van de computer op dat moment gewoon blijft werken; het is bijvoorbeeld mogelijk om zonder problemen via SSH in te loggen. Er is echter een Watchdog die de WindowServer controleert. Wanneer deze te lang niet reageert, triggert de Watchdog een kernel panic en start de computer opnieuw op. Wie ongeduldig is, kan de aan/uit-knop ingedrukt houden om de computer handmatig uit en aan te zetten zonder op de Watchdog te wachten.
Precedent
Dit is niet de eerste keer dat Apple met dit probleem wordt geconfronteerd. In 2023 ontwikkelde Ron Masas van Imperva een vergelijkbare kwaadaardige shader genaamd ShadyShader, die gebruikmaakte van WebGL. ShadyShader gebruikte ook een weglopende lus om de GPU te monopoliseren door enorme geneste lussen te creëren die technisch gezien niet oneindig waren.
Apple reageerde door CVE-2023-40441 uit te brengen met een CVSS-score van 6.5 (medium). Om het probleem te verhelpen, voegde Apple verbeterde inputvalidatie toe om weglopende lussen beter te detecteren.
Die inputvalidatie lijkt zwakker te zijn in WebGPU; de deathray bevat een triviaal identificeerbare oneindige lus. Uiteindelijk is het detecteren van oneindige lussen echter een verloren strijd vanwege het halting problem (stopprobleem). Er is betere pre-emption nodig voor niet-responsieve shaders, zeker als deze onbetrouwbare code uitvoeren. Alle andere geteste besturingssystemen lossen dit correct op.
Het is mogelijk dat de uitdaging voor Apple gedeeltelijk ligt in de architectuur van de M-serie chips. De OS-kernel kan de GPU niet direct onderbreken (pre-empt). In plaats daarvan wordt de GPU-afhandeling gedaan door een coprocessor genaamd de ASC, waarmee de OS-kernel communiceert. Alle logica voor GPU-pre-emption bevindt zich in de firmware van de ASC. Asahi Lina heeft een gedetailleerde analyse geschreven over de M-serie GPU's waarin deze architectuur verder wordt verkend.
Hoe is de deathray gevonden?
De ontdekking gebeurde op de ouderwetse manier: per ongeluk. Tijdens het leren van WebGPU bij het Recurse Center werd er per ongeluk een oneindige lus gemaakt. De verbazing was groot toen dit de computer liet vastlopen, waarna de vraag ontstond: "Gebeurt dit elke keer?". Dat bleek inderdaad het geval te zijn.
Melding en respons
Het probleem is op 27 juli 2026 gemeld bij Apple Security. Apple kon het probleem snel reproduceren en gaf aan dit te willen oplossen. Er werd een tijdlijn voor de fix gegeven die vertrouwelijk was.
Op 26 augustus 2026 veranderde Apple echter van koers. Ze gaven aan dat ze "geen veiligheidsimplicaties zagen in het rapport" en dat het rapport "niet leidde tot een wijziging in de producten van Apple." De melding zou worden doorgestuurd naar een ander team voor "potentiële overwegingen voor verbetering." Dit suggereert dat de prioriteit voor een oplossing erg laag is. Dit is opvallend, gezien de manier waarop ShadyShader werd aangemerkt als een probleem met een medium severity van 6.5.
Hier ontstaat een interessante discussie over wat precies een beveiligingsprobleem definieert. Veel beveiligingsonderzoekers zijn het eens met Apple. Zoals Apple stelt: "het resultaat is een crash, hang of herstelbaar dataverlies, wat wij niet beschouwen als een beveiligingsprobleem." Technisch gezien is dit standpunt verdedigbaar.
De meeste mensen die geen security-expert zijn, zijn echter verrast door deze karakterisering en het feit dat Apple het oplossen niet prioriteert. Er is een sterk vertrouwen in de browser; het geloof dat het simpelweg klikken op een link geen negatieve impact heeft op de rest van de computer (behalve wellicht het vertragen van het systeem tot het tabblad wordt gesloten). Iets als de deathray schendt dat vertrouwen op een zeer zichtbare manier, en veel gebruikers zien dat juist als een beveiligingsprobleem.
Toekomstverwachting
De deathray is zeker niet zo ernstig als een sandbox escape, RCE of een datalek. Maar gezien de extreem lage drempel (iemand enkel op een link laten klikken), kan het potentieel zeer irritant zijn. Als het kwaadaardig wordt gebruikt, is het een gemenere versie van een Rickroll. De hoop is dat Apple dit snel oplost (en dat de oplossing niet simpelweg het standaard uitschakelen van WebGPU is).
Totdat Apple een oplossing biedt, is de hoop dat mensen manieren vinden om er op een niet-kwaadaardige manier mee te experimenteren. Denk aan 'deathray-videogames' waarbij de Mac vastloopt als je verliest (mits de gebruiker hier vooraf expliciet mee instemt). Een mildere versie van "als je doodgaat in het spel, ga je dood in het echt".
Auberon López (they/them) alope107 auberonedu
The Deathray: Een eenvoudige manier voor onbetrouwbare sites om een Mac te laten vastlopen
Samenvatting
Een WebGPU-shader op een onbetrouwbare site kan de graphics van een Mac laten vastlopen, waardoor de desktop-UI onbruikbaar wordt tot er een geforceerde herstart plaatsvindt. Het slachtoffer hoeft alleen op een link te klikken. Dit probleem is cross-browser reproduceerbaar op MacOS, maar niet op andere besturingssystemen.
Reikwijdte
De 'deathray' is gereproduceerd op MacOS in Chrome, Firefox en Safari. Op andere besturingssystemen is dit niet reproduceerbaar. Tot nu toe is er alleen getest op M-serie Macbooks die Tahoe draaien; het is nog onbekend of andere Macs ook worden beïnvloed.
Hoe werkt het?
De deathray maakt gebruik van een relatief nieuwe webtechnologie: WebGPU. WebGPU biedt ingebouwde browser-API's waarmee sites shaders kunnen indienen om op de GPU van het apparaat te draaien. Het is bedoeld als vervanger voor WebGL en wordt ondersteund door alle grote browsers op de meeste besturingssystemen.
De volledige deathray past in één klein bestand. Het belangrijkste onderdeel bestaat uit de WebGPU-shaders.
Compute Shader
@group(0) @binding(0) var<storage, read_write> data : array<vec4f>;
@compute @workgroup_size(1) fn compute() {
// geen i++, loop draait oneindig door
for(var i = 0u; i < 1;) {
data[i+1] = data[i];
}
}
Render Shaders
@group(0) @binding(0) var<storage, read> data : array<vec4f>;
@vertex fn vert(@builtin(vertex_index) vertexIdx : u32)
-> @builtin(position) vec4f {
// probeert te lezen uit dezelfde buffer waar de compute shader naar schrijft
let datum = data[vertexIdx];
return datum;
}
@fragment fn frag(@builtin(position) pos : vec4f)
-> @location(0) vec4f {
return pos;
}
In de compute-shader kopieert een oneindige busy loop telkens dezelfde vector in een buffer. De vertex-shader is afhankelijk van dezelfde databuffer waar de compute-shader mee bezig is. Omdat de compute-shader in een oneindige lus zit, kan de vertex-shader niet verdergaan.
Dit effect sijpelt door naar andere processen die de GPU willen gebruiken, in het bijzonder de WindowServer. Als gevolg van deze WebGPU-opstopping wordt ook de WindowServer niet meer responsief. Dit manifesteert zich niet altijd op dezelfde manier: soms kan de muis nog bewogen worden, soms niet. Soms verschijnt het 'beachball'-icoon, en soms verschijnt er magenta-kleurige ruis op delen van het scherm.
Opmerkelijk is dat de rest van de computer op dat moment gewoon blijft werken; het is bijvoorbeeld mogelijk om zonder problemen via SSH in te loggen. Er is echter een Watchdog die de WindowServer controleert. Wanneer deze te lang niet reageert, triggert de Watchdog een kernel panic en start de computer opnieuw op. Wie ongeduldig is, kan de aan/uit-knop ingedrukt houden om de computer handmatig uit en aan te zetten zonder op de Watchdog te wachten.
Precedent
Dit is niet de eerste keer dat Apple met dit probleem wordt geconfronteerd. In 2023 ontwikkelde Ron Masas van Imperva een vergelijkbare kwaadaardige shader genaamd ShadyShader, die gebruikmaakte van WebGL. ShadyShader gebruikte ook een weglopende lus om de GPU te monopoliseren door enorme geneste lussen te creëren die technisch gezien niet oneindig waren.
Apple reageerde door CVE-2023-40441 uit te brengen met een CVSS-score van 6.5 (medium). Om het probleem te verhelpen, voegde Apple verbeterde inputvalidatie toe om weglopende lussen beter te detecteren.
Die inputvalidatie lijkt zwakker te zijn in WebGPU; de deathray bevat een triviaal identificeerbare oneindige lus. Uiteindelijk is het detecteren van oneindige lussen echter een verloren strijd vanwege het halting problem (stopprobleem). Er is betere pre-emption nodig voor niet-responsieve shaders, zeker als deze onbetrouwbare code uitvoeren. Alle andere geteste besturingssystemen lossen dit correct op.
Het is mogelijk dat de uitdaging voor Apple gedeeltelijk ligt in de architectuur van de M-serie chips. De OS-kernel kan de GPU niet direct onderbreken (pre-empt). In plaats daarvan wordt de GPU-afhandeling gedaan door een coprocessor genaamd de ASC, waarmee de OS-kernel communiceert. Alle logica voor GPU-pre-emption bevindt zich in de firmware van de ASC. Asahi Lina heeft een gedetailleerde analyse geschreven over de M-serie GPU's waarin deze architectuur verder wordt verkend.
Hoe is de deathray gevonden?
De ontdekking gebeurde op de ouderwetse manier: per ongeluk. Tijdens het leren van WebGPU bij het Recurse Center werd er per ongeluk een oneindige lus gemaakt. De verbazing was groot toen dit de computer liet vastlopen, waarna de vraag ontstond: "Gebeurt dit elke keer?". Dat bleek inderdaad het geval te zijn.
Melding en respons
Het probleem is op 27 juli 2026 gemeld bij Apple Security. Apple kon het probleem snel reproduceren en gaf aan dit te willen oplossen. Er werd een tijdlijn voor de fix gegeven die vertrouwelijk was.
Op 26 augustus 2026 veranderde Apple echter van koers. Ze gaven aan dat ze "geen veiligheidsimplicaties zagen in het rapport" en dat het rapport "niet leidde tot een wijziging in de producten van Apple." De melding zou worden doorgestuurd naar een ander team voor "potentiële overwegingen voor verbetering." Dit suggereert dat de prioriteit voor een oplossing erg laag is. Dit is opvallend, gezien de manier waarop ShadyShader werd aangemerkt als een probleem met een medium severity van 6.5.
Hier ontstaat een interessante discussie over wat precies een beveiligingsprobleem definieert. Veel beveiligingsonderzoekers zijn het eens met Apple. Zoals Apple stelt: "het resultaat is een crash, hang of herstelbaar dataverlies, wat wij niet beschouwen als een beveiligingsprobleem." Technisch gezien is dit standpunt verdedigbaar.
De meeste mensen die geen security-expert zijn, zijn echter verrast door deze karakterisering en het feit dat Apple het oplossen niet prioriteert. Er is een sterk vertrouwen in de browser; het geloof dat het simpelweg klikken op een link geen negatieve impact heeft op de rest van de computer (behalve wellicht het vertragen van het systeem tot het tabblad wordt gesloten). Iets als de deathray schendt dat vertrouwen op een zeer zichtbare manier, en veel gebruikers zien dat juist als een beveiligingsprobleem.
Toekomstverwachting
De deathray is zeker niet zo ernstig als een sandbox escape, RCE of een datalek. Maar gezien de extreem lage drempel (iemand enkel op een link laten klikken), kan het potentieel zeer irritant zijn. Als het kwaadaardig wordt gebruikt, is het een gemenere versie van een Rickroll. De hoop is dat Apple dit snel oplost (en dat de oplossing niet simpelweg het standaard uitschakelen van WebGPU is).
Totdat Apple een oplossing biedt, is de hoop dat mensen manieren vinden om er op een niet-kwaadaardige manier mee te experimenteren. Denk aan 'deathray-videogames' waarbij de Mac vastloopt als je verliest (mits de gebruiker hier vooraf expliciet mee instemt). Een mildere versie van "als je doodgaat in het spel, ga je dood in het echt".
Auberon López (they/them) alope107 auberonedu