Cross site scripting

Wikipedia
Loikkaa: valikkoon, hakuun

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äen voidaan kiertää pääsynhallinta, kuten ”sama alkuperä” -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 (esim. ihmisoikeusaiheiset sivustot monissa maissa).

Taustaa[muokkaa | muokkaa wikitekstiä]

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 yhteyskäytännöllä 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[muokkaa | muokkaa wikitekstiä]

XSS-haavoittuvuudet luokitellaan DOM-pohjaisiin[1], pysyviin ja ei-pysyviin.[2]

DOM-pohjaiset[muokkaa | muokkaa wikitekstiä]

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 parametrinä välitettävää tietoa ei ennen sivulle lisäämistä käsitellä siihen mahdollisesti sisällytettyjen HTML-koodien varalta. Tällöin parametrinä 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 kovalevyllä), 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[muokkaa | muokkaa wikitekstiä]

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 itsessään. Haittakoodi ujutetaan sivustolle osoitteen avulla. Käyttäjä täytyy huijata klikkaamaan vahingollisesti muotoiltua linkkiä esimerkiksi sähköpostissa, pikaviestissä, tekstiviestissä, hakukoneen tuloslistauksessa, keskustelualueella 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 vihollisesti 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[muokkaa | muokkaa wikitekstiä]

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ä pitkältä, huomiotaherättävältä koodirimpsulta ja sivulle voidaan eksyä normaalisti sivustolla navigoimalla.

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 muotoilee verkkokaupan osoitetta siten, että haittakoodi tallentuu sivustolle
  4. Kalle odottaa että ihmiset vierailevat sivuilla
  5. Kallen skripti kerää Liisan ja muiden käyttäjien henkilö- ja luottokorttitiedot talteen

Todellisia esimerkkejä[muokkaa | muokkaa wikitekstiä]

Internetissä on satoja esimerkkejä cross site scipting -haavoittuvuuksia julkisesti esillä. Seuraavat esimerkit havainnollistavat erilaisia tietoturva-aukkoja.

  • Bugzillan virhesivulta löytyi DOM-pohjainen haavoittuvuus, jossa sivulle kirjoitettiin sen osoite JavaScriptillä ilman suotimia tai merkistökoodausta. Selaimesta riippuen hyökkääjä saattoi sopivasti muotoillulla osoitteella lisätä sivulle oman skriptinsä. Haavoittuvuus korjattiin koodaamalla erikoismerkit merkistökoodauksella ennen niiden sivulle kirjoittamista.
  • Kuuluisa esimerkki ei-pysyvästä haavoittuvuudesta ovat Yair Amitin joulukuussa 2005 löytämät kaksi haavoittuvuutta Google.com-sivustolla. Haavoittuvuuksia hyödyntävä hyökkääjä saattoi esiintyä Googlen edustajana tietojenkalastelussa.
  • Elokuussa 2006 DOM-pohjaista haavoittuvuutta hyödynnettiin tekaistuissa uutisissa, joiden mukaan presidentti Bush oli palkannut 9-vuotiaan pojan Information Security -osaston päälliköksi. Cbsnews.com- ja www.bbc.co.uk-uutispalveluissa olleita haavoittuvuuksia hyväksikäyttäen hyökkääjät pystyivät lisäämään niihin oman, keksityn uutisen.
  • Marc Slemko löysi Hotmail-palvelusta pysyvän haavoittuvuuden lokakuussa 2001. Hyökkääjä saattoi varastaa käyttäjän Microsoft .NET Passport -evästeen. Haavoittuvuuden hyödyntäminen edellytti vihamielistä HTML-koodia sisältävän sähköpostin lähettämistä Hotmail-käyttäjälle. Hotmailin sähköpostien suodatus ei havainnut vihamielistä koodia, ja Internet Explorerin jäsennin käsitteli ja suoritti vihamielisen koodin. Ongelma korjattiin nopeasti, mutta useita samankaltaisia ongelmia havaittiin Hotmail-palvelussa ja muissa Passportia käyttävillä sivustoilla myöhemmin.
  • Netcraft-yhtiö ilmoitti kesäkuussa 2006, että PayPalin verkkosivustolla on turvallisuusongelma, ja että sitä on hyödynnetty aktiivisesti luottokorttien numerosarjojen ja henkilötietojen kalastelussa. Pian sen jälkeen Paypal ilmoitti, että muutos sivuston koodissa sulki haavoittuvuuden.
  • Lokakuussa 2005 Samy hyödynsi turvallisuusaukkoa MySpace-palvelussa, aiheuttaen yli miljoona ystävä-kutsua tunnuksen luojan profiiliin.
  • Susam Pal paljasti huhtikuussa 2006 haavoittuvuuden Community Architect -sivuston vieraskirjaohjelmassa. Monet ohjelmaa käyttäneet WWW-hotellit olivat haavoittuvia.
  • Marraskuussa 2006 Rajesh Sethumadhavan löysi pysyvän haavoittuvuuden Orkut-sivustolta. Haavoittuvuutta hyödyntävä Orkutin jäsen saattoi lisätä HTML- ja JavaScript-koodia profiileihinsa. [3] Rodrigo Lacerda käytti tätä haavoittuvuutta luodessaan evästeitä varastavan skriptin, Orkut Cookie Exploitin. Joulukuussa Orkut korjasi haavoittuvuuden.
  • Lokakuussa 2007 Australian liberaalipuolueen sivustolta löytyi haavoittuvuus. Pääministeri Howardin kuvaan liitettiin haavoittuvuutta hyväksikäyttäen rivoa tekstiä.[4][5]
  • Suomessa Matti Nikin lista lapsipornona estetyistä sivustoista näkyi hetken aikaa poliisin sivustolla.[6]
  • Sampo-pankin sivut avoinna kalastelijoille.[7] Aukon löytämisen jälkeisinä päivinä hakkerit löysivät kymmeniltä suurilta suomalaisilta sivustoilta vastaavanlaisia haavoittuvuuksia.[8][9]
  • Lokakuussa Twitterin etusivulle tehtiin muutoksia XSS:illä.

XSS-haavoittuvuuksien välttäminen[muokkaa | muokkaa wikitekstiä]

Cross site scripting -haavoittuvuuksien välttäminen edellyttää HTML-koodien siistimistä (quoting tai escaping) ennen kuin web-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ä web-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 parametrejä.

Muita haavoittuvuuksia[muokkaa | muokkaa wikitekstiä]

  • Cross Zone Scripting -haavoittuvuuksia hyödynnetään sovellusten "zone"- eli vyöhykeympäristössä. Yleensä tällöin suoritetaan koodia suuremmilla oikeuksilla kuin mitä koodille normaalisti sallitaan.
  • HTTP header injection -haavoittuvuudet, joita käytetään XSS-haavoittuvuuksien luomiseen, mahdollistavat esimerkiksi HTTP-vastauksen jakamisen.
  • Cross site -pyynnön väärentäminen (CSRF/XSRF) on kuin vastakohta XSS:lle. Siinä, missä XSS:ssä hyödynnetään käyttäjän luottamusta verkkosivuun, CSRF/XSRF:ssä hyökkääjä hyödyntää sivuston luottamusta sivua selaavan käyttäjän selainohjelmaan. Selain lähettää palvelimelle pyynnön, jonka palvelin luulee tulleen omilta autentikoiduilta (oikeaksi todistetuilta) käyttäjiltään.
  • SQL-injektiossa hyödynnetään haavoittuvuutta sovelluksen tietokantakerroksessa. Kun käyttäjän syöte on suodatettu väärin, sovellus voi suorittaa minkä tahansa SQL-lauseen.

Viitteet[muokkaa | muokkaa wikitekstiä]

  1. Web Application Security Consortium: DOM Based Cross Site Scripting or XSS of the Third Kind http://www.webappsec.org/projects/articles/071105.shtml
  2. http://www.nerv.fi/xss/doku.php?id=xss-haavoittuvuus
  3. http://packetstormsecurity.org/0612-exploits/XD100098.txt
  4. Libs, Labor sites face hack attack News.com.au. 10. lokakuuta 2007. Viitattu 1.4.2008. (englanniksi)
  5. http://farm3.static.flickr.com/2187/1528516904_201507ef2d_o.jpg
  6. Tuomas Linnake: Matti Nikin lapsipornolista näkyi poliisi.fi:ssä Digitoday. 31. maaliskuuta 2008. Viitattu 1.4.2008.
  7. Timo Poropudas: Sampo pankin sivut avoinna kalastelijoille Digitoday. 26. maaliskuuta 2008. Viitattu 2.4.2008.
  8. XSS-haavoittuvuuksien löytyminen suomalaisilta sivustoilta jatkuu CERT-FI. 31. maaliskuuta 2008. Viitattu 2.4.2008.
  9. Pauliina Kinnunen: Suurten yritysten verkkosivut reikäjuustoa Keskisuomalainen. 31. maaliskuuta 2008. Viitattu 2.4.2008.

Aiheesta muualla[muokkaa | muokkaa wikitekstiä]