hyväksymispäivä arvosana arvostelija Turvallisuuskriittisissä, sulautetuissa järjestelmissä esiintyvien ohjelmistovaatimusten virheanalyysi Jarkko-Juhana Sievi Helsinki 6.4.2005 HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos
HELSINGIN YLIOPISTO HELSINGFORS UNIVERSITET Tiedekunta/Osasto Matemaattis-luonnontieteellinen tdk Tekijä Författare Jarkko-Juhana Sievi Laitos Institution Tietojenkäsittelytieteen laitos Työn nimi Arbetets titel Turvallisuuskriittisissä, sulautetuissa järjestelmissä esiintyvien ohjelmistovaatimusten virheanalyysi Oppiaine Läroämne Tietojenkäsittelytiede Työn laji Arbetets art Tietoturva: Luottamus ja varmuus -seminaari Tiivistelmä Referat Aika Datum 6.4.2005 Sivumäärä Sidoantal 11 sivua Avainsanat Nyckelord Turvallisuuskriittinen, ohjelmistovirhe, sulautettu järjestelmä, virheanalyysi Säilytyspaikka Förvaringställe Muita tietoja Övriga uppgifter
Sisällysluettelo 1 Johdanto... 1 2 Määritelmät ja luokittelun perusteet... 2 3 Ohjelmistovirheiden luokittelu... 3 3.1 Havaittujen virheiden tarkastelu... 5 3.2 Vertailu aikaisempiin tutkimuksiin... 10 4 Yhteenveto... 10 Lähteet... 11
1 Johdanto Sulautetut järjestelmät ovat järjestelmiä, joissa ohjelmisto ja laitteisto muodostavat erottamattoman kokonaisuuden. Esimerkiksi mikroaaltouunit, robotin ohjaimet, hissien ohjausjärjestelmät, matkapuhelimet ja puhelinvaihteet sisältävät yhden tai useampia sulautetun järjestelmän. Turvallisuuskriittisellä järjestelmällä tarkoitetaan järjestelmää, jossa ohjelmiston vikatoiminto voi johtaa vaaratilanteeseen tai laitteiston rikkoutumiseen. Esimerkiksi ydinvoimaloiden automaatiojärjestelmät sekä autojen ja lentokoneiden tietokoneet ovat turvallisuuskriittisiä järjestelmiä. Tässä seminaariaineessa esitellään Robyn Lutzin artikkeli [Lut93], jossa analysoidaan turvallisuuskriittisissä, sulautetuissa järjestelmissä esiintyviä turvallisuuteen liittyviä ohjelmistovikoja. Artikkelissa on tutkittu Voyager- ja Galileo-avaruusluotainten ohjelmistojen virheitä, joita havaittiin integrointi- ja järjestelmätesteissä kaikkiaan 387. Vaatimusmäärittelyn ongelmat todettiin perimmäiseksi syyksi turvallisuuteen vaikuttavissa ohjelmistovirheissä. Avaruusluotaimen ohjelmisto on turvallisuuskriittistä, koska se valvoo ja ohjaa komponentteja, jotka saattavat aiheuttaa järjestelmän käyttäytymiseen vaarallisesti. Avaruusluotaimissa sulautettu ohjelmisto on jakaantuneena useaan eri lentotietokoneeseen. Avaruusluotaimien ohjelmiston toiminta on vuorovaikutuksessa järjestelmän eri osien välisessä tiedonsiirrossa sekä tosiaikaisessa reagoinnissa järjestelmän ja ympäristön tapahtumiin. Voyagerin ohjelmisto koostuu kaikkiaan n. 18 000 lähdekoodirivistä, Galileon yli 22 000 lähdekoodirivistä. Robyn Lutzin tutkimuksen tavoitteena on integrointi- ja järjestelmätestauksen aikana havaittujen, turvallisuuteen liittyvien ohjelmistovirheiden havaitseminen ja vähentäminen. Tutkimuksessa on vertailtu turvallisuuteen liittyvien ja eiturvallisuuteen liittyvien ohjelmistovirheiden syntymekanismeja. Tutkimuksen johtopäätöksenä on, että ongelmat toiminnallisten vaatimusten ja 1
rajapintavaatimusten tunnistamisessa ja ymmärtämisessä ovat turvallisuuteen liittyvien virheiden keskeisiä syitä. 2 Määritelmät ja luokittelun perusteet Ohjelmistovirhe määritellään poikkeamaksi ohjelmiston ulkoisesti havaittavan, mitatun tai lasketun toiminnon tai arvon ja oikean, määritetyn tai teoreettisesti oikean toiminnon tai arvon välillä. Ohjelmistovirheen vakavuusasteesta riippuen se luokitellaan vähäpätöiseksi, merkittäväksi tai katastrofaaliseksi ohjelmistovirheeksi. Merkittäviksi tai katastrofaalisiksi luokitellut ohjelmisto katsotaan turvallisuuteen vaikuttaviksi virheiksi. Robyn Lutzin ohjelmistovirheiden luokittelun perustana käytettiin Nakajon ja Kumen kehittämää luokittelujärjestelmää [NaK91], jota oli laajennettu toimimaan monimutkaisten, turvallisuuskriittisten sulautettujen ohjelmistojen kanssa, avaruusluotaimien ohjelmistot mukaan lukien. Luokittelussa on huomioitu dokumentoidut ohjelmisto, ohjelmistoryhmien tekemät ja ohjelmistoprosessin. Luokittelujärjestelmän perustana on vikapuuanalyysi, jossa tavoitteena on löytää valittuihin järjestelmävikoihin vaikuttavat syyt ja vikayhdistelmät, ihmisen toiminto huomioonottaen. Vikapuuanalyysin periaatteena on, että järjestelmäviasta lähtien etsitään sen toteutumisen mahdollistavia tekijöitä. Tekijät ja niiden välinen kytkentä esitetään graafisesti ns. vikapuun avulla. Ohjelmistovirheiden analysointimenetelmän eri vaiheet: 1. Havaintopisteiden määrittely virheen ja sen aiheuttamaan syyn välille. 2. Havaintotulosten kerääminen käyttämällä vikapuuanalyysiä jokaisen virheen analysointiin. 3. Jokaisen havaintopisteen virheiden luokittelu. 2
4. Kahden havaintopisteen välisten suhteiden tunnistaminen käyttämällä ristiinindeksointi-taulua. 5. Keskeisimpien syy-seuraus-suhteiden luominen käyttämällä apuna ristiinindeksointi-tauluja. Keskeisimmät kohdat Nakajon ja Kumen [NaK91] luokittelumenetelmässä ovat havaintopisteiden valitseminen ja havaintotulosten luokitteleminen. Havaintotuloksista pyritään löytämään ja eristämään ne syyt, jotka aiheuttavat turvallisuuteen liittyvät ohjelmisto. Virhesyiden luokittelulla pyritään löytämään vastatoimenpiteet, joiden avulla turvallisuuteen liittyvät voidaan havaita ja estää turvallisuuskriittisissä, sulautetuissa järjestelmissä. 3 Ohjelmistovirheiden luokittelu Ohjelmisto jaetaan kolmeen pääluokkaan: dokumentoidut ohjelmisto, ohjelmistoryhmien tekemät ja ohjelmistoprosessiin liittyvät (kuva 1). Kuva 1. Ohjelmistovirheiden pääluokat. 3
Yksityiskohtaisemmin luokitellaan seuraavasti: Dokumentoidut ohjelmisto a. Ohjelmiston sisäiset (esim. ohjelmointikielen syntaksi, ohjelmointikielen semantiikka) b. Rajapinta (esim. vuorovaikutus muiden järjestelmän komponenttien välillä kuten tiedon ja ohjaustietojen siirto) c. Toiminnalliset (esim. puuttuvat operaatiot, väärät ehtolauseet, järjestelmän vikakäyttäytyminen) Ohjelmistoryhmien tekemät a. Ohjelmointi- tai editointi b1. Ohjelmistoryhmän sisäiset kommunikointiongelmat b2. Ohjelmistoryhmien keskinäiset kommunikointiongelmat c1. Virheet vaatimusten tunnistamisessa c2. Virheet vaatimusten toteuttamisessa Ohjelmistoprosessiin liittyvät a. Puutteelliset ohjelmakoodin tarkastus- ja testausmenetelmät b1. Puutteelliset rajapintamäärittelyt sekä puutteellinen kommunikointi laitteistosuunnittelijoiden ja/tai ohjelmistokehittäjien välillä b2. Puutteelliset rajapintamäärittelyt sekä puutteellinen kommunikointi laitteisto- ja ohjelmistokehittäjien välillä c1. Järjestelmän vaatimukset, joita ei havaittu tai ymmärretty sekä puutteellinen dokumentointi c2. Järjestelmän vaatimukset, joita ei havaittu tai ymmärretty sekä puutteellinen suunnittelu 4
3.1 Havaittujen virheiden tarkastelu Voyager- ja Galileo-avaruusluotaimien ohjelmistoista löydettiin järjestelmä- ja integrointitestauksen aikana kaikkiaan 387 virhettä. Voyagerin ohjelmiston 87 ja Galileon ohjelmiston 122 ohjelmistovirhettä luokiteltiin turvallisuuteen vaikuttaviksi virheiksi. Kaikista havaituista ohjelmistovirheistä turvallisuuteen vaikuttavia ohjelmistovirheitä havaittiin 56 % Voyagerin ja 48 % Galileon ohjelmistoissa. [Lut93] Avaruusluotaimien ohjelmisto on luokiteltu dokumentoitujen ohjelmistovirheiden mukaisesti (taulukko 1). Taulukossa on luokiteltuna virheiden prosentuaaliset esiintymisosuudet ja virheiden lukumäärät. Taulukko 1. Dokumentoidut ohjelmisto pääluokittain. [Lut92] Dokumentoidut ohjelmisto Ohjelmiston sisäiset Kaikki havaitut Voyager (134) Galileo (253) Turvallisuuteen vaikuttavat Voyager Galileo (75) * (122) 1 % (1) 3 % (7) 0 % (0) 2 % (3) Rajapinta 34 % (46) 18 % (47) 36 % (27) 19 % (23) Toiminnalliset 65 % (87) 79 % (199) 64 % (48) 79 % (96) Muutamia ohjelmiston sisäisiä virheitä, kuten ohjelmistomoduulin ohjelmointivirheitä, havaittiin integrointi- ja järjestelmätestauksen aikana. Suurin osa ohjelmointivirheistä oli kuitenkin havaittu ja korjattu ennen järjestelmätestausta. * Voyagerin ohjelmistovirheiden lukumäärät eroavat Lutzin artikkeleissa. 5
Ohjelman toiminnalliset ovat kaikkein yleisimpiä dokumentoiduista ohjelmistovirheistä. Toiminnallisia virheitä ovat, jotka eivät toteuta järjestelmän toiminnallisia vaatimuksia, esim. järjestelmä toimii väärin tai järjestelmä ei toimi kaikilla syötteillä tai ehdoilla oikein. Turvallisuuteen vaikuttavien toiminnallisten virheiden suhde kaikkiin toiminnallisiin virheisiin on samanlainen. Toiminnallisista virheistä yleisimpiä ovat ohjelmiston käyttäytymis, joita esiintyy molempien avaruusluotaimien ohjelmistoissa noin puolet kaikista toiminnallisista virheistä (taulukko 2). Ohjelmistojen ehdolliset ovat pääsääntöisesti turvallisuuteen vaikuttavia virheitä. Ehdollisia virheitä ovat miltei säännöllisesti virheelliset arvot ehtolausekkeissa tai ehtolausekkeiden arvoissa. Virheellisiin ehtolausekkeiden arvoihin (esim. viiveajat) liittyy usein väärän virhetoipumismenetelmän käynnistäminen tai oikean palautteen käynnistämisen epäonnistuminen. Taulukko 2. Ohjelmistojen toiminnalliset luokittain. [Lut92] Kaikki havaitut Turvallisuuteen vaikuttavat Toiminnalliset Voyager (87) Galileo (199) Voyager (48) Galileo (96) Käyttö 22 % (19) 43 % (85) 19 % (9) 44 % (42) Ehdolliset 26 % (23) 10 % (21) 31 % (15) 18 % (17) Käyttäytymis 52 % (45) 47 % (93) 50 % (24) 38 % (37) Ohjelmistoryhmien keskinäiset kommunikointiongelmat ovat yleisin syy rajapintavirheisiin (taulukko 3). Avaruusluotaimen ohjelmistoa kehittää usea ohjelmistoryhmä yhteistyössä ja ohjelmiston kehitystyö vie aikaa vuosia. Järjestelmän osajärjestelmien yhteensovittaminen ja eri osajärjestelmien vaatimusten tunnistaminen ja toteuttaminen on vaikeaa. 6
Taulukko 3. Rajapintavirheitä aiheuttavat ohjelmistoryhmien tekemät. [Lut92] Ohjelmistoryhmien tekemät Ryhmän sisäiset kommunikointi-ongelmat Ohjelmistoryhmien keskinäiset kommunikointiongelmat Väärinymmärretyt ohjelmiston rajapintamäärittelyt Kaikki rajapinta Turvallisuuteen vaikuttavat Voyager Galileo Voyager Galileo (46) (47) (27) (23) 7 % (3) 28 % (13) 7 % (2) 22 % (5) 50 % (23) 42 % (20) 67 % (18) 48 % (11) 43 % (20) 30 % (14) 26 % (7) 30 % (7) Toiminnallisia virheitä aiheuttavat eniten ongelmat järjestelmän vaatimusten tunnistamisessa (taulukko 4). Näitä havaittiin 62 % Voyagerin ohjelmistossa ja 79 % Galileon ohjelmistossa. Tähän vaikuttaa avaruusluotaimen ohjelmiston monimukaisuus, laajuus ja järjestelmän käyttäytymisen ennakoimisen vaikeus. Yleisesti järjestelmän vaatimusten tunnistaminen ja vaatimusten toteuttaminen ohjelmistoon ovat keskeisiä virhesyitä avaruusluotaimien ohjelmistoissa. 7
Taulukko 4. Toiminnallisia virheitä aiheuttavat ohjelmistoryhmien tekemät. [Lut92] Toiminnalliset Turvallisuuteen vaikuttavat toiminnalliset Ohjelmistoryhmien tekemät Voyager (87) Galileo (199) Voyager (48) Galileo (96) Vaatimusten tunnistaminen Toiminta 9 % (8) 24 % (49) 8 % (4) 34 % (33) Virheet ehdoissa 17 % (15) 8 % (16) 25 % (12) 16 % (15) Käyttäytymis 21 % (18) 30 % (59) 29 % (14) 29 % (28) Yhteensä 47 % (41) 62 % (124) 62 % (30) 79 % (76) Vaatimusten toteuttaminen Toiminta 13 % (11) 18 % (36) 11 % (5) 9 % (9) Virheet ehdoissa 9 % (8) 3 % (5) 6 % (3) 2 % (2) Käyttäytymis 31 % (27) 17 % (34) 21 % (10) 9 % (9) Yhteensä 53 % (46) 38 % (75) 38 % (18) 21 % (20) Ohjelmistoprosessiin liittyvistä virheistä, jotka aiheuttavat rajapintavirheitä, yleisimpiä ovat rajapintojen tunnistamisongelmat (taulukko 5). Tässä ongelman aikaansaa se, että järjestelmän rajapintamäärittelyn kommunikointi ohjelmistoryhmien välillä on puutteellista. 8
Taulukko 5. Rajapintavirheitä aiheuttavat ohjelmistoprosessiin liittyvät. [Lut92] Rajapinta Turvallisuuteen vaikuttavat rajapinta Ohjelmistoprosessiin liittyvät Voyager (46) Galileo (47) Voyager (27) Galileo (23) Rajapintoja ei ymmärretty 70 % (33) 85 % (40) 56 % (15) 87 % (20) tai tunnistettu oi- kein Laitteisto toimii väärin 30 % (14) 15 % (7) 44 % (12) 13% (3) Järjestelmän vaatimusten tunnistaminen on merkittävin syy ohjelmistoprosessiin liittyen, joka aiheuttaa järjestelmän toiminnallisia virheitä (taulukko 6). Puutteelliset, ei-havaitut vaatimukset ovat syynä noin puoleen kaikista turvallisuuteen liittyvistä toiminnallisista virheistä, jotka liittyvät järjestelmän vaatimusten tunnistamiseen. Taulukko 6. Toiminnallisia virheitä aiheuttavat ohjelmistoprosessiin liittyvät. [Lut92] Ohjelmistoprosessiin liittyvät Vaatimuksia ei tunnistettu oikein Vaatimuksia ei ymmärretty oikein Toiminnalliset Turvallisuuteen vaikuttavat toiminnalliset Voyager Galileo Voyager Galileo (87) (199) (48) (96) 37 % (32) 53 % (105) 44 % (21) 60 % (58) 63 % (55) 47 % (94) 56 % (27) 40 % (38) 9
3.2 Vertailu aikaisempiin tutkimuksiin Aikaisemmat tutkimukset käsittelivät verrattain yksinkertaisia, ei-sulautettuja järjestelmiä. Näissä tutkimuksissa ohjelmistovirheitä ei eroteltu turvallisuuteen ja ei-turvallisuuteen vaikuttaviksi. Aikaisemmissa tutkimuksissa oletettiin myös, että vaatimusmäärittely on oikein. Monissa laajoissa, monimutkaisissa järjestelmissä, kuten avaruusluotaimissa, järjestelmän vaatimukset ovat riippuvaisia ohjelmiston käyttäytymisestä ja suoritusympäristöstä. Vaatimusmäärittelyä joudutaan tarkentamaan koko ohjelmistokehityksen ajan sekä vielä testausvaiheessa, koska järjestelmän käyttäytymisen ennakointi on vaikeaa. 4 Yhteenveto Turvallisuuteen liittyvät ohjelmisto syntyvät eri tavoin kuin eiturvallisuuteen liittyvät ohjelmisto. Järjestelmän turvallisuuteen monimutkaisissa, sulautetuissa järjestelmissä voidaan vaikuttaa keskittymällä erityisesti turvallisuuteen liittyvien virheiden syntymekanismeihin. Laajoissa, sulautetuissa ohjelmistojärjestelmissä, kuten avaruusluotaimien ohjelmistoissa järjestelmän vaatimukset muuttuvat koko ohjelmistokehityksen ajan ja jopa järjestelmätestauksen aikana. Tämä johtuu pääosin järjestelmän ennakoimattomasta toiminnasta, dynaamisista muutoksista järjestelmän käyttöympäristössä sekä monimutkaisista, ohjelmiston keskinäisten komponenttien ja laitteiston sekä ohjelmiston välisistä vuorovaikutuksista. Vaatimusmäärittelyllä on siten keskeinen osuus kehitettäessä turvallisuuskriittisiä, sulautettuja järjestelmiä. Ohjelmiston rajapintasuunnittelu on myös tärkeässä osassa turvallisuuskriittisen järjestelmän suunnittelussa. Ohjelmiston komponenttien väliset vuorovaikutukset voivat olla monimutkaisia ja vaikeasti ennakoitavia. Ohjelmiston kehitystyössä ohjelmistoryhmien väliseen kommunikointiin on kiinnitettävä erityistä huomiota. 10
Artikkeli oli selkeä ja keskittyi tärkeään aihealueeseen. Virheiden luokittelujärjestelmä vaikuttaa järkevältä ja oikealta. Virheiden lajittelu eri luokkiin ei välttämättä ole yksikäsitteistä. Artikkelissa olisi voinut enemmän korostaa tätä seikkaa. Artikkelin tulokset ja johtopäätökset vaikuttavat järkeviltä. Artikkelissa olisi kiinnostanut tietää tarkemmin ohjelmistovirheiden yksityiskohdat sekä minkälaisia mahdollisia virhe- ja vaaratilanteita näistä virheistä olisi voinut syntyä? Mahdollisesti edellä mainitut asiat ovat salassapidettäviä tietoja. Lisäksi kaipasin konkreettisia esimerkkejä vikapuun ja ristiinindeksointitaulun käytöstä avaruusluotaimien ohjelmistovirheiden analysoinnissa. Lähteet Lut92 Lutz, R. R, Analyzing Software Requirements Errors in Safety-Critical, Embedded Systems. Technical Raport 92-27, elokuu 1992. Lut93 Lutz, R. R, Analyzing Software Requirements Errors in Safety-Critical, Embedded Systems. Proceedings of the IEEE International Symposium on Requirements Engineering. IEEE Computer Society Press, tammikuu 1993, sivut 126-133. NaK91 Nakajo, T.ja Kume, H., A Case History Analysis of Software Error Cause-Effect Relationships. IEEE Transactions on Software Engineering, 17, 17 (1991), nro 17, sivut 830-838. 11