Puskurin ylivuoto on ilmiö, joka ilmenee, kun tietokoneohjelma kirjoittaa tietoja muistiin varatun puskurin ulkopuolelle .
Puskurin ylivuodot johtuvat yleensä ulkoisesti vastaanotettujen tietojen ja muistin virheellisestä käsittelystä, kun ohjelmointialijärjestelmä ( kääntäjä tai tulkki ) ja käyttöjärjestelmä eivät ole suojanneet vahvasti . Ylivuodon seurauksena puskurin jälkeen (tai ennen sitä) [1] olevat tiedot voivat vioittua .
Puskurin ylivuoto on yksi suosituimmista tavoista hakkeroida tietokonejärjestelmiä [2] , koska useimmat korkean tason kielet käyttävät pinokehystekniikkaa - tietojen sijoittamista prosessipinoon , ohjelmatietojen sekoittamista ohjaustietoihin (mukaan lukien järjestelmän aloitusosoite). pinokehys ja suoritettavan funktion palautusosoite).
Puskurin ylivuoto voi aiheuttaa ohjelman kaatumisen tai jumittua, mikä johtaa palvelunestoon ( DoS ). Tietyntyyppiset ylivuodot, kuten pinokehyksen ylivuoto, antavat hyökkääjän ladata ja suorittaa mielivaltaisen konekoodin ohjelman puolesta ja sen tilin oikeuksilla, jolta se ajetaan [3] .
Esimerkkejä tunnetaan, kun järjestelmäohjelmat käyttävät tietoisesti puskurin ylivuotoja olemassa olevien ohjelmistojen tai laiteohjelmistojen rajoitusten kiertämiseen. Esimerkiksi iS-DOS- käyttöjärjestelmä ( ZX Spectrum -tietokoneille ) käytti sisäänrakennetun TR-DOS :n puskurin ylivuotoominaisuutta käynnistääkseen käynnistyslataimen konekoodeissa (mitä ei voida tehdä tavallisilla TR-DOS-työkaluilla).
Ohjelmaa, joka käyttää haavoittuvuutta murtaakseen toisen ohjelman suojauksen, kutsutaan hyväksikäytöksi . Vaarallisimpia ovat hyväksikäytöt, joiden tarkoituksena on päästä pääkäyttäjätasolle , eli toisin sanoen oikeuksien eskalaatio . Puskurin ylivuodon hyödyntäminen saavuttaa tämän välittämällä ohjelmalle erityisesti muodostetun syötteen. Tällaiset tiedot ylittävät varatun puskurin ja muuttavat puskuria seuraavat tiedot muistissa . [neljä]
Kuvittele hypoteettinen järjestelmänhallintaohjelma , joka toimii pääkäyttäjän oikeuksilla – esimerkiksi käyttäjien salasanojen vaihtamisella . Jos ohjelma ei tarkista syötetyn uuden salasanan pituutta, kaikki tiedot, jotka ylittävät niiden varastointiin varatun puskurin koon, yksinkertaisesti kirjoitetaan puskurin jälkeen. Hyökkääjä voi lisätä konekielisiä ohjeita tälle muistialueelle , esimerkiksi shell -koodin , suorittamalla mitä tahansa toimintoa pääkäyttäjän oikeuksin - lisätä ja poistaa käyttäjätilejä, vaihtaa salasanoja, muuttaa tai poistaa tiedostoja jne. Jos suoritetaan tällä muistialueella, se on sallittu ja tulevaisuudessa ohjelma siirtää ohjauksen sille, järjestelmä suorittaa siellä sijaitsevan hyökkääjän konekoodin .
Hyvin kirjoitettujen ohjelmien tulee tarkistaa syöttötietojen pituus varmistaakseen, että se ei ole suurempi kuin varattu tietopuskuri. Ohjelmoijat kuitenkin usein unohtavat sen. Jos puskuri sijaitsee pinossa ja pino "kasvaa" (esimerkiksi x86 -arkkitehtuurissa ), puskurin ylivuotoa käyttämällä voit muuttaa suoritetun funktion paluuosoitetta, koska paluuosoite sijaitsee suoritetun toiminnon varaama puskuri. Siten on mahdollista suorittaa mielivaltainen konekoodin osa prosessin osoiteavaruudessa. Puskurin ylivuotoa voidaan käyttää korruptoimaan paluuosoite, vaikka pino "kasvaisi" (tässä tapauksessa paluuosoite on yleensä ennen puskuria). [5]
Jopa kokeneiden ohjelmoijien on vaikea määrittää, voiko tietty puskurin ylivuoto olla haavoittuvuus. Tämä edellyttää syvää tietämystä tietokoneen arkkitehtuurista ja kohdeohjelmasta. On osoitettu, että jopa niin pienet ylivuodot kuin yhden tavun kirjoittaminen puskurista voivat edustaa haavoittuvuuksia. [6]
Puskurin ylivuodot ovat yleisiä ohjelmissa, jotka on kirjoitettu suhteellisen matalan tason ohjelmointikielillä , kuten assembly- , C- ja C++ -ohjelmointikielillä, mikä edellyttää ohjelmoijan ohjaavan varatun muistin kokoa. Puskurin ylivuodon vianmääritys on edelleen huonosti automatisoitu prosessi. Muodolliset ohjelman varmennusjärjestelmät eivät ole kovin tehokkaita nykyaikaisilla ohjelmointikielillä. [7]
Monet ohjelmointikielet, kuten Perl , Python , Java ja Ada , hallitsevat muistin varausta automaattisesti, mikä tekee puskurin ylivuotovirheistä epätodennäköisiä tai mahdottomia. [8] Perl tarjoaa automaattisen taulukoiden koon muuttamisen puskurin ylivuotojen välttämiseksi . Tällaisten kielten ajonaikaiset järjestelmät ja kirjastot voivat kuitenkin edelleen olla alttiita puskurin ylivuodolle näiden validointijärjestelmien toteutuksen mahdollisten sisäisten virheiden vuoksi. Windowsissa on saatavilla useita ohjelmisto- ja laiteohjelmistoratkaisuja, jotka estävät koodin suorittamisen ylivuotopuskurin ulkopuolella, jos tällainen ylivuoto tapahtuu. Näitä ratkaisuja ovat DEP Windows XP SP2 : ssa , [9] OSsurance ja Anti-Execute .
Harvardin arkkitehtuurissa suoritettava koodi pidetään erillään tiedoista, mikä tekee tällaiset hyökkäykset lähes mahdottomaksi. [kymmenen]
Harkitse esimerkkiä haavoittuvasta C -ohjelmasta :
#include <string.h> int main ( int argc , char * argv []) { charbuf [ 100 ] ; strcpy ( buf , argv [ 1 ]); paluu 0 ; }Se käyttää unsafe strcpy -toimintoa , jonka avulla voit kirjoittaa enemmän tietoja kuin mahtuu niille varattuun taulukkoon. Jos suoritat tämän ohjelman Windows -järjestelmässä , jonka argumentti on yli 100 tavua, ohjelma todennäköisesti kaatuu ja käyttäjä saa virheilmoituksen.
Tämä haavoittuvuus ei vaikuta seuraavaan ohjelmaan:
#include <string.h> int main ( int argc , char * argv []) { charbuf [ 100 ] ; strncpy ( buf , argv [ 1 ], sizeof ( buf )); paluu 0 ; }Tässä strcpy on korvattu strncpyllä , jossa kopioitavien merkkien enimmäismäärää rajoittaa puskurin koko. [yksitoista]
Alla olevat kaaviot osoittavat, kuinka haavoittuva ohjelma voi vahingoittaa pinorakennetta .
Kuva erilaisten tietojen kirjoittamisesta pinoon varattuun puskuriinA. - Ennen tietojen kopioimista.
B. - Merkkijono "hello" on kirjoitettu puskuriin.
C. - Puskuri on vuotanut yli, jolloin paluuosoite on ylikirjoitettu.
x86 - arkkitehtuurissa pino kasvaa isommista osoitteista pienempiin eli uudet tiedot sijoitetaan ennen pinossa jo olevia.
Kirjoittamalla tietoja puskuriin voit kirjoittaa sen rajojen ulkopuolelle ja muuttaa siellä olevia tietoja, erityisesti muuttaa palautusosoitetta .
Jos ohjelmalla on erityisoikeuksia (kuten ajaminen pääkäyttäjänä ), hyökkääjä voi muuttaa paluuosoitteen shellcode- osoitteeksi , jolloin hän voi suorittaa komentoja kohdejärjestelmässä korotetuilla oikeuksilla . [12]
Puskurin ylivuototekniikat vaihtelevat arkkitehtuurin, käyttöjärjestelmän ja muistialueen mukaan. Esimerkiksi puskurin ylivuoto kasassa (käytetään dynaamiseen muistin varaamiseen) on merkittävästi erilainen kuin puhelupinossa .
Tunnetaan myös nimellä Stack smashing . Tekninen käyttäjä voi käyttää pinopuskurin ylivuotoa manipuloidakseen ohjelmaa edukseen seuraavilla tavoilla:
Jos käyttäjätietojen osoite on tuntematon, mutta se on tallennettu rekisteriin, voidaan käyttää trampoliinointimenetelmää : paluuosoite voidaan korvata opkoodin osoitteella , joka siirtää ohjauksen käyttäjätietojen muistialueelle. Jos osoite on tallennettu R-rekisteriin, hyppääminen komentoon, joka siirtää ohjauksen kyseiseen osoitteeseen (esimerkiksi kutsu R), suorittaa käyttäjän määrittämän koodin. Sopivien opkoodien tai muistitavujen osoitteet löytyvät DLL :stä tai itse suoritettavasta tiedostosta. Osoitteet eivät kuitenkaan yleensä voi sisältää nollamerkkejä, ja näiden opkoodien sijainnit vaihtelevat sovelluksen ja käyttöjärjestelmän mukaan. Esimerkiksi Metasploit Project ylläpiti tietokantaa sopivista opkoodeista Windows-järjestelmille (joka ei ole tällä hetkellä saatavilla). [viisitoista]
Pinon puskurin ylivuotoa ei pidä sekoittaa pinon ylivuotoon .
On myös syytä huomata, että tällaiset haavoittuvuudet löydetään yleensä fuzzing- testaustekniikalla .
Puskurin ylivuotoa keon tietoalueella kutsutaan keon ylivuodoksi ja sitä hyödynnetään eri tavalla kuin puskurin ylivuotoa pinossa. Sovellus varaa dynaamisesti kasamuistin ajon aikana, ja se sisältää yleensä ohjelmatietoja. Hyödyntäminen tapahtuu korruptoimalla nämä tiedot erityisillä tavoilla pakottaakseen sovelluksen korvaamaan sisäiset rakenteet, kuten linkitetyissä luetteloissa olevia osoittimia. Yleinen keon puskurin ylivuotojen hyväksikäyttötekniikka on korvata dynaamisia muistiviittauksia ( kuten malloc - funktion metadata ) ja käyttää tuloksena saatua muokattua osoitinta ohjelman funktioosoittimen päällekirjoittamiseen.
Microsoftin GDI+ -tuotteen haavoittuvuus JPEG -kuvien käsittelyssä on esimerkki vaarasta, jonka keon puskurin ylivuoto voi aiheuttaa. [16]
Puskurin käsittely ennen sen lukemista tai suorittamista voi estää haavoittuvuuden onnistuneen hyödyntämisen. Ne voivat vähentää onnistuneen hyökkäyksen uhkaa, mutta eivät kokonaan poista sitä. Toimintoja voivat olla merkkijonon muuntaminen isoiksi tai pieniksi kirjaimille, erikoismerkkien poistaminen tai kaikkien paitsi aakkosnumeeristen merkkien suodattaminen pois. On kuitenkin olemassa temppuja näiden toimenpiteiden kiertämiseen: aakkosnumeeriset shell-koodit, [17] polymorfiset koodit , [ 18 ] itsemuuttuvat koodit ja kirjaston paluuhyökkäys . [19] Samoja tekniikoita voidaan käyttää tunkeutumisen havaitsemisjärjestelmistä piiloutumiseen . Joissakin tapauksissa, mukaan lukien merkkien muuntaminen Unicodeksi , haavoittuvuuden katsotaan sallivan DoS-hyökkäyksen , vaikka itse asiassa mielivaltaisen koodin etäsuoritus on mahdollista. [kaksikymmentä]
Erilaisia temppuja käytetään puskurin ylivuotojen vähentämiseksi.
Tunkeutumisen havaitsemisjärjestelmät (IDS) voivat havaita ja estää puskurin ylivuotojen etäkäyttöyritykset. Koska useimmissa tapauksissa puskurin ylivuotoon tarkoitettu data sisältää pitkiä ei operaatiota ( tai ) -käskyjä , IDS yksinkertaisesti estää kaikki saapuvat paketit , jotka sisältävät suuren määrän peräkkäisiä NOP:ita. Tämä menetelmä on yleensä tehoton, koska tällaiset taulukot voidaan kirjoittaa käyttämällä erilaisia kokoonpanokielen ohjeita . Äskettäin krakkarit ovat alkaneet käyttää shell-koodeja salauksella , itsemuovautuvalla koodilla , polymorfisella koodilla ja aakkosnumeerisella koodilla sekä varahyökkäyksillä standardikirjastoon tunkeutuakseen IDS:ään. [21] NOPNOOP
Pinon korruptiosuojausta käytetään havaitsemaan yleisimmät puskurin ylivuotovirheet. Tämä tarkistaa, ettei kutsupinoa ole muokattu ennen funktiosta paluuta. Jos sitä on muutettu, ohjelma päättyy segmentointivirheeseen .
On olemassa kaksi järjestelmää, StackGuard ja Stack-Smashing Protector (aiemmin ProPolice), molemmat gcc - kääntäjän laajennuksia . Gcc-4.1-stage2:sta lähtien SSP on integroitu pääkääntäjän jakeluun . Gentoo Linux ja OpenBSD sisältävät SSP:n gcc-jakeluineen. [22]
Paluuosoitteen sijoittaminen tietopinoon helpottaa mielivaltaisen koodin suorittamiseen johtavan puskurin ylivuodon toteuttamista. Teoriassa gcc:hen voitaisiin tehdä muutoksia, jotta osoite voitaisiin sijoittaa erityiseen paluupinoon , joka on täysin erillinen tietopinosta, samalla tavalla kuin se on toteutettu Forth-kielessä . Tämä ei kuitenkaan ole täydellinen ratkaisu puskurin ylivuotoongelmaan, koska myös muut pinotiedot on suojattava.
Suoritettavan koodin tilan suojaaminen voi lieventää puskurin ylivuodon vaikutuksia, jolloin useimmat haitalliset toimet ovat mahdottomia. Tämä saavutetaan osoiteavaruuden satunnaistuksella ( ASLR ) ja/tai samanaikaisen muistin käytön kieltämisellä kirjoittamista ja suorittamista varten. Ei-suoritettava pino estää useimmat shell-koodin hyväksikäytöt .
On olemassa kaksi Linux-ytimen korjaustiedostoa , jotka tarjoavat tämän suojan - PaX ja exec-shield . Mikään näistä ei vielä sisälly pääytimen jakeluun. OpenBSD on versiosta 3.3 lähtien sisältänyt W^X -nimisen järjestelmän , joka tarjoaa myös ajonaikaisen ohjauksen.
Huomaa, että tämä suojausmenetelmä ei estä pinon korruptiota. Usein se kuitenkin estää hyväksikäytön "hyötykuorman" suorittamisen onnistuneesti. Ohjelma ei pysty lisäämään shell-koodia kirjoitussuojattuun muistiin, kuten olemassa oleviin suoritettavan koodin segmentteihin. Ei myöskään ole mahdollista suorittaa käskyjä ei-suoritettavassa muistissa, kuten pinossa tai kasassa .
ASLR tekee hyökkääjän vaikeaksi määrittää ohjelman koodissa olevien toimintojen osoitteita, joilla hän voisi suorittaa onnistuneen hyökkäyksen, ja tekee ret2libc :n kaltaisista hyökkäyksistä erittäin vaikeita, vaikka ne ovat silti mahdollisia valvotussa ympäristössä tai jos hyökkääjä on oikein. arvaa oikean osoitteen.
Jotkut prosessorit , kuten Sun 's Sparc , Transmetan Efficeon ja uusimmat AMD : n ja Intelin 64-bittiset prosessorit, estävät erityisellä NX-bitillä merkittyjen muistialueiden koodin suorittamisen . AMD kutsuu ratkaisuaan NX :ksi ( englanniksi No eXecute ) ja Intel XD :ksi ( englanniksi eXecute Disabled ). [23]
Nyt on saatavilla useita erilaisia ratkaisuja suoritettavan koodin suojaamiseen Windows -järjestelmissä sekä Microsoftilta että kolmansilta osapuolilta.
Microsoft tarjosi DEP-nimisen ratkaisunsa ( englanniksi Data Execution Prevention - "data execution prevention"), sisältäen sen Windows XP :n ja Windows Server 2003 :n Service Pack -paketteihin . DEP hyödyntää uudempia Intel- ja AMD - suorittimia , jotka on suunniteltu ylittämään 32-bittisten prosessorien 4 Gt osoitettavan muistin raja. Tätä tarkoitusta varten joitain palvelurakenteita on lisätty. Nämä rakenteet sisältävät nyt varatun NX-bitin. DEP käyttää tätä bittiä estääkseen hyökkäykset, joihin liittyy poikkeuskäsittelijän osoitteen muuttaminen (ns. SEH exploit ). DEP suojaa vain SEH -hyökkäyksiltä , se ei suojaa suoritettavalla koodilla olevia muistisivuja. [9]
Lisäksi Microsoft on kehittänyt Windows Serverille suunnitellun pinon suojausmekanismin. Pino merkitään ns. "informanttien" ( englanniksi canary ) avulla, joiden eheys sitten tarkistetaan. Jos "ilmoittaja" on vaihdettu, pino on vioittunut. [24]
On myös kolmansien osapuolien ratkaisuja, jotka estävät datalle tai ASLR-mekanismin toteuttamiseen tarkoitetuilla muistialueilla sijaitsevan koodin suorittamisen.
Puskurin ylivuotojen ongelma on yhteinen C- ja C++-ohjelmointikielille , koska ne eivät piilota yksityiskohtia puskurien matalan tason esityksestä tietotyyppien säiliöinä . Puskurin ylivuotojen välttämiseksi puskureita hallitsevan koodin luomisen ja muokkaamisen korkea taso on siis ylläpidettävä. Abstraktien tietotyyppikirjastojen käyttö , jotka suorittavat keskitetyn automaattisen puskurinhallinnan ja sisältävät ylivuototarkistuksen, on yksi tekninen lähestymistapa puskurin ylivuodon estämiseen. [25]
Kaksi päätietotyyppiä, jotka sallivat puskurin ylivuodon näillä kielillä, ovat merkkijonot ja taulukot . Siten puskurin ylivuotojen estämiseen ja/tai havaitsemiseen kehitettyjen merkkijonojen ja luettelotietorakenteiden kirjastojen käyttö välttää monia haavoittuvuuksia. Tällaisten ratkaisujen hinta on suorituskyvyn lasku, joka johtuu tarpeettomista tarkastuksista ja muista kirjastokoodin suorittamista toimista, koska se on kirjoitettu "kaikkiin tilanteisiin", ja kussakin tapauksessa osa sen suorittamista toiminnoista voi olla tarpeettomia.
Puskurin ylivuoto ymmärrettiin ja osittain dokumentoitiin jo vuonna 1972 Computer Security Technology Planning Study -tutkimuksessa. [26] Varhaisin dokumentoitu puskurin ylivuodon haitallinen käyttö tapahtui vuonna 1988. Se perustui yhteen useista hyökkäyksistä, joita Morris-mato itse levitti Internetissä. Ohjelma käytti hyväkseen Unix finger -palvelun haavoittuvuutta . [27] Myöhemmin, vuonna 1995, Thomas Lopatik löysi itsenäisesti uudelleen puskurin ylivuodon ja listasi löydökset Bagtrak- luetteloon . [28] Vuotta myöhemmin Elias Levy julkaisi Phrack -lehdessä vaiheittaisen johdannon puskurin ylivuotojen käyttämisestä pinon kanssa, Smashing the Stack for Fun and Profit . [12]
Siitä lähtien ainakin kaksi tunnettua verkkomatoa on käyttänyt puskurin ylivuotoja suuren määrän järjestelmiä tartuttamiseen. Vuonna 2001 Code Red -mato käytti hyväkseen tätä haavoittuvuutta Microsoftin Internet Information Services (IIS) 5.0 -tuotteessa [29] ja vuonna 2003 SQL Slammer sai tartunnan Microsoft SQL Server 2000 -käyttöjärjestelmää käyttävissä koneissa . [kolmekymmentä]
Vuonna 2003 lisensoiduissa Xbox -peleissä esiintyvän puskurin ylivuodon hyödyntäminen mahdollisti lisensoimattomien ohjelmistojen käytön konsolissa ilman laitteistomuutoksia niin kutsuttujen modchipsien avulla . [31] PS2 Independence Exploit käytti myös puskurin ylivuotoa saavuttaakseen saman tuloksen PlayStation 2 :lla . Samanlainen Wii Twilightin hyväksikäyttö hyödynsi tätä The Legend of Zelda: Twilight Princessin haavoittuvuutta .