Cross Site Scripting i flash

Det har vært en del skriverier om sikkerhetsfeil i flash filer i det siste, f.eks. “Serious web vuln found in 8 million Flash files” og “XSS vulnerabilities in 34 millions flash files”. Det viser seg at dette ikke er et nytt problem, men snarere ett man ikke har fokusert på tidligere. Og her snakker vi da om feil i selve filene, ikke sikkerhetshull i selve flash-avspilleren.

XSS i flash?
Problemene oppstår stort sett fordi flash-filmen tar inn parametere fra HTML/javascript. Disse parametrene brukes deretter uten å valideres først. Det kanskje vanligste eksempelet er at man ønsker å gjøre det enkelt å endre hvor brukeren skal sendes til når brukeren klikker på flashen. Dette kalles gjerne clickTag, og koden i selve flashen kan se slik ut:

on (release) {
   getURL (_root.clickTAG, "_blank");
}

Problemet med dette oppstår fordi man kan linke direkte til flash-filen og gi inn parametere som url-parametere slik:

http://url/til/flash-fil.swf?clickTAG=http://her/skal/brukeren

I et angrep, kan dette utnyttes slik:

http://url/til/flash-fil.swf?clickTAG=javascript:alert("xss")

Man kan altså spesifisere en “javascript:” url, og dermed vil javascriptet kjøres nå brukeren trykker på linken.

Denne URLen kan så spres til potensielle offer via f.eks. falske eposter, twitter eller instant messaging. Siden URLen peker på et domene man stoler på, er det større sjanse for at offeret klikker på linken, men det vil selvsagt også avhenge av både av innholdet i flash og epost/melding.

Hva kan jeg gjøre?
For å hindre denne typen angrep, bør man gjøre inputvalidering på de data man tar inn. En første idé er kanskje at man skal sjekke at URLen ikke starter med “javascript:”, men denne formen for blacklisting har flere problemer. For det første kan det skrives på mange måter (javascript, JAVASCRIPT, jaVaScriPT), og i tillegg kan man f.eks. ha mellomrom først (” javascript:”). Videre kan man også ha f.eks. data URLer og Flash sin egen “asfunction:”.
Det er derfor bedre å bruke whitelisting, og heller si hva man tillater URLene å starte med. På Adobes “Designer’s Guide: Building Macromedia Flash Banners with Tracking Capabilities” foreslås følgende kode:

on (release) {
   if (_root.clickTAG.substr(0,5) == "http:") {
      getURL(_root.clickTAG, "_blank");
   }
}

Denne tillater kun URLer som begynner med “http:”. Man kan utvide denne til å støtte flere typer, f.eks. slik:

on (release) {
   if (_root.clickTAG.substring(0,5)== "http:" || _root.clickTAG.substring(0,6)== "https:" || _root.clickTAG.substring(0,1)== "/") {
      getURL (_root.clickTAG, "_blank");
   }
}

Denne støtter både http, https og server-relative URLer (må begynne med slash). I de fleste tilfeller bør man gjøre dette enda strengere, ved å kun tillate URLer som peker på eget domene.

Jeg vil lære mer