Hallitsemattoman muodon merkkijono - Uncontrolled format string
Hallitsemattoman muodon merkkijono on eräs vuonna 1989 löydetty ohjelmistohaavoittuvuus , jota voidaan käyttää tietoturvahyödyissä . Alun perin ajatellut harmiton, Muotomerkkijonoon hyödyntää voidaan kaataa ohjelman tai suorittaa haitallista koodia. Ongelma johtuu siitä, että tarkistamattomia käyttäjän syötteitä käytetään muotoilujonon parametrina tietyissä muotoilua suorittavissa C -toiminnoissa, kuten printf(). Haitallinen käyttäjä voi käyttää %sja %xmuotoilumerkkejä muun muassa tulostamaan tietoja puhelupinosta tai mahdollisesti muista muistipaikoista. Voidaan myös kirjoittaa mielivaltaisia tietoja mielivaltaisiin paikkoihin käyttämällä %nmuotoilutunnusta, joka komentaa printf()ja vastaavia toimintoja kirjoittaa pinoon tallennettuun osoitteeseen muotoillun tavumäärän.
Yksityiskohdat
Tyypillinen hyväksikäyttö käyttää näiden tekniikoiden yhdistelmää prosessin käskyosoittimen (IP) hallintaan, esimerkiksi pakottamalla ohjelma korvaamaan kirjastotoiminnon osoitteen tai pinon palautusosoitteen osoittimella johonkin haitalliseen shellcode . Muotoilumääritysten täyttöparametreja käytetään ohjaamaan tulostettavien tavujen määrää ja %xtunnusta käytetään tavujen ponnahtamiseen pinosta, kunnes itse muotoilumerkkijonon alku saavutetaan. Muotoilujonon alku on muotoiltu sisältämään osoitteen, jonka %nmuotoilutunnus voi sitten korvata suoritettavan haittakoodin osoitteella.
Tämä on yleinen haavoittuvuus, koska muotovirheitä pidettiin aiemmin vaarattomina ja ne johtivat monien yleisten työkalujen haavoittuvuuksiin. MITREn CVE- hankkeessa luetellaan noin 500 haavoittuvaa ohjelmaa kesäkuusta 2007 lähtien, ja trendianalyysi luokittelee sen yhdeksänneksi eniten raportoiduksi haavoittuvuustyypiksi vuosina 2001-2006.
Muotoiluvirheitä ilmenee useimmiten, kun ohjelmoija haluaa tulostaa käyttäjän antamia tietoja sisältävän merkkijonon (joko tiedostoon, puskuriin tai käyttäjälle). Ohjelmoija voi kirjoittaa virheellisesti printf(buffer)sijasta printf("%s", buffer). Ensimmäinen versio tulkitaan buffermuotoon merkkijonoksi ja jäsentää kaikki sen sisältämät muotoiluohjeet. Toinen versio yksinkertaisesti tulostaa merkkijonon näytölle, kuten ohjelmoija tarkoitti. Molemmat versiot toimivat identtisesti, jos merkkijonossa ei ole muotoilutietoja, mikä helpottaa virheen huomaamatta jättämistä kehittäjälle.
Muotovirheitä syntyy, koska C: n argumenttien välityskäytännöt eivät ole tyyppiturvallisia . Erityisesti varargsmekanismi mahdollistaa toimintojen hyväksymästä mitään useita perusteluja (esim printf) mukaan "popping", kuten monet argumentit pois kutsupino kuin haluavat, luottaen varhainen argumentit ilmoittaa, kuinka monta ylimääräistä argumentit voidaan piipahti, ja millaiset .
Muotoiluvirheitä voi esiintyä muilla ohjelmointikielillä kuin C: llä, kuten Perl, vaikka niitä esiintyy harvemmin eikä niitä yleensä voida käyttää hyökkääjän valitseman koodin suorittamiseen.
Historia
Muotovirheet havaittiin ensimmäisen kerran vuonna 1989 Wisconsinin yliopiston fuzz -testaustyössä , joka havaitsi "vuorovaikutusvaikutuksen" C -kuorissa (csh) komentohistoriamekanismin ja virherutiinin välillä, joka oletti turvallisen merkkijonon syöttämisen.
Käyttö Muotomerkkijonoon vikoja kuin hyökkäyksestä löydettiin syyskuussa 1999 Tymm TWILLMAN aikana turvallisuuden tarkastus on Proftpd daemon. Tarkastus paljasti snprintfsuoraan käyttäjän luoman datan välittäneen ilman muotoilumerkkijonoa. Laajat testit, joissa oli keksittyjä argumentteja printf-tyyppisiin toimintoihin, osoittivat, että tämän käyttö etuoikeuksien laajentamiseen oli mahdollista. Tämä johti ensimmäiseen julkaisuun syyskuussa 1999 Bugtraqin postituslistalle, joka koski tätä haavoittuvuusluokkaa, mukaan lukien perushyödyke. Kesti kuitenkin vielä useita kuukausia, ennen kuin turvallisuusyhteisö sai tietää muodon merkkijonohaavoittuvuuksien kaikista vaaroista, kun muiden tätä menetelmää käyttävien ohjelmistojen hyväksikäyttö alkoi ilmaantua. Ensimmäiset hyökkäykset, jotka toivat ongelman yleiseen tietoisuuteen (tarjoamalla etäkäyttöoikeuksia koodin suorittamisen kautta), julkaistiin samanaikaisesti Bugtraq -luettelossa kesäkuussa 2000 Przemysław Frasunek ja henkilö, joka käytti lempinimeä tf8 . Niitä seurasi pian selitys, jonka oli lähettänyt henkilö, joka käytti lempinimeä lamagra . Pascal Bouchareine julkaisi "muotoiluvirheet" Bugtraq -luetteloon heinäkuussa 2000. Tim Newshamin pääkirjoitus "Format String Attacks" julkaistiin syyskuussa 2000 ja muita yksityiskohtaisia teknisiä selityksiä, kuten Exploiting Format String Vulnerabtability, julkaistiin syyskuussa 2001 , Team Teso .
Ennaltaehkäisy kääntäjissä
Monet kääntäjät voivat tarkistaa staattisesti merkkijonot ja antaa varoituksia vaarallisista tai epäiltyistä muodoista. In GNU Compiler Collection , asiaan kääntäjä liput ovat -Wall, -Wformat, -Wno-format-extra-args, -Wformat-security, -Wformat-nonliteral, ja -Wformat=2.
Useimmat näistä ovat hyödyllisiä vain havaitakseen huonot muotoiset merkkijonot, jotka tunnetaan käännöshetkellä. Jos muotoilumerkkijono voi tulla käyttäjältä tai sovelluksen ulkopuolisesta lähteestä, sovelluksen on vahvistettava muotojono ennen sen käyttöä. On myös oltava varovainen, jos sovellus luo tai valitsee muodon merkkijonot lennossa. Jos käytetään GNU C -kirjastoa, -D_FORTIFY_SOURCE=2parametria voidaan käyttää havaitsemaan tietyt ajon aikana tapahtuvat hyökkäykset. -Wformat-nonliteralTarkastus on tiukempi.
Tunnistus
Toisin kuin monet muut tietoturvaongelmat, muotoilujonojen haavoittuvuuksien perimmäinen syy on suhteellisen helppo havaita x86 -käännettävissä suoritettavissa tiedostoissa: printf-perhetoiminnoille asianmukainen käyttö edellyttää erillistä argumenttia muotoilumerkkijonolle ja muotoiltavat argumentit. Tällaisten toimintojen virheellinen käyttö voidaan havaita yksinkertaisesti laskemalla funktiolle välitettyjen argumenttien määrä; "argumentin puute" on sitten vahva osoitus toiminnon väärinkäytöstä.
Tunnistus x86-käännetyissä binaaritiedostoissa
Argumenttien lukumäärän laskeminen on usein helppoa x86 -järjestelmässä kutsumiskäytännön vuoksi, jossa soittaja poistaa pinoon työnnetyt argumentit lisäämällä pino -osoittimen puhelun jälkeen, joten pinon korjauksen yksinkertainen tarkastelu antaa numeron argumentit välitettiin printf-perhe -funktiolle. '
Katso myös
- Sovellusten välinen komentosarja käyttää samanlaista ohjelmointivirhettä
- Sivustojen välinen komentosarja
printfscanf- syslog
- Virheellinen syötteen vahvistus
- SQL -ruiskutus on samanlainen hyökkäys, joka onnistuu, kun syötettä ei suodateta
Viitteet
Lue lisää
- Cowan, Crispin (elokuu 2001). FormatGuard: Automaattinen suojaus printf Format String -haavoittuvuuksilta (PDF) . USENIX Security Symposiumin 10. julkaisu.
- Cowan, Crispin (tammikuu – helmikuu 2003), ohjelmistoturva avoimen lähdekoodin järjestelmille , IEEE Security & Privacy, IEEE Computer Society
- Klein, Tobias (2004). Buffer Overflows und Format-String-Schwachstellen-Funktionsweisen, Exploits und Gegenmaßnahmen (saksaksi) (1 toim.). dpunkt.verlag . ISBN 3-89864-192-9. (vii+663 sivua)
- Seacord, Robert C. (syyskuu 2005). Suojattu koodaus C: ssä ja C ++: ssa . Addison Wesley . ISBN 0-321-33572-4.
Ulkoiset linkit
- Johdatus merkkijonojen hyödyntämiseen 2.5.2013, Alex Reece
- scut / team- TESO Exploiting Format String Vulnerabrities v1.2 2001-09-09
- WASC -uhkaluokitus - muotoile merkkijonohyökkäyksiä
- CERTin suojatut koodausstandardit
- CERT Secure Coding Initiative
- Tunnetut haavoittuvuudet MITRE: n CVE -projektissa.
- Turvallinen ohjelmointi GCC: llä ja GLibc: llä (2008), Marcel Holtmann