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.

Esimerkki

  1. Liisa käyttää usein verkkokauppaa, jonne voi kirjautua tunnuksilla ja tallentaa henkilö- ja luottokorttitietoja.
  2. Kalle huomaa verkkokaupan sivustolla XSS-haavoittuvuuden.
  3. Kalle lähettää Liisalle sähköpostitse, pikaviestimellä tai muulla keinolla vihamielisesti muotoillun linkin, joka saa verkkokauppasivuston käyttäytymään Kallen haluamalla tavalla.
  4. Liisa ei huomaa linkin viallisuutta, koska se alkaa aivan normaalisti verkkokaupan osoitteella ja sivu itsessään näyttää oikealta. Liisa surffaa sivuilla kirjautuneena.
  5. Kallen skripti voi nyt varastaa Liisan henkilö- ja luottokorttitiedot ja tehdä käytännössä mitä tahansa sivustolla Liisan puolesta.

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.

Esimerkki

  1. Liisa käyttää usein verkkokauppaa, jonne voi kirjautua tunnuksilla ja tallentaa henkilö- ja luottokorttitietoja (esimerkiksi www.vaatteisto.fi).
  2. Kalle huomaa verkkokaupan sivustolla XSS-haavoittuvuuden.
  3. Kalle muotoilee verkkokaupan osoitetta siten, että haittakoodi tallentuu sivustolle (esimerkiksi www.vaatteisto.fi/<script src="/haittakoodi.js"></script>).
  4. Kalle odottaa, että ihmiset vierailevat sivuilla.
  5. Kallen skripti kerää Liisan ja muiden käyttäjien henkilö- ja luottokorttitiedot talteen.

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.

Muita haavoittuvuuksia

Lähteet

  1. ↑ DOM Based Cross Site Scripting or XSS of the Third Kind 7.4.2005. Web Application Security Consortium. (englanniksi)
  2. ↑ http://www.nerv.fi/xss/doku.php?id=xss-haavoittuvuus [vanhentunut linkki]
  3. ↑ Orkut Group Cross Site Scripting Vulnerability (TXT) dl.packetstormsecurity.net. 11.12.2006. (englanniksi)
  4. ↑ Libs, Labor sites face hack attack News.com.au. 10.10.2007. Arkistoitu 23.12.2007. Viitattu 1.4.2008. (englanniksi)
  5. ↑ The Liberal Party of Australia. John Howard says: … (JPEG) (kuvankaappaus) farm3.static.flickr.com.
  6. ↑ Linnake, Tuomas: Matti Nikin lapsipornolista näkyi poliisi.fi:ssä Digitoday. 31.3.2008. Viitattu 1.4.2008.
  7. ↑ Poropudas, Timo: Sampo pankin sivut avoinna kalastelijoille Digitoday. 26.3.2008. Viitattu 2.4.2008.
  8. ↑ XSS-haavoittuvuuksien löytyminen suomalaisilta sivustoilta jatkuu CERT-FI. 31.3.2008. Arkistoitu 21.6.2013. Viitattu 2.4.2008.
  9. ↑ Kinnunen, Pauliina: Suurten yritysten verkkosivut reikäjuustoa Keskisuomalainen. 31.3.2008. Viitattu 2.4.2008.

Aiheesta muualla