Miksi virheettömän ohjelmiston kehittäminen on niin vaikeaa?

”Hello World!” Siitä se ohjelmointiura alkaa lähes kaikilla kehittäjillä. Siis sovelluksesta, joka tulostaa kyseisen tekstin käytettävissä olevaan näyttöön. Tämä ensimmäinen sovellus on yleensä kohtuullisen tietoturvallinen, vaikka harva kehittäjä siinä vaiheessa juuri mitään tietoturvallisesta ohjelmistokehityksestä ymmärtääkään. Tietoturvallisuus johtuu siitä, että lähdekoodi on yleensä hyvin yksinkertaista, eikä sovelluksessa ole juuri minkäänlaista logiikkaa tai syötteitä.

Yleensä ensimmäiset tietoturvaongelmat tulevat ohjelmistoihin käyttäjän antamien syötteiden tai verkon kautta välitettävien tietojen käsittelyssä. Oman ohjelmointiurani ensimmäinen (löydetty) haavoittuvuus oli juuri tällainen. Yliopistolla harjoitustyönä tehty sovellus kyseli numeroarvoja, mutta kun harjoitustyön vastaanottaja antoikin syötteeksi kirjaimia, koko ohjelma sekosi. Tässä kohtaa kolaus oli suurempi lähinnä omalle itsetunnolle, mutta jos vastaavia vikoja on tuotannossa olevissa järjestelmissä, vahingot voivat olla jo huomattavasti merkittävämpiä.

Konsulttimme Juhana Suurnäkki on nostanut usein esiin kognitiivisen vinouman käsitteen puhuessaan tietoturvallisuudesta. Kuten minullakin ensimmäisen harjoitustyöni kanssa, kehittäjillä on usein taipumus ajatella järjestelmien käyttäjistä positiivisesti. Niinpä, kuka nyt haluaisi numeroarvoa pyydettäessä kirjoittaa tekstiä. Kognitiivinen vinouma tarjoaa myös muita selityksiä ohjelmistojen haavoittuvuuksille, kuten ihmisten taipumus sivuuttaa yksityiskohtia yleistämisen vuoksi tai huomion kiinnittäminen yksityiskohtiin, jotka vahvistavat omia uskomuksiamme.

Kehittäjien ajattelusta johtuvien virheiden lisäksi haavoittuvuudet voivat johtua myös määrittelyiden ongelmista. Esimerkiksi verkkoliikenteen salauksessa käytettävän SSL/TLS-protokollan standardia pidetään yleisesti hyvin monimutkaisena, minkä takia protokollan toteutuksista löytyy kohtuullisen usein haavoittuvuuksia. Lisäksi tietojärjestelmät ovat koko ajan laajempia ja monimutkaisempia, jolloin virheiden mahdollisuuksia on myös enemmän. Luonnollisesti myös kehittämiseen käytettävissä olevat resurssit, erityisesti aika, vaikuttavat siihen, kuinka paljon ohjelmistoihin jää haavoittuvuuksia aiheuttavia virheitä.

Harjoitustyöni ajoista ohjelmistokehitystyökalut ovat ottaneet jo aimo harppauksen eteenpäin ja ne opastavat kehittäjää oikeaan suuntaan. Myös syötteiden tarkastukseen löytyy valmiita kirjastoja, jotka säästävät aikaa ja auttavat toteuttamaan turvallisempia ohjelmistoja. Ohjelmien lähdekoodia on mahdollista analysoida erilaisilla työkaluilla, jolloin tyypillisiä virheitä saadaan kiinni jo kehitysaikana.

Tietoturvallisen ohjelmistokehityksen blogisarjan seuraavassa ja viimeisessä osassa käymme läpi ohjelmistojen testaamista ja käyttöönottoa tietoturvallisuuden näkökulmasta.