Cross-site scripting

Cross-site scripting (XSS) on tietoturva-aukko, joka esiintyy usein WWW-sovelluksissa. Cross-site scripting mahdollistaa koodin syöttämisen, ja sen avulla mahdollisesti tunkeutumisen verkkosivulle.
XSS-aukkoa hyödyntämällä voidaan kiertää pääsynhallinta, kuten saman alkuperän käytäntö. Haavoittuvuutta voidaan hyödyntää esimerkiksi HTML-koodilla tai asiakaspäässä suoritettavilla skripteillä.
Cross-site scriptingistä käytettiin aluksi lyhennettä "CSS", mutta tästä lyhenteestä on luovuttu, koska se sekoittuu helposti kaskadisiin tyyliohjeisiin ("Cascading Style Sheets").
Erityisen vaarallisia aukot ovat sivustoilla, joilla käsitellään henkilötietoja, rahaa tai joiden surffaajien henkilöllisyyden tulisi pysyä salassa (esimerkiksi ihmisoikeusaiheiset sivustot monissa maissa).
Taustaa.
Kun Netscape-selaimeen lisättiin JavaScript-tuki, havaittiin, että siihen liittyy turvallisuusriski, kun WWW-palvelin lähettää suoritettavaa koodia käyttäjän koneelle. Yksi ongelmista syntyy, kun käyttäjä avaa useita selainikkunoita. Joissain tapauksissa skripti tarvitsee oikeuksia toisen sivuun tai objektin käsittelemiseen. Toisaalta taas tämä tulisi estää, koska ominaisuutta hyväksikäyttävä vihamielinen koodi voi varastaa salattavia tietoja. Ongelman ratkaisemiseksi selaimissa otettiin käyttöön yhtenäinen turvallisuuskäytäntö. Käytäntö sallii objektien ja sivujen vuorovaikutuksen vain samalla protokollalla ja saman verkkotunnuksen sisällä. Näin hyökkääjän verkkosivustolla ei ole pääsyä selaimen toisessa ikkunassa oleviin, salattaviin tietoihin. Samankaltaisia saantikäytäntöjä on sittemmin omaksuttu muihinkin skriptikieliin.
Cross-site scripting -turvallisuusaukot ovat verkkosivuilla olevia haavoittuvuuksia, joita hyväksikäyttäen hyökkääjä voi ohittaa nämä suojamekanismit. Verkkosivulle syötetyn vihamielisen koodin avulla hyökkääjä pääsee käsiksi salattaviin tietoihin, evästeisiin ja muihin kohteisiin.
Tyypit.
XSS-haavoittuvuudet luokitellaan DOM-pohjaisiin, pysyviin ja ei-pysyviin.
DOM-pohjaiset.
DOM-pohjaiset haavoittuvuudet, eli paikalliset cross-site scripting -haavoittuvuudet ovat sivujen skripteissä itsessään. Tällainen haavoittuvuus voi sisältyä esimerkiksi JavaScript-koodiin, joka käyttää sivun osoitteessa annettuja parametreja kirjoittaessaan sivulle sisältöä. Sivu on haavoittuva, jos parametrina välitettävää tietoa ei ennen sivulle lisäämistä käsitellä siihen mahdollisesti sisällytettyjen HTML-koodien varalta. Tällöin parametrina annettu HTML lisätään sivulle sellaisenaan, minkä seurauksena se saatetaan tulkita ja suorittaa sivun katselijan selaimessa. Käytännössä nämä aukot ovat hyvin samankaltaisia kuin ei-pysyvät haavoittuvuudet.
Koska Internet Explorer -selaimen vanhat versiot käsittelevät asiakaspuolen skriptejä paikallisesti (esimerkiksi sivua selaavan käyttäjän koneen kiintolevyllä), tällainen XSS-turvallisuusaukko voi aiheuttaa etäkäyttöhaavoittuvuuden. Jos paikallinen sivu (jollaisia asennetaan tyypillisesti selaimen asennuksen yhteydessä) on haavoittuva, hyökkääjän verkkosivustolla olevan linkin kautta tälle sivulle tultaessa sen sisältö suoritetaan käyttäjän koneella, käyttäjän selaimen oikeuksilla hänen järjestelmässään. Näin on mahdollista ohittaa pelkästään XSS-hyökkäysten estoon tarkoitettujen verkkotunnusrajoitusten lisäksi kaikki muutkin selaimen skripteille normaalisti asettamat rajoitukset. Internet Explorerin osalta tämä turvallisuusaukko on korjattu Internet Explorer 6 Service Pack 2:ssa.
Ei-pysyvät.
Ei-pysyvissä tai väliaikaisissa XSS-aukoissa haitallisesti muotoiltu koodi ei tallennu sivustoa ylläpitävälle palvelimelle mutta toimii käyttäjän selaimessa siten kuin sen alkuperä olisi sivusto itse. Haittakoodi ujutetaan sivustolle osoitteen avulla. Käyttäjä täytyy huijata napsauttamaan vahingollisesti muotoiltua linkkiä esimerkiksi sähköposti-, pika- tai tekstiviestissä, hakukoneen tuloslistauksessa, keskustelupalstalla tai internetsivuilla.
Pysyvät.
Pysyvissä XSS-aukoissa haittakoodi on tallennettu sivustoa ylläpitävälle palvelimelle esimerkiksi sivuston osoitteeseen lisättyjen parametrien avulla, lomakkeella tai vihamielisesti muotoilluilla tiedoilla, joita selain ilmoittaa itsestään HTTP-kutsun yhteydessä. Sivulla vierailevat altistuvat haittakoodille. Sivuston osoite ei näytä huomiota herättävän pitkältä koodilta, ja sivulle voidaan eksyä normaalisti sivustolla navigoimalla.
Todellisia esimerkkejä.
Julkisesti esillä olleista cross-site scipting -haavoittuvuuksista on satoja esimerkkejä. Seuraavat esimerkit havainnollistavat erilaisia tietoturva-aukkoja.
XSS-haavoittuvuuksien välttäminen.
Cross-site scripting -haavoittuvuuksien välttäminen edellyttää HTML-koodien siistimistä ("quoting" tai "escaping") ennen kuin WWW-sovellus tai skripti käyttää niitä tulostuksessa. Monissa ohjelmointikielissä tähän on sisäänrakennetut funktiot tai kirjastot.
Ongelmana XSS-haavoittuvuuksien välttämisessä on, että keinot riippuvat usein tilanteesta, eli sivuston tarpeista ja ongelmista. Turvallisin menetelmä WWW-sovelluksille on jäsentää HTML, riisua tunnisteet ja attribuutit, joita ei ole erikseen sallittu ja tulostaa vasta sen jälkeen.
Yksinkertaiset suodatustavat, kuten tunnettujen vaarallisten tunnisteiden riisuminen, eivät välttämättä riitä. Esimerkiksi Hotmailiin lokakuussa 2001 kohdistuneessa hyökkäyksessä hyödynnettiin standardoimattomia parametreja.