Parameter: en delt ChatGPT-samtale kunne kapre kontoen til den som åpnet lenken
lørdag 31. oktober · KI-generert · Kilde: Parameter
Sett `originValidator` til `"same-origin"` hvis du bruker MathLive, for standardverdien `"none"` var nøkkelleddet i en kjede der en delt ChatGPT-samtale kjørte JavaScript som offeret og leste private samtaler før OpenAI tettet hullet 26. oktober.
«Å åpne den delte lenken var det eneste som krevdes», skriver sikkerhetsforskerne i Parameter i rapporten de publiserte 28. oktober. De bygde en vanlig offentlig ChatGPT-samtale som kjørte angriperens JavaScript som chatgpt.com i økten til den som åpnet den. Koden kunne liste offerets samtaler, hente innholdet i en privat samtale som aldri var delt, og sende det til en ekstern server. Parameter meldte feilen 18. oktober, OpenAI løftet den fra P2 til P1 21. oktober og betalte 5 000 dollar i dusør.
Kjeden besto av ledd som hver for seg så ufarlige ut. En graf i samtalen lastet matte-biblioteket MathLive, som installerte en postMessage-lytter for skjermtastaturet i selve hovedsiden. HTML-forhåndsvisningen (Preview) kjører isolert på et annet domene, men kunne likevel sende meldinger til lytteren. MathLive godtok meldinger fra hvilken som helst opprinnelse, tok imot et tastaturoppsett med rå HTML og satte det inn med innerHTML. En iframe med srcdoc og uten sandbox-attributt ga et nytt dokument med chatgpt.com-identitet. ChatGPTs CSP blokkerte inline-skript, men tillot YouTube, og YouTubes oEmbed-endepunkt skrev callback-parameteren inn i JavaScript-svaret før det returnerte valideringsfeilen.
«Feilen var interessant fordi hver enkelt funksjon så fornuftig ut.» — Parameter
Selve Preview-sandkassen holdt, påpeker Parameter. Hullet oppsto fordi en komponent i hovedsiden stolte på meldinger fra feil avsender. Det samme mønsteret dukker opp i ethvert prosjekt der du kjører KI-generert HTML i en iframe ved siden av tredjepartskomponenter med egne lyttere. OpenAIs retting gjaldt ChatGPTs to web-frontender. Ifølge typedefinisjonene i MathLive 0.111.1, nyeste versjon på npm, er standardverdien for originValidator fortsatt "none".
Hva bør du gjøre?
- Sett
window.mathVirtualKeyboard.originValidator = "same-origin", eller en egen funksjon som sjekker opprinnelsen, hvis appen din bruker MathLive sammen med iframes. - Gå gjennom dine egne
message-lyttere og krev at de sjekker bådeevent.originogevent.sourcefør de endrer tilstand. - Gi dynamisk opprettede iframes
sandbox-attributtet når innholdet kan påvirkes av en uklarert ramme, og behandle CSP som reserveforsvar, ikke som eneste barriere.