26.11.1998
Tero Leppänen
Ti
Teknillinen Korkeakoulu
Tero.Leppanen@hut.fi
Monien Internet-palveluiden suorittamiseen tarvitaan suoritettavia ohjelmia. Tämän vuoksi onkin tarvetta saada WWW-sivuille suoritettavaa sisältöä. Suoritettavan sisällön WWW-teknologiat voidaan karkeasti jakaa palvelimella suoritettaviin ja asiakaskoneessa suoritettaviin. Ongelma suoritettavassa sisällössä verrattuna pelkkiin staattisiin WWW-sivuihin on kuitenkin sen aiheuttamat potentiaaliset turvallisuusriskit. Essee pureutuu erilaisiin suoritettavan sisällön WWW-teknologioihin ja niiden turvallisuuskysymyksiin.
Java on olio-orientoitunut ohjelmointikieli, jolla voidaan tuottaa suoritusalustariippumattomia appletteja, jotka voidaan upottaa WWW-sivuille. Java-appletit suorittuvat asiakkaan selaimen virtuaalikoneympäristössä. Java-applettien ajonaikainen ympäristö sisältää turvallisuusmanagerin, joka pyrkii varmistamaan, että appletti toimii sallituissa puitteissa.
Javascript, JScript ja VBScript ovat WWW-selainten tulkattavia skriptiohjelmointikieliä. Netscapen Javascriptissä on dokumentoitu olevan paljon turvallisuusaukkoja, joskin sen turvallisuusominaisuudet ovat parantuneet jonkun verran viime aikoina.
ActiveX on Microsoftin käyttämä, Windows- ja Internet Explorer - sidonnainen teknologia, joka mahdollistaa mm. suoritettavan sisällön upottamisen WWW-sivulle. ActiveX:n turvallisuutta on arvosteltu, koska sillä on suhteellisen vapaat kädet toimia asiakaskoneen ympäristössä.
Selaimet voi konfiguroida myös käyttämään plug-in- ja auttajasovelluksia, jotka suoritetaan näyttämään/käsittelemään sisältö, kun tietyntyyppistä dataa ladataan selaimella. Jotkut näistä sovelluksista sisältävät skripti- ja makrokieliä, jotka saattavat muodostaa turvallisuusriskin.
CGI-ohjelmat ovat palvelimella suoritettavia ohjelmia, jotka suorittavat erilaisia toimenpiteitä WWW-palvelimen ympäristössä ja toimittavat mahdollisesti palautetta käyttäjän selaimelle. Huonosti kirjoitetut CGI-ohjelmat tai huonosti konfiguroitu CGI-ohjelmien suoritusympäristö saattavat altistaa WWW-palvelimen hyökkäyksille.
Joka tapauksessa, suoritettava sisältö on nouseva trendi.
Palveluiden toteuttamiseen tarvitaan useimmissa tapauksissa suoritettava tietokoneohjelma. Ohjelma vaikuttaa siihen, mitä palautetta käyttäjä saa selaimelta tekemistään toiminnoista ja mitä seurauksia käyttäjän suorittamilla toimenpiteillä on. Näin WWW-dokumentin sisältö on tietyssä mielessä muuttunut staattisesta dynaamiseksi. Puhutaan suoritettavasta WWW-sisällöstä.
Tässä esseessä perehdytään erilaisiin teknologioihin, joilla voidaan tuottaa suoritettavaa sisältöä WWW-sivuille. Suoritettavan sisällön yleistymisen myötä on myös herännyt huoli WWW-sisällön ja selaimien turvallisuudesta, mikä onkin yksi tämän dokumentin painopisteistä
On olemassa lukuisia tapoja generoida suoritettavaa sisältöä WWW-sivuille. Toiset niistä todella suorittavat käyttäjän tietokoneen tai selaimen ympäristössä ja toiset taas luovat illuusion WWW-sivun dynaamisuudesta. Jälkimmäisessä tapauksessa suoritettava koodi on yleensä palvelimessa ja sen mukaan käyttäjän selaimeen ladataan tai generoidaan erilaisia sivuja ja lomakkeita. Karkeasti voidaan siis jakaa suoritettava sisältö palvelinkoneessa suoritettavaan ja asiakaskoneessa suoritettavaan.
Suoritettava sisältö voidaan jakaa myös eri suoritusmallien mukaan: On olemassa virtuaalikonesuoritteisia, tulkattavia ja itse asiakaskoneen käyttöjärjestelmäympäristössä suoritettavia tai muuten käyttöjärjestelmän palveluja hyödyntäviä teknologioita. Palvelinkoneessa suoritettavat ohjelmatkin voitaisiin jakaa samalla tavoin, mutta selaimen käyttäjän kannalta ei ole niin oleellista, tapahtuuko palvelimen päässä suoritettavan ns. CGI-skriptin suoritus tulkin (perl, shell-skriptit) tai virtuaalikoneen (Java) avulla vai onko kyseessä palvelimen käyttöjärjestelmässä suoritettava käännetty binääriohjelma, koska lopputulos on tavallisesti selaimelle välitettävä HTML-dokumentti. Mikään ei tietenkään estä myöskään CGI-skriptien generoimia dokumentteja sisältämästä suoritettavaa sisältöä.
Eri teknologioita käytetään hieman eri tavoin tarpeen mukaan, koska myöskin niiden suoritusympäröstöissä on eroja. Jos suurin osa käyttäjän toimintojen aiheuttamista muutoksista saavat aikaan jotain palvelimen päässä, on luonnollisesti helpompi käyttää palvelimella ajettavaa suoritettavaa ohjelmaa. Jos taas halutaan tehdä esimerkiksi reaaliaikaista vastetta käyttäjälle antava käyttöliittymä, lienee parempi valita Java tai jokin muu asiakaskoneessa suoritettava teknologia.
Eri WWW-teknologioiden turvallisuudesta on jo pitkään käyty keskustelua. On käynyt ilmi, että juuri monien suoritettavan sisällön tuottamiseen tarkoitettujen teknologioiden avulla voidaan vaarantaa käyttäjän työaseman turvallisuus. Palvelimessa suoritettavat skriptit taas ovat osoittautuneet potentiaalisiksi turvallisuusaukoksi WWW-palvelimille. Yleisimmät vaihtoehdot turvallisuuden lisäämiseksi ovat suorittaa ohjelmat valvotussa ympäristössä (esim. Java & SecurityManager [9]), valvoa, että itse suoritettavat ohjelmat on kirjoitettu "oikein" siten että ne eivät vaaranna turvallisuutta (esim. palvelimen CGI-skriptit) tai yksinkertaisesti käyttäjänä estää suoritettavan sisällön suorittaminen selaimessa, kun lähteen luotettavuudesta ei voida olla varmoja [1].
Java sinänsä ei ole pelkästään suoritettavan WWW-sisällön tuottamiseen soveltuva kieli vaan sillä pystyy periaatteessa kirjoittamaan sovelluksia kuten millä tahansa ohjelmointikielillä [1]. Javan käyttämisen suoritettavana sisältönä mahdollistaa appletin käsite [1, 3]. Sekä itsenäiset Java-sovellukset että Java-appletit ovat alustariippumattomia sillä ehdolla, että kaikki niiden käyttämät luokat ovat joko alustariippumattomia tai saatavilla kaikille alustoille, missä Javaa voidaan ajaa (ts. Java Runtime on saatavilla).
Sekä Java-appletit että -sovellukset luodaan Java kehitysympäristössä [1]. Sunin peruskehitysympäristö on JDK (Java Developer's Kit), joka sisältää komentoriviltä käytettäviä työkaluja kuten kääntäjän, debuggerin, java virtuaalikoneen sovelluksia varten, Javan perusluokkakirjaston ja joukon erilaisia työkaluja [2]. Tämä kehitysympäristö on ilmainen. Lisäksi on olemassa kaupallisia kehitysympäristöjä, jotka sisältävät enemmän tai vähemmän samat asiat kuin JDK, mutta integroituna kokonaisuudeksi GUI:n kera. JDK:n sisältämä standardiluokkakirjasto tulee yleensä mukana myös kaupallisissa kehitysympäristöissä ja jotkut niistä saattavat myös tarjota omia, ei välttämättä alustariippumattomia, luokkakirjastoja.
Appletti tarjoaa keinon upottaa Java-ohjelma WWW-sivulle. Kun näin tehdään, varataan appletille sivulta tietty alue, minkä sisältöä sillä on lupa päivittää. Selaimen täytyy sisältää Java virtuaalikone ja ajonaikainen ympäristö (sisältäen tietyn luokkakirjaston). [3]
Java-appletti siis suorittuu asiakaskoneessa. Se ladataan datana palvelimelta WWW-sivun mukana ja suoritetaan Java virtuaalikoneessa. Appletin suoritusympäristö poikkeaa melko paljon stand-alone Java-sovelluksen suoritusympäristöstä, sillä se on turvallisuussyistä huomattavasti rajoitetumpi ja kontrolloidumpi. Java-applettien tulisi yleensä olla täysin alustariippumattomia. [4]
Kolme pääasiallista välinettä, joita suoritusympäristö käyttää turvallisuuden parantamiseksi ovat tavukoodin verifioija (bytecode verifier), luokkien lataaja (class loader) ja turvallisuudesta huolehtija (Security Manager, anteeksi huonot käännökset). Tavukoodin verifioija varmistaa, että ladattu luokka on standardin mukainen: Siis käännetty oikealla Java-kääntäjällä ja ovat oikeata luokkatiedostoformaattia. Luokkien lataaja tarjoaa keinot, joilla verkosta ladattuja luokkia voidaan hallita ja tarkkailla. Yksi sen tärkeimmistä tehtävistä on varmistaa, ettei paikallisen Java suoritusympäristön luokkia korvata uusilla verkosta ladatuilla. [1, 5]
Security manager huolehtii oikeiden turvallisuuskäytäntöjen noudattamisesta. Se varmistaa, ettei "vaarallisia" metodeja voi kutsua verkosta ladatuista luokista. Yleisesti ottaen appleteilta on kielletty asiakaskoneen tiedostojärjestelmän tiedostojen lukeminen ja kirjoittaminen ja verkkoyhteyksien ottaminen muihin kuin siihen palvelinkoneeseen, mistä appletti on lähtöisin. [9] On sanomattakin selvää, että tämä rajoittaa jonkin verran sitä mitä appletilla voi tehdä.
Yleisesti ottaen voidaan todeta, että Javan suoritusympäristössä on pyritty kiinnittämään huomiota turvallisuusnäkökohtiin. Lähteiden mukaan tämän pitäisi tehdä vaarallisten applettien kirjoittamisen suhteellisen vaikeaksi. Turvallisuusrajoitukset eivät kuitenkaan koske paikalliselta koneelta ladattuja luokkia. Myöskin koneen tahmaavia tai kaatavia denial-of-service -hyökkäyksiä tekeviä häirikköappletteja lienee mahdollista kirjoittaa. [1]
(Koska lähde on jo hieman ikääntynyt, saattaa olla että joitain asioita on jo korjattu uudemmissa Javan suoritusympäristöissä.)
Sovellusten kehittämiseen selaimen Javascriptillä tarvitaan periaatteessa ainoastaan tekstieditori johtuen kielen tulkattavuudesta.
Muita samantyyppisiä kieliä ovat JScript ja VBScript, jotka molemmat ovat Microsoftin kehittämiä Javascriptiä vastaavia skriptikieliä [3]. Niihin ei kuitenkaan paneuduta tässä tarkemmin, eikä alla esitetyt turvallisuusnäkökohdat välttämättä päde niihin.
Uusina turvallisuuskäytäntöinä Javascriptille ovat tulleet sama lähde -käytäntö (same origin) ja skriptien allekirjoitus. Sama lähde -käytäntö tarkoittaa sitä, että kun on ladattu dokumentti yhdestä lähteestä, ei toisesta lähteestä ladattu Javascript-ohjelma kykene muuttamaan selaimen tai HTML-dokumentin ominaisuuksia [7]. Skriptien allekirjoitus taas tarkoittaa sitä, että kun tehty Javascript-ohjelma on allekirjoitettu erityisellä allekirjoitustyökalulla, sille voidaan selaimen käyttäjän niin halutessa antaa laajemmat turvallisuusoikeudet koneen resursseihin kuin allekirjoittamattomalle skriptille [7]. Digitaaliseen allekirjoittamiseen käytetään julkisen avaimen salausta, joten sen perusteella pitäisi pystyä varmentamaan, että appletin allekirjoittaja on se henkilö, joka väittää olevansa. [8]
ActiveX-dokumentti taas on sama kuin OLE-dokumenttiolio. ActiveX Scriptingin pääasialliset käyttökohteet ovat juuri edellämainittujen VBScriptin ja JScriptin käyttö. Lisäksi on olemassa ActiveX palvelinkomponentteja, jotka ovat itseasiassa palvelimen päässä suoritettavia skriptejä (.asp-päätteiset tiedostot). [3]
Auttajasovellukset taas ovat täysin selaimen ulkopuolisia sovelluksia, jotka käynnistetään, kun jokin tietty, selaimelle vierasta tyyppiä oleva dokumentti ladataan verkosta. Yleensä käyttäjä voi konfiguroida selaimensa käynnistämään tiettyjä sovelluksia, kun tiettyä MIME-tyyppiä olevaa sisältöä ladataan selaimella. [1]
Myös monet auttajasovelluksina käytetyt ohjelmat saattavat sisältää omia skriptikieliä. Viime vuosina on paljon puhuttu ns. makroviruksista, joten kannattaa olla varovainen, mitä sovelluksia käynnistää automaattisesti näyttämään verkosta ladattuja dokumentteja.
Tyypillinen uhkakuva on, että käyttäjä yrittää suorittaa jotain palvelimella olevaa antamalla CGI-skriptille virheellistä syötettä. Riippuu täysin skriptistä ja sen suoritusoikeuksista onnistuuko tämä vai ei. Uhkakuvat kohdistuvat siis tässä palvelimen, eivät selaimen käyttäjän suuntaan, koska skriptien suoritus tapahtuu nimeomaan palvelimella. Tyypillinen hyökkääjä yrittää joko saada pääsyn palvelimen tiedostojärjestelmään tai salasanatietokantaan. Myös erilaiset denial-of-service hyökkäykset saattavat olla mahdollisia, koska tulkattavat skriptiohjelmat saattavat jumittuessaan kuormittaa palvelinta.
| [1] |
Anon, Risks of Executable Web Content, 14.4.1997 [viitattu 23.9.1998] < http://www.upenn.edu/computing/security-privacy/java/java_security.html > |
| [2] |
Campione, M. & Walrath, K., Java Tutorial: Object Oriented Programming
for The Internet, Second Edition, Addison-Wesley Pub Co., 1998, 964s [viitattu 23.9.1998], < http://www.javasoft.com/docs/books/tutorial/index.html> |
| [3] |
Denny, R.B., New Technologies and the Website Family: Executive Summary, 29.10.1996 [viitattu 23.9.1998], < http://solo.dc3.com/white/new-tech-ws.html> |
| [4] |
Harold, E.R., comp.lang.java FAQ, 6.10.1997 [viitattu 23.9.1998], < http://sunsite.unc.edu/javafaq/javafaq.html>, |
| [5] |
McGraw, G. & Felten, E., Understanding the keys to Java security -- the sandbox and authentication, JavaWorld, 1997, Toukokuun numero, [viitattu 23.9.1998], < http://www.javaworld.com/javaworld/jw-05-1997/jw-05-security.html> |
| [6] |
Netscape Communications Corporation, Javascript Guide, 26.11.1997
[viitattu 23.9.1998] < http://developer.netscape.com/docs/manuals/communicator/jsguide4/index.htm> |
| [7] |
Netscape Communications Corporation, JavaScript Security in Communicator 4.x, 30.9.1997 [viitattu 23.9.1998], < http://developer.netscape.com/docs/manuals/communicator/jssec/index.htm> |
| [8] | Netscape Communications Corporation, Netscape Object Signing: Establishing Trust For Downloaded Software 2.7.1998 [viitattu 17.11.1998] < http://developer.netscape.com/docs/manuals/signedobj/trust/index.htm> |
| [9] |
Sun Microsystems, Frequently Asked Questions - Java Security / Applet Security 22.7.1998 [viitattu 23.9.1998] < http://www.javasoft.com/sfaq/index.html> |