Tietoturvan kasaruiskutus on hyökkäys , joka käyttää virheitä sovelluksen muistin kanssa työskentelyssä . Hyökkääessään kasaruiskuttamalla hakkeri pakottaa sovelluksen varaamaan muistia suurelle määrälle haitallista koodia sisältäviä objekteja . Tämä lisää sellaisen hyväksikäytön onnistumisprosenttia, joka siirtää suoritussäikeen johonkin kohtaan kasan sisällä . On tärkeää ymmärtää, että ilman hyväksikäyttöä, jonka avulla voit muuttaa suorituskulkua, kasaruiskutus ei aiheuta haittaa. Hyökkäys perustuu kasan sijainnin ennustettavuuteen prosessin osoiteavaruudessa . Lisäksi muistin varaaminen kasaan on deterministinen operaatio, joka mahdollistaa tämän tekniikan onnistuneen soveltamisen. Kasan ruiskuttaminen on erityisen tehokasta selaimissa , joissa hakkeri voi varata muistia käyttämällä useita JavaScript - rivejä verkkosivulla . Tärkeää roolia on muistin allokoinnin samankaltaisuus eri käyttöjärjestelmissä , mikä tekee tästä hyökkäyksestä monialustaisia. Tämän seurauksena on mahdollista lisätä tietty tavusarja (esimerkiksi konekäsky) ennalta ennustettuun osoitteeseen kohdeprosessin muistissa [ 1] .
Kun prosessi luodaan käyttöjärjestelmään , sen tarpeita varten varataan osoiteavaruus [2] [3] [4] , joka sisältää käyttäjätietoja, suoritettavaa koodia ja joitain järjestelmätietoja, jotka riippuvat tietystä käyttöjärjestelmästä. Käyttäjätiedot jaetaan kasan ja pinon välillä riippuen siitä, kuinka niille on varattu muistia [5] . Esimerkiksi pinosegmentti tallentaa muuttujat automaattisella allokointiluokalla sekä tiedot, jotka tallennetaan aina kun funktiota kutsutaan, kuten palautusosoite. Keko on dynaamisen muistin alue , eli kun muistia varataan dynaamisesti, kasaan varataan tilaa. Perinteisesti kasa ja pino kasvavat toisiaan kohti [2] [3] [4] .
Kasaruiskutus ei sinänsä ole haavoittuvuus . Sitä voidaan kuitenkin käyttää haitallisen koodin toimittamiseen prosessin suoritettavalle muistialueelle . Tämä tekniikka hyödyntää järjestelmän muistinvaraustoiminnan determinismia . Tämä tarkoittaa, että suuri määrä muistia sijaitsee usein samalla poikkeuksella prosessin osoiteavaruudessa . Tämä tekniikka ei kuitenkaan pysty luomaan murtoa itse turvajärjestelmään. Siksi sen käyttö vaatii haavoittuvuuden, jonka avulla voit muuttaa komentojen (konekäskyjen) suoritusjärjestystä [6] .
Tämän tekniikan käyttäminen on vaikeaa, koska prosessin suorittamiseen vaikuttavien tekijöiden määrä (hakkerin näkökulmasta) on erittäin suuri. Kasaruiskutuksen avulla voit kuitenkin suorittaa suuren määrän ohjeita, mikä kompensoi osittain tämän vaikeuden ja antaa sinun lisätä onnistuneen halkeaman todennäköisyyttä [7] .
Kasaruiskutus voidaan toteuttaa useimpiin käyttöjärjestelmiin ja arkkitehtuureihin . Suurin vaikeus on löytää haavoittuvuus , jonka avulla voit ohjata suoritusvirran uudelleen . Suuren muistimäärän dynaaminen allokointi , kuten aiemmin mainittiin, on operaatio, jonka avulla voit ennustaa kasan sijainnin muistissa (hetkellä kun virtuaalimuisti kartoitetaan fyysiseen muistiin ) [8] . Joka kerta kun suoritetaan sama muistin hakujen sarja, kasa päätyy todennäköisesti samaan paikkaan [6] [7] .
Tämän todennäköisyyden lisäämiseksi on kuitenkin välttämätöntä, että varatun muistin osan koko on verrattavissa segmentin tai sivun kokoon muistin järjestyksen mukaan [ 7] .
Tämän hyökkäyksen suurin ongelma on suoritusvirran muuttaminen . Ilman kykyä siepata teloitus tämäntyyppisessä hyökkäyksessä ei ole järkeä. Jotkut funktiot voivat tallentaa paluuosoitteen kasaan, jolloin hakkeri saattaa yrittää muuttaa niitä. Tässä tapauksessa palatessaan tällaisesta toiminnosta se siirtyy hakkerille sopivaan muistipaikkaan , ja sen seurauksena haitallinen koodi alkaa suorittaa . Mitä tahansa toimintoa, joka lukee kasan osoitteen , voidaan hyödyntää haavoittuvuutena. Hakkeri voi korvata tämän osoitteen muokkaamansa muistin osoitteella. Tämä voi johtaa suoritussäikeen uudelleenohjaamiseen haitalliseen koodiin. Tämä ei kuitenkaan ole niin helppoa kuin miltä näyttää [1] [8] .
Korvaamiseen käytetyn osoitteen oikeellisuus (sen koko, siirtymä sivun alkuun nähden) riippuu suuresti arkkitehtuurista. Siksi käytännössä käytetään lohkoja, jotka koostuvat pääasiassa NOP :ista ja lisäävät tarvittavan koodin loppuun. Tämän tekniikan avulla voit olla huolehtimatta osoitteen laskennan tarkkuudesta ja ohjata suoritusvirran likimääräiseen paikkaan osoiteavaruudessa [1] .
Kasaruiskutuksen toteuttamisvaiheet:
Tämäntyyppinen hyökkäys on erittäin tehokas selaimissa . Useimmat selaimet tukevat komentosarjan suorittamista . Hakkeri voi varata tarvittavan muistin käyttämällä muutamaa JavaScript- tai ActionScript -riviä verkkosivulla. Tärkeää roolia on muistin allokoinnin samankaltaisuus eri käyttöjärjestelmissä , mikä tekee tästä hyökkäyksestä monialustaisia. Lisäksi osoitteet, joihin sinun täytyy hypätä, ovat samanlaisia [9] .
Kasaruiskutusta käytettiin ensimmäisen kerran vuonna 2001, ja se yleistyi kesällä 2005. Sen jälkeen Internet Explorerista on löydetty suuri määrä haavoittuvuuksia [10] [11] . Hyökkäykset olivat hyvin samanlaisia keskenään. Jokainen tällainen hyväksikäyttö koostui kasaruiskutuksesta, jonka toteutustapa ei muuttunut, ja ohjelmalaskurin siirtämisestä haluttuun paikkaan muistissa . Tästä syystä saatiin uusi hyväksikäyttö muuttamalla muutama rivi HTML -koodia ja vaihtamalla uuteen haavoittuvuuteen [1] .
Helpoin tapa varata tilaa selaimen muistissa on ilmoittaa merkkijonomuuttuja ja alustaa se [1] .
Esimerkkejä muistin varaamisesta JavaScriptissä [9] :
var myvar = "CORELAN!" ; var myvar2 = uusi merkkijono ( "CORELAN!" ); var myvar3 = myvar + myvar2 ; var myvar4 = myvar3 . osamerkkijono ( 0 , 8 );Nämä ovat hyvin yksinkertaisia esimerkkejä, koska korostetut viivat ovat pieniä. Shell-koodin pala on paljon suurempi, mutta silti pienempi kuin koko sivu muistia .
Hypoteettisesti on mahdollista kirjoittaa tarvittava shell-koodi monta kertaa jokaiseen varaamaamme lohkoon, mutta silloin hyökkääjän on seurattava, mihin tiettyyn osoitteeseen osoitin menee, koska sen ei pitäisi pudota suoritettavan koodin keskelle . Yleensä he toimivat eri tavalla - he valitsevat palat, jotka sisältävät monia NOP :ita , ja lopuksi määräävät tarvittavat komennot. Tällöin lohkojen lineaarisen järjestelyn ansiosta kasaan on helpompi havaita koodin suorituksen lineaarisuus, eikä tarvitse huolehtia muistinpalan alkuun osumisen tarkkuudesta [9] .
Oikealla koon valinnalla varattujen muistin osien tulee olla hyvin lähellä pinoelementin kokoa. Jos varattu muisti on pienempi, jäljellä oleva tila on vapaata. Muistinhallinta jättää parhaimmillaan järjestelmän roskat tähän "varaamattomaan tilaan" ja pahimmillaan sijoittaa oikean kokoisen objektin. Joka tapauksessa tämä johtaa virheeseen yritettäessä suorittaa tätä muistipaikkaa [1] [9] .
Siten hyökkääjien käyttämä skripti näyttää tältä [9] :
< html > < script > var shellcode = unescape ( '%u\4141%u\4141' ); // tämä on CORELAN-tunniste var bigblock = unescape ( '%u\9090%u\9090' ); //90 on NOP-koodi var headersize = 20 ; var slackspace = otsikon koko + kuorikoodi . pituus ; // palamme alkukoko: hyödyllinen koodi + otsikon koko while ( bigblock . pituus < slackspace ) bigblock += bigblock ; //täyttö NOP:illa var fillblock = bigblock . osamerkkijono ( 0 , slackspace ); //hyödyllinen koodi - täyte var block = bigblock . osamerkkijono ( 0 , isolohko . pituus - slackspace ); //vain NOPs while ( lohko . pituus + slackspace < 0x40000 ) block = block + block + fillblock ; //täytä pinoelementin kokoon - tässä tapauksessa se on 0x40000 var memory = new Array (); for ( i = 0 ; i < 500 ; i ++ ){ muisti [ i ] = lohko + kuorikoodi } // valitse useita tällaisia elementtejä. </ script > </ html >unescape()on funktio, jonka avulla voit asettaa tavut täsmälleen argumentissa [1] määritettyyn järjestykseen .
VBScriptiä käytetään Internet Explorerissa merkkijonojen luomiseen string. Käsitteellisesti sama kuin JavaScript -toteutus , vain funktioiden nimet muuttuvat [6] .
Heinäkuussa 2009 löydettiin hyväksikäyttöjä , jotka mahdollistavat ActionScriptin käytön kasoruiskutuksen toteuttamiseen Adobe Flashissa [1] .
Syyskuussa 2012 uusi toteutus esiteltiin EuSecWest 2012 -tapahtumassa [12] . Federico Muttis ja Anibal Sacco ovat osoittaneet, että erittäin rakeista kasaruiskutusta voidaan toteuttaa HTML5- tekniikoilla . He käyttivät canvas API :n tarjoamaa matalan tason bittikarttaliittymää .
On menetelmiä, jotka käyttävät kuvien lataamista. Kuva koostuu NOP :ista ja jatka sitten kuten edellisissä tapauksissa [1] [9] .
Kuten kaikissa puskurin ylivuodoissa , on kolme pääpuolustusta. [1] Usein on helpompi estää muutos suorituskulussa kuin puskurin todellinen käyttö. Nykyaikaiset käyttöjärjestelmät käyttävät kaikkia seuraavia menetelmiä:
Tämäntyyppiseen hyökkäykseen liittyvät projektit: