När ett betrott JavaScript-bibliotek började sprida skadlig kod
I juni 2024 upptäckte säkerhetsansvariga att polyfill . io, ett populärt JavaScript-bibliotek inbäddat på över 100 000 webbplatser, hade börjat sprida skadlig kod. Bland de drabbade fanns Hulu, Mercedes-Benz och WarnerBros. Hur kunde det hända, och vad kan vi lära oss av det?
Lite info..
En polyfill är en kodbit som ger äldre webbläsare stöd för moderna webbfunktioner. polyfill . io var en gratistjänst som levererade dessa, relativt vanliga kodbitar. (Tjänsten skapades av webbutvecklaren Andrew Betts.)
I februari 2024 köpte ett kinesiskt företag vid namn Funnull domänen och GitHub-kontot. Andrew Betts varnade omedelbart sina användare att ta bort referensen, men varningen fick begränsad spridning.
Mellan februari och juni förändrade Funnull tjänsten stegvis. Den 25 juni 2024 avslöjade säkerhetsföretaget Sansec att polyfill . io spred skadlig kod riktad mot mobila enheter, som omdirigerade besökare till bedrägerisajter. Två dagar senare stängde domänregistraren Namecheap ned domänen. Cloudflare hade då redan börjat ersätta de skadliga länkarna automatiskt med en säker kopia på sitt eget innehållsleveransnätverk, en åtgärd som SweClockers rapporterade om i slutet av juni 2024.
I efterhand har det visat sig att Funnull var en täckmantel för nordkoreanska aktörer som tvättade kryptovaluta, genom omdirigeringar till spelsajter.
Lite teknisk förklaring
JavaScript hämtas från en extern domän och körs med samma rättigheter som den egna koden. Scriptet kan läsa formulärinmatningar, ändra vad användaren ser, och skicka data vart som helst. Detta sker i bakgrunden och den ouppmärksamme missar detta.
Den mer intressanta frågan är varför Subresource Integrity (SRI) inte kopplades på? SRI är en kontrollmekanism där webbläsaren vägrar köra en fil om dess kryptografiska hash inte stämmer. Problemet var att polyfill.io levererade dynamisk kod, anpassad efter varje besökares webbläsare. När innehållet ändras vid varje anrop går det inte att fastställa någon hash i förväg.
Vad betyder detta?
Domänägande är inte permanent.En domän kan byta ägare utan förvarning. Den som byggde en tjänst för tio år sedan är inte nödvändigtvis den som driver samma tjänst idag.
Passiva beroenden är fortfarande beroenden. Många drabbade webbplatser behövde inte längre polyfills, men hade missat att sanera koderna. Större företag låter ofta gammal skräp ligga kvar i kod, speciellt när man tror att det inte skadar.
**Det tidigare skälet för CDN är inte heller giltigt längre. När webbläsarna omkring 2020 införde cache-partitionering lagras varje domäns filer separat. Resonemanget att en besökare redan skulle ha samma fil lagrad från en annan sajt, och därmed slippa ladda ner den, stämmer helt enkelt inte längre.
Kolla gärna din egen sajt
1. Gå in på din sida i Chrome eller Firefox
2. Tryck F12, (ctrl+i), för att öppna utvecklarverktygen
3. Gå till fliken Nätverk
4. Ladda om sidan med Ctrl+F5
5. Lägg märke till de domäner som inte är dina egna
För varje extern domän finns det anledning att ifrågasätta: Behövs denna fortfarande? Vem äger den idag? Och vad skulle hända om den försvann eller blev kapad?
Som avslutning
Polyfill.io-incidenten passar in i ett mönster där vi också hittar British Airways 2018, eFile.com 2023, MOVEit samma år, och flera kapade npm-paket. Moderna webbplatser består av kod från dussintals olika ägare, och förändringar hos någon av dem kan påverka miljontals besökare.
En hyresvärd som aldrig skulle släppa in okända personer i sina lokaler utan att kontrollera vilka det är, släpper ändå utan tvekan in tjugo externa skript på sin webbplats utan att veta vem som äger dom. Det betyder inte att man måste bygga allt själv. Men det betyder att man bör veta vilka externa källor man har, vad de tillför och vad som händer om de förändras. Förvånansvärt få webbplatser har den överblicken.
(Den här texten är en del av en serie om praktisk webbsäkerhet. Har du frågor eller synpunkter, hör gärna av dig.)