Kasan ruiskutus

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] .

Peruskonsepti

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] .

Historia

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] .

Toteutus

JavaScript

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 .

VBScript

VBScriptiä käytetään Internet Explorerissa merkkijonojen luomiseen string. Käsitteellisesti sama kuin JavaScript -toteutus , vain funktioiden nimet muuttuvat [6] .

ActionScript

Heinäkuussa 2009 löydettiin hyväksikäyttöjä , jotka mahdollistavat ActionScriptin käytön kasoruiskutuksen toteuttamiseen Adobe Flashissa [1] .

HTML5

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ää .

Kuvat

On menetelmiä, jotka käyttävät kuvien lataamista. Kuva koostuu NOP :ista ja jatka sitten kuten edellisissä tapauksissa [1] [9] .

Tapoja estää

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ä:

  1. Suorituksen esto erottamalla data ja suoritettava koodi , yleensä käyttämällä arkkitehtonisia ratkaisuja, kuten NX-bittiä . Esimerkiksi DEP on jo otettu käyttöön useimmissa käyttöjärjestelmissä [1]
  2. Tietojen sijainnin satunnaisuuden lisääminen muistissa . Esimerkiksi siten, että seuraavalla allokoidulla kasaelementillä ei ole kiinteää siirtymää nykyiseen nähden. Jo toteutettu useimmissa käyttöjärjestelmissä: ASLR [7] .
  3. Lisää puskurin rajojen tarkistusten määrää muistinhallinnassa .

Tämäntyyppiseen hyökkäykseen liittyvät projektit:

  • Microsoft Researchin Nozzle-projekti pyrkii estämään kasaruiskutuksen [1] .
  • BuBBle on toinen projekti, jonka tavoitteena on minimoida tämän hyökkäyksen aiheuttamat vahingot [13] .

Katso myös

Muistiinpanot

  1. 1 2 3 4 5 6 7 8 9 10 11 12 13 Benjamin Livshits, Paruj Ratanaworabhan, Benjamin Zorn. SUUTIN: Suoja kasaruiskutuskoodin ruiskutushyökkäyksiä vastaan.  (englanniksi)  : Inprocedings. - 2009. - S. 38 . Arkistoitu alkuperäisestä 9. elokuuta 2014.
  2. 1 2 Tanenbaum E., Woodhull A. Käyttöjärjestelmät. Kehittäminen ja toteutus. - Pietari. : Peter, 2007. - S. 78-252. - 704 s.
  3. 1 2 Richter J. Windows ammattilaisille: Tehokkaiden Win32-sovellusten rakentaminen 64-bittisille Windowsille. - M . : venäläinen painos, 2008. - S. 68-118,333-418. – 720 s.
  4. 1 2 W. Richard Stevens, Stephen A. Rago. UNIX. Ammattimainen ohjelmointi. - Pietari. : Symbol-Plus, 2014. - S. 288-351. — 1104 s.
  5. Brian Kernighan, Dennis Ritchie. C-ohjelmointikieli. - Williams, 2015. - S. 93-123. — 304 s.
  6. 1 2 3 4 Thomas Toth, Christopher Kruegel. Tarkka puskurin ylivuodon havaitseminen abstraktin hyötykuorman suorittamisen avulla  //  RAID'02 Proceedings of the 5th International Conference on Recent Advances in intrusion detection : Proceedings. - 2002. - 16. lokakuuta. - S. 274-291 . — ISBN 3-540-00020-8 .
  7. 1 2 3 4 Tilo Muller. ASLR Smack & Laugh Reference  . - 2008 - 17. joulukuuta. - S. 21 . Arkistoitu alkuperäisestä 28. syyskuuta 2015.
  8. ↑ 1 2 Mark Russinovich, David Solomon. Windowsin sisäosat. - Pietari. : Peter, 2013. - S. 104-681. – 800 s.
  9. 1 2 3 4 5 6 Sotirov A. Keon feng shui javascriptillä  (englanniksi) . - 2007. - S. 55 . Arkistoitu alkuperäisestä 4. joulukuuta 2015.
  10. HwaiGeeng, Chew. Tietoturva-aukot ISAPI-laajennuksissa   : Inproceedings . - 2001. - S. 12 . Arkistoitu alkuperäisestä 22. joulukuuta 2015.
  11. Musta hattu. Tietoturva-aukot ISAPI-laajennuksissa   : Inproceedings . - 2010. - S. 35 . Arkistoitu alkuperäisestä 4. maaliskuuta 2016.
  12. Anibal Sacco, Federico Muttis. HTML5 Heap Sprays, Pwn All The  Things . - 2012. Arkistoitu 23. joulukuuta 2015.
  13. Francesco Gadaleta, Yves Younan, Wouter Joosen. BuBBle : Javascript-moottorin tason vastatoimenpide kasa-sumutushyökkäyksiä vastaan  . - 2010. - S. 17 . Arkistoitu alkuperäisestä 3. maaliskuuta 2016.

Kirjallisuus

  • Richter J. Windows ammattilaisille: Tehokkaiden Win32-sovellusten rakentaminen 64-bittisille Windowsille. - M . : venäläinen painos, 2008. - S. 68-118,333-418. – 720 s.
  • W. Richard Stevens, Stephen A. Rago. UNIX. Ammattimainen ohjelmointi. - Pietari. : Symbol-Plus, 2014. - S. 288-351. — 1104 s.
  • Tanenbaum E., Woodhull A. Käyttöjärjestelmät. Kehittäminen ja toteutus. - Pietari. : Peter, 2007. - S. 78-252. - 704 s.
  • Brian Kernighan, Dennis Ritchie. C-ohjelmointikieli. - Williams, 2015. - S. 93-123. — 304 s.
  • Mark Russinovich, David Solomon. Windowsin sisäosat. - Pietari. : Peter, 2013. - S. 104-681. – 800 s.

Linkit