- COMP.SEC.100
- 16. Ohjelmistoturvallisuus
- 16.3 Vaikutusten vähentäminen (syventävä)
Vaikutusten vähentäminen (syventävä)¶
Vaikka ohjelma olisi kuinka hyvin tehty, siihen voi silti jäädä virheitä. Siksi on tärkeää rakentaa lisäkerroksia puolustukseen. Tämä voi tapahtua mm. ympäröivän ohjelmiston, laitteiston, käyttöjärjestelmän, kääntäjän tai vaikka virtuaalikoneen avulla. On siis tärkeää miettiä ohjelmaa sen käyttöympäristössä ja rakentaa suojausta myös ohjelman ympärille.
Ajonaikainen tunnistus (syventävä)¶
Ajonaikainen tunnistus on ainakin periaatteessa tehokasta, koska virheet havaitaan ja voidaan jopa estää ennen kuin vahinkoa aiheutuu. Tämä tosin tapahtuu tyypillisesti keskeyttämällä ohjelman suoritus. Ajonaikainen tunnistus voi esimerkiksi tarkkailla muistialueita ja estää virheellisiä muistiviittauksia, tarkkailla käyttöjärjestelmän muistialueita tai tarkkailla tietovirtojen sääntöjenmukaista käyttöä. Testauksen aikana suorituskyky ei yleensä muodostu ongelmaksi, jolloin virheitä on tehokasta löytää. Suoritusaikainen tunnistus joudutaan tehokkuussyistä tekemään heikommaksi.
Automatisoitu hajauttaminen (syventävä)¶
Haavoittuvuuksien hyväksikäyttö edellyttää tapauskohtaisen toteutuksen tai suoritusympäristön tuntemista. Esimerkiksi muistinhallinnan haavoittuvuuksien hyväksikäyttö edellyttää käyttöympäristön tuntemista ja SQL-injektion hyväksikäyttö edellyttää tietokannan yksityiskohtien tuntemista. Yksi tapa suojautua onkin hajaannuttaa toteutuskohtaisia yksityiskohtia. Näin yksi hyökkäys ei toimi laajasti kaikkia järjestelmiä vastaan. Lisäksi hyökkääjän tekemä testaus myös vaikeutuu. Jos hajautus on toteutettu hyvin, toteutettu hyökkäys ei todennäköisesti toimikaan kohdejärjestelmässä. Esimerkkinä automaattisesta hajauttamisesta on muistiavaruuden satunnaistaminen (Address Space Layout Randomization, ASLR). Näin muistirakenteet eivät löydy kiinteistä osoitteista.
Oikeuksien rajoittaminen (syventävä)¶
Yksi tärkeä keino vähentää haavoittuvan ohjelman vaikutuksia on vähentää sen mahdollisuuksia aiheuttaa vahinkoa. Tämä tapahtuu käytännössä käyttöoikeuksien rajoittamisella tavalla tai toisella.
Yksi keino rajoittaa ohjelman suoritusta on laittaa se ns. hiekkalaatikkoon (sandbox). Hiekkalaatikossa ohjelman suoritus eristetään omaan tilaansa, jolloin mahdollinen haavoittuvuus tai virhetilanne ei aiheuta hiekkalaatikon ulkopuolelle ongelmia. Tästä poikkeuksena ovat haavoittuvuudet itse hiekkalaatikossa, kuten Javan virtuaalikoneessa olevat haavoittuvuudet. Hiekkalaatikon voi luoda monin eri tavoin, kuten virtuaalikoneella, ohjelmallisella erottamisella ja prosessien hallinnalla.
Myös osittamisella (compartmentalization, myös: osastointi) ohjelman oikeuksia voidaan rajoittaa. Tällöin ohjelma jaetaan osiin ja eri osien välisiä oikeuksia rajoitetaan. Tyypillisiä esimerkkejä ovat käyttöjärjestelmän ja tietokantaohjelman asettamat käyttöoikeudet.
Ohjelmiston eheystarkistukset (syventävä)¶
Ohjelman tai sen käyttämän datan eheys voidaan havaita tarkistussummilla tai tiivisteillä. Parhaassa tapauksessa tarkistukset tehdään niin, että hyökkääjä ei voi niihin vaikuttaa. Näin on tarkoitus esim. Trusted computing -toteutuksessa (katso tarkemmin käyttöjärjestelmien yhteydessä).
Yhteenveto haavoittuvuuksista (syventävä)¶
Oheiseen taulukkoon on koottu eri haavoittuvuuksien luokat sekä niille tyypillinen estäminen, tunnistaminen ja vaikutusten vähentäminen.
Haavoittuvuuksien luokitus | Estäminen | Tunnistus | Vaikutusten vähentäminen |
---|---|---|---|
Muistinhallinnan haavoittuvuudet | Ohjelmointikielen valinta, ohjelmointisäännöt | Staattinen ja dynaaminen tunnistus | Muistin suojaus esim. käyttöjärjestämätasolla, hiekkalaatikot |
Syötteen muodostuksen haavoittuvuudet | Ohjelmointisäännöt | Tahra-analyysi | Ajonaikainen tunnistus |
Kilpatilanteen haavoittuvuudet | Ohjelmointisäännöt, rinnakkaisuuden säännöt, oikeuksien asettaminen prosesseille | hiekkalaatikko | |
Ohjelmointirajapintojen haavoittuvuudet | Ohjelmointirajapintojen turvallisuuden tarkistaminen, ohjelmakirjastojen ajantasaisuus | Staattinen analyysi | Lokerointi |
Sivukanavahaavoittuvuudet | Ohjelmointisäännöt | Staattinen analyysi | Eristäminen |
Lisäksi on hyvä muistaa, että testaus on tärkeä osa haavoittuvuuksien tunnistamista.