Nykyisin ohjelmistot ja verkkosovellukset ovat jatkuvasti kasvavien haasteiden edessä turvallisuusuhkien ja haavoittuvuuksien suhteen. Koneoppimisen ja verkkoanalyysin yhdistäminen tarjoaa tehokkaita lähestymistapoja, jotka voivat merkittävästi parantaa ohjelmistojen turvallisuutta ja auttaa tunnistamaan haavoittuvuuksia aikaisessa vaiheessa. Tällaiset tekniikat voivat auttaa ymmärtämään järjestelmän monimutkaisempia rakenteita ja vuorovaikutuksia sekä ennakoimaan, kuinka eri komponentit voivat reagointia uhkiin.

Yksi keskeinen lähestymistapa on ohjelmistokoodin ja sen komponenttien verkkoanalyysi. Ohjelmistojen kehityksessä on usein tärkeää analysoida koodin rakenteita ja sen vuorovaikutusta muiden järjestelmän osien kanssa. Tällöin voidaan havaita, kuinka koodin osat ovat yhteydessä toisiinsa ja kuinka muutokset yhdessä osassa voivat vaikuttaa järjestelmän kokonaisturvallisuuteen. Mark Stampin (2017) esittelemä "Introduction to Machine Learning with Applications in Information Security" tarjoaa käytännönläheisiä esimerkkejä siitä, kuinka koneoppimisen tekniikoita voidaan hyödyntää haavoittuvuuksien ennustamisessa ja riskianalyysissä.

Samalla tavalla verkkoanalyysi, kuten MITRE:n Common Weakness Enumeration (CWE) ja muiden verkkoanalyysityökalujen käyttö, voivat auttaa tunnistamaan ohjelmiston osia, jotka ovat erityisen alttiita hyökkäyksille. Tämä analyysi saattaa sisältää niin kutsutut "degree correlations", joissa tarkastellaan ohjelmistokomponenttien yhdyskäytäviä ja niiden roolia mahdollisten hyökkäysten kulkureitteinä. P. Mahadevanin ja muiden (2007) työ Orbis-verkkoanalyysityökalusta esittelee, kuinka tämänkaltaiset menetelmät voivat skaalata verkkoanalyysiä ja auttaa ymmärtämään paremmin, miten tiettyjen komponenttien haavoittuvuudet voivat levitä laajemmalle järjestelmässä.

Koneoppimisen ja verkkoanalyysin integroiminen on kuitenkin monivaiheinen prosessi, joka vaatii syvällistä ymmärrystä ohjelmistojen rakenteista ja käyttäytymisestä. Esimerkiksi ohjelmistojen osien suhteiden ja riippuvuuksien analysointi voi auttaa tunnistamaan niin sanottuja "crucial" komponentteja, joiden mahdolliset haavoittuvuudet voivat vaikuttaa koko järjestelmän turvallisuuteen. Tämäntyyppinen analyysi perustuu usein tilastollisiin malleihin ja graafiteoriaan, jossa ohjelmistokomponentit esitetään solmuina ja niiden väliset suhteet kaarina.

Tällaisissa analyyseissä koneoppimisen mallit, kuten rekursiiviset hermoverkot (RNN) ja syväoppimismenetelmät, voivat auttaa ennustamaan, mitkä osat ohjelmistosta ovat alttiimpia hyökkäyksille tai virheille. Esimerkiksi T. Mikolovin ja hänen kollegojensa (2013) työ, joka käsittelee sanojen jakamista vektoritilassa ja niiden suhteiden mallintamista, voi soveltua myös ohjelmistokoodin ja sen elementtien analysointiin. Tämäntyyppinen malli voi analysoida koodinpätkiä ja niiden kontekstuaalisia suhteita toisiinsa nähden, mikä tekee mahdolliseksi haavoittuvuuksien ennustamisen aiempaa tarkemmin.

On kuitenkin tärkeää ymmärtää, että koneoppiminen ei ole kaikkivoipa ratkaisu. Vaikka se voi auttaa tunnistamaan haavoittuvuuksia ja ennustamaan ongelmia, sen ei tulisi korvata asiantuntevaa turvallisuusanalyysiä ja -testausta. Koneoppimismallit voivat antaa arvokkaita vihjeitä, mutta ne tarvitsevat asiantuntijoiden ohjausta ja tulkintaa, jotta tulokset ovat luotettavia ja toimivia käytännön tilanteissa. Tässä yhteydessä on tärkeää huomioida myös, että mallien ja algoritmien tarkkuus paranee, kun käytetään oikeaa ja laajaa koulutusdataa, joka kattaa mahdollisimman monenlaista ohjelmistoturvallisuuden haavoittuvuutta.

Kun tarkastellaan ohjelmistojen turvallisuutta ja haavoittuvuuksien ennustamista koneoppimisen ja verkkoanalyysin avulla, on tärkeää ymmärtää myös jatkuvan kehityksen ja muutoksen merkitys. Ohjelmistot kehittyvät nopeasti, ja uudet haavoittuvuudet voivat ilmetä milloin tahansa. Tämän vuoksi on olennaista, että ohjelmistotestaukseen ja turvallisuusanalyyseihin panostetaan säännöllisesti ja että niitä päivitetään uusimpien uhkien mukaisesti. Koneoppimisen avulla voidaan jatkuvasti parantaa mallien tarkkuutta ja sopeutuvuutta uusien turvallisuusuhkien tunnistamiseen, mutta tämä edellyttää jatkuvaa valvontaa ja huolellista suunnittelua.

Lopuksi on huomioitava, että vaikka koneoppiminen tarjoaa merkittäviä etuja haavoittuvuuksien ennustamisessa, se ei voi yksinään ratkaista kaikkia ohjelmistoturvallisuuteen liittyviä ongelmia. Ihmisen asiantuntemus on edelleen ratkaisevassa roolissa, ja koneoppimismallien tulokset tulee aina tarkistaa ja täydentää asiantuntijoiden arvioilla ja testeillä.

Aikaperusteinen mallinnus ja aikakehityksen vaikutus haavoittuvuuksien arviointiin

Aikaperusteinen muutos on tärkeä tekijä haavoittuvuuksien arvioinnissa ja mallintamisessa, erityisesti silloin, kun tietoja käsitellään pitkällä aikavälillä. Tämän tutkimuksen mukaan haavoittuvuuksien arviointimallit eivät voi luotettavasti ennustaa tulevaisuuden haavoittuvuuksia, jos aikarajausta ei oteta huomioon. Aikaperusteinen jako vähentää mahdollisuuksia, että nykyiset mallit oppivat tulevaisuudessa tapahtuvat muutokset, mikä puolestaan voi johtaa virheellisiin arvioihin ja epäluotettaviin päätelmiin. Tätä ongelmaa varten on ehdotettu sanan ja merkin tasoista mallia, joka ottaa huomioon aikamuutokset ja driftin vaikutukset.

National Vulnerability Database (NVD) on luotettava lähde haavoittuvuuksien (SV) tietojen tallentamiseen, koska viranomaiset ylläpitävät tätä tietokantaa. NVD on myös validoitu standardoiduilla arviointikehyksillä, kuten Common Vulnerability Scoring System (CVSS), jossa haavoittuvuuksien vakavuus, vaikutukset ja hyödynnettävyyden mahdollisuus ovat keskeisiä tekijöitä. Nämä tekijät jakautuvat kolmeen eri tasoon, joilla arvioidaan muun muassa luottamuksellisuus, saatavuus ja eheys. Tämä tekee haavoittuvuuksien arvioinnista monivaiheisen luokitteluprosessin, joka tuo haasteita koneoppimismalleille.

Käytettyjen attribuuttien, kuten tunnistautuminen, pääsyvektorit ja pääsyn monimutkaisuus, luokkasuhteet voivat olla epätasapainossa, koska tietoa on puutteellisesti verrattuna muihin luokkiin. Haavoittuvuuksien eri luokittelijat voidaan luoda käyttämällä monivaiheista NLP-mallintamista, jossa otetaan huomioon sanan ja merkin tason yhdistelmä. Tämä mahdollistaa parempien mallien luomisen, jotka voivat käsitellä haavoittuvuuksien luonteen muuttuvan ajan myötä. Kuvassa 2.8 esitetään, kuinka luokkien frekvenssit visualisoidaan, ja kuvassa 2.9 kuvataan ehdotetun mallin tyypillinen työnkulku.

Mallin kehittäminen alkaa tiedon esikäsittelyllä, jossa poistetaan pysäytyssanat, huomiota kiinnitetään välimerkkien poistamiseen ja tekstiä käsitellään tietyllä tavalla NLP-kontekstissa. Esikäsittelyyn kuuluu myös stemming, joka tuo sanojen juurimuodot esiin, kuten "kalastaminen" ja "kalastaa", jotka muuntuvat muotoon "kalastus". Tämä mahdollistaa sen, että algoritmi voi analysoida sanan perusmuotoa ja ymmärtää sen yhteyksiä. Lemmatisaatio on toinen mahdollinen lähestymistapa, joka voi säilyttää sanan merkityksen ja kontekstin ympärillä.

Aikaperusteinen k-fold -ristivarmennus on tärkeä vaihe mallin valinnassa ja NLP-representaation optimoinnissa. Tietoputki järjestetään aikarajoitetusti, jotta aikarajoitettua tietoa ei pääse vuotamaan koulutusjoukkoon, mikä estää käsitteiden siirtymistä menneisyyteen. Aikaperusteinen jako mahdollistaa sen, että seuraavassa vaiheessa on uudet, kehittyneet piirteet, jotka kuvaavat haavoittuvuuksien uusia ominaisuuksia. Kunkin luonteenpiirteen osalta voidaan kokeilla eri yhdistelmiä sanan n-grammeista ja tf-idf (term frequency, inverse document frequency) -ominaisuuksista, jotta saadaan aikaan optimaaliset ominaisuusjakaumat. Tämän jälkeen suoritetaan validointi eri luokittimilla ja arviointimittareilla, jolloin valitaan paras malli kullekin haavoittuvuuden piirteelle.

Ominaisuuksien aggregaattori yhdistää sanan ja merkin tason n-grammit mallin rakentamiseksi. Erilaisia sanan ja merkin tasoja hyödyntäviä NLP-representaatioita käytetään mahdollisten haavoittuvuuksien tunnistamiseksi ja ennustamiseksi. Ominaisuusjakaumat, kuten n-grammit ja tf-idf, tuodaan yhteen ja yhdistetään siten, että lopullinen malli voidaan luoda ja validoida tehokkaasti. Tämä prosessi varmistaa sen, että malli ei ylikouluta vaan pystyy yleistävän oppimista, jotta se voi käsitellä myös tulevia sanastoja.

Lopuksi, aikaperusteinen lähestymistapa voi parantaa haavoittuvuuksien arviointimallien tarkkuutta ja ennustettavuutta. Aikamuutosten huomioon ottaminen tekee mallista joustavamman ja vähemmän altis virheille, jotka liittyvät epäluotettaviin, aikarajoitettuisiin tietoihin. Lisäksi se tarjoaa mahdollisuuden hallita käsitteiden siirtymistä (concept drift), joka on keskeinen ongelma pitkäaikaisissa malleissa. Samalla varmistetaan, että malli voi tehokkaasti käsitellä out-of-vocabulary (OOV) -termejä, jotka voivat ilmetä uusien haavoittuvuuksien kehittyessä.

Miten markovilaiset prosessit ja aikaperusteiset mallit ennustavat haavoittuvuuksien hyödyntämistä ja riskitekijöitä?

Markovilaisia prosesseja hyödynnetään usein haavoittuvuuksien hyödyntämismahdollisuuksien ennustamiseen. Tällöin prosessi laskee siirtymien todennäköisyyksiä eri tilojen välillä, mutta tämä laskenta on laskennallisesti vaativaa. Tämän vuoksi optimoinnin saavuttamiseksi on siirryttävä ei-lineaarisiin malleihin, jotka pystyvät paremmin mallintamaan riskin ja haavoittuvuuksien kehittymistä ajan myötä. Haavoittuvuuksien julkaisemisen ajankohta, CVSS-pisteet, haavoittuvuuksien ikä, sekä riskitekijät auttavat meitä arvioimaan hyödyntämismahdollisuuksia tietyllä hetkellä. Tämä tieto luo perustan riskien arviointiin ja ennustamiseen.

Riskitekijän aikakehitystä kuvaavassa kaaviossa (kuva 2.14) näkyy, että riskin nousu on aluksi jyrkkää heti haavoittuvuuden julkaisun jälkeen. Tämän jälkeen riskin kasvu tasaantuu, mikä johtuu tutkimuksen määrittelemästä mallista, jossa ei ole otettu huomioon mahdollisia muita muutosvaiheita. Haavoittuvuuden hyödyntämisen todennäköisyys kasvaa hitaasti mutta jatkuvasti, kunnes se saavutetaan täydellisenä tilana, kuten päivityksen jälkeen. Tämä malli ei kuitenkaan ota huomioon kaikkiin todellisiin maailmatapahtumiin liittyviä tiloja, ja tutkimuksen tavoitteena on tuoda esiin riskin kehitys siihen saakka, kunnes haavoittuvuus on korjattu.

Yksi vaihtoehto, joka tulisi ottaa huomioon, on mahdollinen päivitysyritysten ja hyödyntämisyritysten tarkastelu ennen ja jälkeen haavoittuvuuden paljastumisen. Näin saadaan kokonaisvaltaisempi kuva haavoittuvuuksien hyödyntämisprosesseista ja päivityksen vaikutuksista.

Aikaisempi lähestymistapa markovilaisten mallien soveltamisessa oli liian analyyttinen, sillä se yritti luoda algoritmia, joka laskisi useita siirtymätapoja ennen kuin saavutetaan vakaa tila. Koska markovinen prosessi on laskennallisesti kallis, käytettiin sen sijaan tietoa haavoittuvuuksien vaiheista ja siirtymien todennäköisyyksistä eri tiloissa. Malli rakennettiin ajankäytön perusteella, ja koska data käyttäytyy ei-lineaarisesti ajan funktiona, perinteinen moninkertainen regressio ei tullut kysymykseen. Statistinen malli, joka otti huomioon ei-lineaarisen kehityksen, sisälsi kaksi painokerrointa ja ajan riippumattomana tekijänä. Näin ollen, kehitystä pyrittiin tarkastelemaan aikatason muuttujana, joka oli riippuvainen exploitaatioasteesta.

Mallin optimointiin käytettiin suurimman todennäköisyyden estimaattoria, ja sen laadun arvioimiseksi seurattiin R-neliö ja säädetty R-neliö arvoja. R-neliö kertoo mallin selityskyvystä ja kuinka hyvin se kuvaa todellisuutta. Tämän perusteella toinen malli saatiin optimoitua entistä tarkemmaksi, ja residualianalyysi varmistaa, ettei virheiden mallit ole vääristäneet analyysiä. Tämän jälkeen malli testattiin aineistolla, jota ei käytetty mallin rakentamisessa, ja se osoitti hyödyllisyytensä.

Tämän tutkimuksen keskeinen piirre on myös haavoittuvuuksien aikasarjojen mallintaminen, jossa pyritään huomioimaan trendejä, kausivaihteluita ja tasonmuutoksia. Erityisesti verkkoselaimien haavoittuvuuksien analysointi on keskiössä, koska selaimet ovat ensisijaisia kohteita hakkeroinnille. Vaikka ohjelmistojen kehitysprosesseja on pyritty tekemään haavoittuvuuksienkestäviksi, keskittyminen ajallisiin tekijöihin ja turvallisuus jää usein toissijaiseksi.

Aikaisemmat tutkimukset ovat painottaneet lähinnä koodiin liittyviä mittareita ja matemaattisia malleja ennustamisen tueksi. Tällöin on huomattu, että kehittäjämittarit, koodin monimutkaisuus ja koodin vaihtuvuus ovat hyviä ennustamiskykyjä tarjoavia tekijöitä, mutta näiden tutkimusten tulokset eivät ole olleet yleistettävissä selainten haavoittuvuuksille. Sen sijaan komponenttien välistä riippuvuutta on tutkittu, ja haavoittuvuuksien ennustamiseksi on kehitetty riippuvuussuhteiden mallinnusta.

Tärkeä edistysaskel on ollut aikasarjamallien käyttö, erityisesti ARIMA (Autoregressive Integrated Moving Average) ja eksponentiaalisen tasoituksen (ES) mallit, jotka ovat olleet tärkeitä ennustettaessa haavoittuvuuksien tulevaa kehitystä. Aikasarjamallit perustuvat siihen, että ne antavat enemmän painoarvoa tuoreelle datalle, ja näin ollen ne ovat erityisen hyödyllisiä, kun tarkastellaan haavoittuvuuksien aikarajoja ja kehitystä.

ARIMA-malli on yksi tunnetuimmista malleista, jota käytetään yksittäisten muuttujien (univariate) ennustamiseen. ARIMA-mallissa haavoittuvuudet tulee ensin tehdä stabiileiksi (stationary), eli tietyn ajanjakson aikana ei saa olla merkittäviä trendejä tai kausivaihteluita. Mallin rakenne määritellään sitten AR-, MA- ja differointikomponenteilla, jotka kuvaavat haavoittuvuuksien riippuvuutta aikaisemmista arvoista. Paras ARIMA-malli saadaan määrittelemällä nämä komponentit osittaisen autokorrelaation (PACF) ja autokorrelaation (ACF) avulla.

Aikavarauksen ennustaminen auttaa tulevaisuuden suunnittelussa, mutta sen käytettävyys rajoittuu siihen, ettei se tuo esiin syy- ja seuraussuhteita haavoittuvuuksien ilmenemiselle. Vaikka mallit voivat auttaa ennustamaan, missä ja milloin haavoittuvuuksia todennäköisesti ilmenee, ne eivät auta selvittämään, miksi tietyt haavoittuvuudet esiintyvät.

Miten koodin automaattinen täydennys hyödyntää mallien yhdistämistä ja neuroverkkopohjaista kielimallia?

Nykyiset koodin automaattisen täydennyksen menetelmät pyrkivät parantamaan ehdotusten osuvuutta yhdistämällä eri tietolähteitä ja malleja. Yksi keskeinen lähestymistapa on yhdistää Eclipse-ympäristön tarjoamat ehdotukset ja erillisen välimuistimallin tuottamat todennäköisyysarvot. Tämä yhdistelmä perustuu siihen, että Eclipse tarjoaa korkean tason kontekstipisteytyksen, mutta ei aina kykene tarjoamaan hienojakoista ehdotusten järjestystä erityisesti dynaamisissa kielissä, joissa tyyppitieto on usein puutteellista tai puuttuu kokonaan.

Välimuistimalli perustuu n-grammien analyysiin, joka kerää sanamääriin perustuvaa tietoa aktiivisista tiedostoista. Näin muodostettu malli luo ehdotuslistoja, joita yhdistämällä ja lajittelemalla voidaan saavuttaa parempi tarkkuus. Kun jompikumpi ehdotuslistoista on suppea (alle kolme ehdotusta), priorisoidaan kyseisen listan ylin ehdotus, mutta jos molemmat listat ovat riittävän laajoja, kaikki ehdotukset huomioidaan. Lopullinen lista järjestetään niin, että sekä Eclipse- että välimuistimallin ehdotukset säilyttävät merkityksellisen järjestyksensä. Tämä järjestely takaa, että koodin täydennysjärjestelmä toimii sekä tehokkaasti että käyttäjäystävällisesti.

Mallin suorituskyky on testattu Java-projektikorpuksilla käyttäen kymmenkertaista ristiinvalidointia. Koulutusvaiheessa laskettiin tokenien esiintymistiheydet, ja testauksessa arvioitiin seuraavan tokenin ennustamisen tarkkuutta. Merkittävä tekninen valinta oli sulkea pois harjoittelusta symbolit kuten sulkeet, koska niiden ennustaminen olisi liian helppoa ja vääristäisi tuloksia. Tarkastelu keskittyi siihen, kuinka usein oikea ehdotus esiintyi kymmenen parhaan joukossa, sekä keskimääräiseen käänteiseen sijoitusarvoon.

Viimeaikaiset neuroverkkopohjaiset kielimallit ovat tuoneet merkittäviä parannuksia koodin ehdotuksiin, erityisesti pystyen mallintamaan pitkän kantaman riippuvuuksia, jotka perinteisemmät n-grammipohjaiset mallit eivät huomioi. Näissä malleissa hyödynnetään suuria ohjelmistovarastoja, esimerkiksi GitHubista kerättyä Python-koodia, jonka avulla neuroverkot oppivat paikallisia ja pitkän aikavälin kontekstisuhteita.

Yksi merkittävä haaste neuroverkkomalleissa on sisäisen tilan kiinteä koko, joka rajoittaa kykyä säilyttää ja hyödyntää pitkän aikavälin riippuvuuksia. Tämä ongelma on osittain ratkaistu ottamalla käyttöön osoitinverkkoja (pointer networks), jotka valikoivat abstraktin syntaksipuun (AST) perusteella keskeisiä tunnisteita huomioitavaksi. Tällainen mekanismi mahdollistaa sekä pitkän aikavälin että paikallisen ilmiön huomioimisen samanaikaisesti. Tarkoituksena on, että koodin täydennysohjelma voi viitata funktioihin ja olioihin, jotka on määritelty kaukana nykyisestä kontekstista, mutta jotka ovat silti olennaisia ehdotuksen kannalta.

Sparse attention -mekanismi on keskeinen osa tätä lähestymistapaa, sillä se mahdollistaa tehokkaan ja kohdennetun tarkastelun pitkän kantaman riippuvuuksiin dynaamisissa kielissä kuten Pythonissa. Vaikka tämä parantaa huomattavasti mallin tarkkuutta, siihen liittyy myös haasteita virheiden hallinnassa, mikä vaatii jatkuvaa kehitystä.

Kokonaisuudessaan yhdistämällä perinteiset kontekstipohjaiset mallit ja edistyneet neuroverkkomallit voidaan saavuttaa tehokas ja tarkka koodin automaattinen täydennysjärjestelmä, joka palvelee ohjelmoijia monipuolisesti. On tärkeää ymmärtää, että koodin ehdotuksen laatu ei riipu pelkästään algoritmien teknisestä suorituskyvystä, vaan myös siitä, miten mallit pystyvät käsittelemään sekä paikallista että laajempaa kontekstia sekä dynaamisten kielten erityispiirteitä.

Lisäksi lukijan on hyvä tiedostaa, että koodin automaattinen täydennys on jatkuvasti kehittyvä ala, jossa perinteiset tilastolliset mallit ja koneoppimismenetelmät täydentävät toisiaan. Mallien tehokkuuden mittaaminen perustuu usein todellisten ohjelmistoprojektien aineistoihin, ja tulokset voivat vaihdella riippuen käytetystä kielestä, projektin koosta ja tyypistä. Tämän vuoksi on hyödyllistä suhtautua koodin ehdotuksiin työkaluna, joka tukee ohjelmointiprosessia, mutta ei korvaa ohjelmoijan syvällistä ymmärrystä ja harkintaa. Erityisesti dynaamisissa kielissä, joissa tyyppitiedon puute rajoittaa ehdotusten tarkkuutta, ihmisen tekemä kontekstin tulkinta on edelleen välttämätöntä.