Yksi viime vuoden merkittävistä tietoturvauutisista oli Windows-alustan turvaton DLL-kirjastojen lataus -haavoittuvuuden (DLL Hijacking vulnerability) julkaisu. Microsoft ilmoitti viime viikolla, että tammikuun päivitysjulkaisun myötä kaikki tunnetut DLL Hijacking -haavoittuvuudet Microsoftin omissa ohjelmissa on nyt paikattu.
Kyse on oikeastaan pikemminkin uudesta haavoittuvuusluokasta kuin yksittäisistä haavoittuvuuksista. Aivan kuten 15 vuotta sitten tietoturva-asiantuntijat koostivat kuumeisesti listoja C-ohjelmointikielen funktioista, jotka eivät tarkistaneet vastaanottamaansa syötettä ja näin altistuivat puskurin ylivuotovirheille, nyt on korkea aika alkaa koostaa listoja eri Windows-funktioiden tavoista ladata erillisiä ohjelmistokirjastoja ja ohjelmatiedostoja sovellusten käyttöön.
Windows-alustallahan sovellukset koostuvat nykyään lukuisista erillisistä ohjelmistokirjastoista, jotka yhdessä tuottavat ohjelman toiminnallisuuden. Näistä kirjastoista käytetään nimeä Dynamic Link Library eli DLL. Nämä dynaamiset ohjelmistokirjastot mahdollistavat ohjelmakoodin vaivattoman kierrätyksen ja sallivat ohjelmoijien käyttää joko käyttöjärjestelmän tai muiden sovelluskehittäjien luomaa ohjelmakoodia suorittamaan tarvitsemiaan toimintoja.
Jokainen käyttöjärjestelmäalusta määrittelee erikseen rutiinit tällaisten erillisten, uudelleenkäytettävien ohjelmistokirjastojen käytölle. Windows tarjoaa lukuisia funktioita erillisten kirjastojen lataukselle sovellusten tueksi. Yleisesti ottaen sovellukset voivat ladata kirjastoja käyttöönsä kahdella tavalla:
-
joko määrittelemällä tarkan tiedostopolun, josta kirjasto löytyy (esimerkiksi C:\Windows\System32\esimerkki.dll)
-
tai määrittelemällä pelkän kirjaston nimen (esimerkiksi LoadLibrary(esimerkki.dll)), jolloin käyttöjärjestelmä lataa kirjaston etsimällä sitä tietyistä hakemistoista tietyssä järjestyksessä.
Nimenomaan jälkimmäinen tapaus mahdollistaa turvaton DLL-kirjastojen lataus -haavoittuvuuden hyväksikäytön. Jos olet törmännyt viime syksystä lähtien termeihin DLL Hijacking tai Insecure Library Loading on kyseessä juuri samainen haavoittuvuus. Kaivaudutaanpa hieman syvemmälle.
Ja kuinka kirjastotiedoston haku sitten toimii
Käytetään esimerkkinä Windowsin CreateProcess-funktioita. Mikäli sovellus lataa erillisen ohjelmistokirjaston määrittelemällä pelkästään kirjaston nimen CreateProcess-funktiota käyttäen, Windows etsii kirjastoa seuraavista hakemistoista seuraavassa järjestyksessä:
- Hakemisto, josta kutsuva sovellus käynnistettiin
- Senhetkinen työhakemisto
- 32-bittinen Windows System -hakemisto (Windows\System32)
- 16-bittinen Windows System -hakemisto (Windows\System)
- Windows-hakemisto
- PATH-muuttujassa määritellyt hakemistot
Kuvitellaan, että sovellus lataa kirjaston, jonka oikea versio on esimerkiksi Windows-hakemistossa. Mikäli hyökkääjä kopioi kirjastosta haitallisen, mutta samannimisen version esimerkiksi senhetkiseen työhakemistoon, Windows lataa haitallisen version kirjastosta sovelluksen käyttöön sitä sen kummemmin tarkistamatta. Tilannetta pahentaa se, että kulloinenkin työhakemisto voi olla myös verkkolevyllä tai esimerkiksi pakattu hakemisto, joka avataan kohdekoneessa. Ja pahentunutta tilannetta pahentaa edelleen se, että suurin osa ylläolevasta pätee sellaisenaan myös erillisiin EXE-tiedostoihin, joita sovellukset mahdollisesti lataa ajon aikana käyttöönsä.
Kirjasto täytyy saada vielä ajettua – onnistuu
Yksi konkreettinen hyökkäys voisi olla seuraavanlainen. Hyökkääjä tietää kohteensa käyttävän Windows Vista -käyttöjärjestelmää ja tietää, että koneelle on asennettu haavoittuvuuden sisältävä Microsoft PowerPoint 2007. Hyökkääjä lähettää kohteelle linkin paikalliselle verkkolevylle, johon hän on tallentanut kohdekäyttäjää kiinnostavan PowerPoint-esityksen nimeltään XXX.ppt ja haitallisen kirjaston nimeltä rpawinet.dll. Kohteen avatessa tiedoston XXX.ppt, PowerPoint 2007 lataa kirjaston nimeltä rpawinet.dll ja alkaa etsimään sitä tiedostojärjestelmästä. Kyseistä kirjastoa ei löydy Windows Vista -käyttöjärjestelmän systeemihakemistoista, joten käyttöjärjestelmä jatkaa etsintää, kunnes se löytää hyökkääjän tallentaman haitallisen version kirjastosta senhetkisestä työhakemistosta (paikallinen verkkolevy) ja suorittaa sen luottaen sen oikeellisuuteen.
Vastaavanlaisia hyökkäyksiä on kirjaimellisesti satoja erilaisia. Haitallinen kirjasto voidaan lähettää käyttäjälle myös pakattuna samaan ZIP-hakemistoon useiden kohdetta kiinnostavien kuvatiedostojen kanssa tai se voidaan siirtää käyttäjän koneelle musiikkia sisältävän torrent-tiedoston mukana. Huomaa, että yllä kuvailtu hyökkäys ei enää toimi täysin päivitetyssä PowerPoint 2007 -sovelluksessa, mutta haavoittuvuuden sisältäviä ohjelmia on yhä satoja ja (julkisesti) testaamattomia ohjelmia on vielä enemmän. Suurin osa isoista ohjelmistotaloista on syksyn aikana paikannut omat ohjelmansa. Exploit Database ylläpitää listaa haavoittuvuuden sisältävistä sovelluksista, josta voi myös tarkistaa päivitystilanteen.
Kirjoituksen jatko-osa keskittyy sovelluskehittäjille suunnattuihin ohjeisiin, joilla haavoittuvuus voidaan estää.