Suoritettava sisältö WWW-sivuilla

26.11.1998

Tero Leppänen
Ti
Teknillinen Korkeakoulu
Tero.Leppanen@hut.fi

Tiivistelmä

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.


1 Johdanto

HTTP-protokollan avulla palvelimelta asiakkaalle välitetty WWW-dokumentti on periaatteessa luonteeltaan staattinen. Kun WWW-sivun sisältö on siirretty selaimeen, yhteys palvelimeen katkeaa ja dokumentin sisältö pysyy muuttumattomana kunnes käyttäjä lataa uuden sivun selaimeen. Jotta WWW:tä voitaisiin käyttää muuhunkin kuin pelkkien dokumenttien levittämiseen, on suunniteltu erilaisia keinoja, joilla WWW-sivuille voidaan rakentaa erilaisia palveluita.

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].

2 Katsaus suoritettaviin WWW-teknologioihin

Tässä kappaleessa käydään lyhyesti läpi eri suoritettavan sisällön WWW-teknologioiden piirteitä.

2.1 Java

Yleiskuvaus

Java itsessään on Sunin Microsystemsin määrittelemä olio-orientoitunut ohjelmointikieli. Java käännetään Java-kääntäjällä alustariippumattomaksi tavukoodiksi, joka voidaan suorittaa kaikissa ympäristöissä, joihin Java-suoritusympäristö (Java Runtime) on saatavilla. [1, 3]

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]

Turvallisuus

Javan ajonaikainen ympäristö pyrkii monin keinoin varmistamaan, että appletti on standardin mukainen ja käyttäytyy siten, ettei se aiheuttaisi turvallisuusriskejä.

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ä.)

2.2 Javascript

Yleiskuvaus

Javascript oli alunperin Netscapen selaimen skriptiohjelmointikieli, mutta sen näkyy laajentuneen myös serveripuolella käytettävissä olevaksi kieleksi. Netscape väittää Javascriptin olevan olio-pohjainen, millä ilmeisesti tarkoitetaan pääasiassa sitä, että Javascriptistä voidaan käyttää tiettyjä kiinteästi määriteltyjä olioita ajon aikana. [6] Asiakkaan päässä ajettaja selaimen Javascript on tulkattava kieli. Serveripään Javascript taas on hyvin erilainen, sillä se on käännettävä yhdessä tarvittavan HTML-sisällön kanssa suoritettavaksi ohjelmaksi, minkä jälkeen serveri voi käyttää sitä generoimaan HTML-sivuja. Palvelimen Javascriptiä ei käsitellä tässä sen tarkemmin. [6]

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.

Turvallisuus

Alun alkaen Javascriptin turvallisuuteen ei oltu kiinnitetty kovin paljon huomiota, mikä näkyi suurena turvallisuusaukkojen määränä [1]. Netscape Navigator 3.0:aan oli suunniteltu ns. datan pilaantuminen (data tainting), minkä oli tarkoitus estää yksityisen datan leviäminen asiakaskoneen ulkopuolelle [1]. Tämä on kuitenkin poistettu Netscape Communicator 4.0:sta ja sen tilalle on kehitetty parempia menettelytapoja [7].

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]

2.3 Active X

Yleiskuvaus

ActiveX on yleisnimi Microsoftin monille tekniikoille, jotka perustuvat OLE-arkkitehtuuriin. Toisin kuin edelläesitetyt teknologiat, ActiveX on tällä hetkellä täysin alusta- ja jopa selainriippuvainen. Ainoastaan Microsoft Internet Explorer tukee sitä. ActiveX perustuu Microsoft Component Object Modeliin, minkä on alunperin ollut tarkoitus mahdollistaa sovellusten välisten skriptien käyttö. Sen avulla voidaan linkittää hajautettuja sovelluksia toisiinsa verkon avulla [3]. ActiveX kontrolleja voidaan upottaa WWW-sivulle kuten Java-appletteja tietyin varauksin:

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]

Turvallisuus

Heti ensimmäiseksi on mainittava, että ajan tasalla olevan ja täysin puolueettoman informaation löytäminen ActiveX:n turvallisuudesta oli hieman vaikeaa. Eräs lähde mainitsee kuitenkin, että ActiveX-kontrollien toiminnalle käyttäjän koneessa ei ole mitään rajoituksia, jos käyttäjä on hyväksynyt selaimen konfiguraatiossa ActiveX:n käytön. Turvallisuusmalli sisältää kuitenkin Microsoft Authenticode digitaalisen allekirjoituksen mahdollisuuden, minkä avulla verkosta ladattujen ActiveX-kontrollien alkuperä voidaan määrittää. Tämä ei kuitenkaan estä ActiveX -kontrollia vahingossa aiheuttamasta haittoja tai turvallisuusaukkoja, mitä muut, petolliset ActiveX-kontrollit voisivat käyttää hyväksi, koska suoritus ei kuitenkaan tapahdu edes yhtä kontrolloidussa ympäristössä kuin Javan. [1]

2.4 Plug-init ja auttajasovellukset

Yleiskuvaus

Käyttäjän on mahdollista konfiguroida selaimensa näyttämään sellaista sisältöä, jota se ei muuten pysty näyttämään, asentamalla ns. plug-in sovelluksia [1]. Nämä ovat sovelluksia, jotka käynnistyvät kun tiettyä, selaimelle vierasta tyyppiä oleva dokumenttia ollaan lataamassa verkosta. Tavallisimmin pluginit toimivat selaimen ikkunassa ja varaavat itselleen alueen missä toimia, kuten appletit.

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]

Turvallisuus

Jotkut plug-in sovellukset sisältävät myös omia skriptikieliä tai jotain sen tyyppistä, joten näitäkin voidaan käyttää hyväksi turvallisuusaukkoina. [1] Esimerkkinä lähde mainitsee Shockwaven ja lisäksi mieleen potentiaalisina riskeinä tulevat VRML-selaimet.

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.

2.5 CGI-skriptit

Yleiskuvaus

Kuten selitettiin johdannossa, CGI-skriptit ovat serverin päässä suoritettavia skriptejä, joita saatetaan käyttää hyvin monenlaisiin tarkoituksiin. CGI-skriptejä saatetaan tehdä hyvin monenlaisilla ohjelmointikielillä, mutta Unix-maailmassa suosittuja skriptikieliä ovat mm. Perl ja erilaiset shell-skriptit.

Turvallisuus

Yleisessä tapauksessa on täysin WWW-serverin ylläpitäjän määritettävissä, millä oikeuksilla suoritettava CGI-ohjelma ajetaan. Turvallisinta olisi, jos esimerkiksi skriptin luettavissa ja kirjoitettavissa olevat hakemistot olisivat rajoitettu ainoastaan välttämättömiin, mikä on Unix-palvelimessa ainakin teoriassa helppo järjestää.

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.

3 Loppusanat

Huolimatta eri suoritettavan WWW-sisällön teknologioita koskevista turvallisuusongelmista, suoritettavan sisällön määrä on todennäköisesti pikemminkin yleistymässä kuin vähenemässä. Teknologioita, joilla erilaista dynaamista sisältöä voidaan tuottaa on myös monia, mikä tietyssä määrin lisää turvallisuusriskiä. Internetin palvelut ovat kuitenkin kehittymässä siihen suuntaan, että suoritettavalle sisällölle on selkeä tarve, joten täytyy toivoa, että turvallisuusnäkökohtiinkin kiinnitetään huomiota, ennenkuin suoritettavan sisällön teknologioita aletaan toden teolla ottaa turvallisuuskriittisiin käyttötarkoituksiin.

Lähdeluettelo

[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>

Lisätietoja

Applet Execution Environment
Tietoa appletin suoritusympäristöstä.
Flexible Control of Downloaded Executable Content
Menetelmä suoritettavan sisällön turvallisuuden parantamiseen.
Internet Security, ActiveX, and Java
Dokumentti ActiveX:n ja Javan turvallisuudesta.
Java, ActiveX Under a Microscope
ActiveX:n arviointia
JavaScript Problems I've Discovered
Jonkun löytämiä Javascript turvallisuusaukkoja.
Java Security: Frequently Asked Questions
Kysymyksiä ja vastauksia Javan turvallisuudesta.
The Mobile Intranet, BYTE Magazine, 1998, Toukokuun numero
Artikkeli, aiheena Mobile Networking.
Security Tradeoffs: Java vs. ActiveX
Javan ja ActiveX:n vertailua turvallisuusnäkökulmasta.
Tangled Web
Suoritettavan sisällön turvallisuutta käsittelevä dokumentti.
Topic: JavaScript Vulnerability
Dokumentti Javascriptin turvallisuudesta.
Untrusted Applications Need Trusted Operating Systems
Javaa ja ActiveX:ää sivuavaa turvallisuusinformaatiota.
WMLScript Specification
Tietoa WMLScriptistä.
W3Kit 2.2, An Object Oriented Toolkit for Interactive WWW Applications
W3Kit, mielenkiintoinen CGI-skripteihin perustuva tapa tuottaa suoritettavaa sisältöä.

Leppänen Tero
Last modified: Tue Nov 17 15:23:13 EET