|
Keskiviikko, 12.11.2003 Eudora-sähköpostiohjelmistossa vakava haavoittuvuusSuositun Eudora-sähköpostiohjelmiston Windows-versiosta on löytynyt uusi puskuriylivuotohaavoittuvuus, joka voi antaa hyökkääjälle mahdollisuuden suorittaa kohdetietojärjestelmässä omia komentojaan. Haavoittuvuuteen liittyvä puskuriylivuoto tapahtuu, kun käyttäjä vastaa "Reply To All" -toiminnolla sähköpostiin, jossa "From" tai "Reply To" -kenttä sisältää ylipitkän merkkijonon. Eudorasta on jo aiemmin löydetty toinen puskuriylivuotohaavoittuvuus, joka liittyy pitkien tiedostonimien käsittelyyn.
Lue juttu oma, 12.11.2003 00:02. Lähde: CERT-FI, Eudora.com
|
|
Anonyymi kommentoija, 12.11.2003 09:31:03
Miksei voida yksin kertaisesti myöntää, että reikiä löytyy kaikista softista (ihminen kun on erehtyväinen). Reikien korjaaminen on toinen juttu...
hanska, 12.11.2003 10:12:07
Hanska
Anonyymi kommentoija, 12.11.2003 11:52:19
bungle, 12.11.2003 11:28:28
http://www.cs.fit.edu/~tr/cs-2002-12.pdf
"See the animal in his cage that you built, are you sure what side you're on?" -- Trent Reznor
heko, 13.11.2003 00:49:00
Ylivuotoja ja niiden haittoja voidaan torjua olennaisesti kolmella tavalla: ohjelmointimetodiikalla, jossa vältetään ylivuotojen kirjoittamista; työkaluilla, jotka estävät ylivuotojen syntymisen; sekä työkaluilla, jotka rajoittavat ylivuodon vaikutusten eskaloitumista.
Ohjelmointimetodiikan osaltakin voidaan puhua sekä tietystä ymmärryksestä ja asenteesta (ohjelmoija ymmärtää, mikä on osoitin, mikä on muistialue ja mikä on muistivaraus sekä yrittää pitää nämä reunaehdot mielessään ohjelmoidessaan; pyritään siihen, että ohjelmoija suunnittelee ja toteuttaa ratkaisun huolellisesti nimenomaan laatua silmällä pitäen; pyritään siihen, että useampi ohjelmoija todella lukee koodin läpi ja pyrkii nimenomaan etsimään siitä virheitä tai varmistumaan sen oikeellisuudesta) että mekaanisemmista työkaluista (C:ssä esim. konventio käyttää OpenBSD:ssä kehitettyjä strl-funktioita: http://www.courtesan.com/todd/papers/strlcpy.html tai muuten kirjoittaa koodinsa tietyllä hyvänä pidetyllä tavalla). Tällä alueella useimmissa ohjelmointiympäristöissä on parantamisen varaa syistä, joita en lähde tässä erittelemään (ja ehkäpä en jopa niitä täysin osaisikaan eritellä :-): käytännössä ohjelmoija usein miettii vain hänen kannaltaan mukavimman tavan ratkaista jokin ongelma ja pitää sitä valmiina heti, kun se näyttää toimivan jossain esimerkkitapauksessa.
Työkaluiksi, joilla pyritään estämään ylivuotojen syntyminen, voidaan lukea kaikenlaisia: "mekaaninen" blackbox-testaus (jonka kritiikkiä esitetään mm. "Writing Solid Code"-klassikossa) ja koodia analysoivat työkalut; ehkä ohjelmointikieletkin, joissa pointterit eivät näy käyttäjille. Näillä ratkaisuilla on omat heikot puolensa; yhteisinä heikkouksina voidaan pitää mm. (ensinnäkin) sitä, että ne ovat mekaanisen ja "pinnoitusmaisen" luonteensa vuoksi epätäydellisiä, mutta että ne (toisekseen ja tästä johtuen) luovat silti usein väärää turvallisuudentunnetta. Jos ohjelmoija alkaa luottaa tällaisiin työkaluihin jonkinlaisena laadun takeena, hän luultavasti keskittyy entistäkin vähemmän huolelliseen suunnittelu- ja toteutustyöhön laadun näkökulmasta. Blackbox-testauksessa ei voida käytännössä käydä läpi kaikkia mahdollisia käyttötilanteita; koodia analysoivat työkalut eivät käytännössä koskaan ole täydellisiä (käytännössä lähes kaikissa kääntäjissäkin on varoituksia, jotka on mahdollista kytkeä päälle, mutta jotka silti mahdollistavat ohjelmointivirheet, kts. esim. http://sektori.com/uutiset/5130/linux-ytimeen#k567... ); kaikki kielet itse käyttävät jollain tapaa pointtereita, ja niiden virtuaalikonetoteutuksista löytyy bugeja (jotka voivat siten olla paljon fataalimpia kuin yksittäiset bugit yksittäisissä ohjelmissa), ja lisäksi niillä toteutetuissa ohjelmissa voi olla bugeja, jotka faktisesti vastaavat "buffer overflow":ta mutta käytännössä vain näkyvät vähän eri tavalla ja aiheuttavat erilaisia ongelmia. (Javassa esim. NullPointerException ja ArrayOutOfBoundsException; vastaavia ongelmia silloin, kun tällaisiakaan ei synny, on se, että esim. jokin merkkijono vain "näkymättömästi" lyhenee ilman, että siitä käyttäjälle ilmoitetaan.)
Viimeisenä listassa pitäisin niitä retroaktiivisia työkaluja, joilla pyritään estämään overflow'n vaikutusten eskaloituminen. Tällaisia ovat esim. kääntäjän tarkistukset (jotka voidaan kiertää; kts. esim. http://www.phrack.org/show.php?p=56&a=5 ) sekä muistinhallinnan tarkastukset (jotka voidaan kiertää; kts. esim. http://secinf.net/info/unix/stack.txt ; ftp://ftp.netsys.com/pub/archives/linux_lpr.c ; http://www.nextgenss.com/papers/defeating-w2k3-sta... ). Kaikki nämä ratkaisut ovat ensinnäkin ainakin yksin ja itsessään riittämättömiä ja ne voidaan kiertää, ja ne voivat aiheuttaa samanlaista väärää turvallisuudentunnetta kuin ylempänä tarkistustyökalut. Toisekseen ne vain ehkäisevät buffer overflow'n avulla suoritettavan injektiohyökkäyksen: ne eivät korjaa bugeja (vaikka jotkut ratkaisut voivat auttaa niiden löytämisessä, koska ne virhetilanteissa kohdistavat huomion oikeaan bugiin), ne eivät ehkäise muunlaisia hyökkäyksiä (esim. DoS hyökkäys palvelimeen, joka segfaulttaa tietyssä tilanteessa), eivätkä ne ehkäise muita ongelmatiloja kuin hyökkäyksiä.
Toisin sanoen sekä toinen että kolmas kategoria ovat selkeästi retroaktiivisia toimintamalleja: ne pyrkivät minimoimaan vahinkoa, eivät estämään sitä. Ohjelmissa on niistä huolimatta muita turva-aukkoja ja ohjelmien laatu on niistä huolimatta yhä heikkoa. Yleisesti ottaen voidaan sanoa, että mikä tahansa "tietoturva-aukko" on bugi myös siinä mielessä, että se voi aiheuttaa vahinkoa silloinkin, kun sitä ei aktiivisesti yritetä hyödyntää, vaikka usein pienemmässä mittakaavassa (mutta ei välttämättä vähemmän tuhoisin seurauksin, jos se yksi vahinko sattuu kriittisessä tilanteessa). Käänteisesti keskittyminen laatuun ja oikeellisuuteen (tai "virheettömyyteen") vähentää automaattisesti myös tietoturva-aukkoja.
Kaiken kaikkiaan kuvattuja metodeja kannattaa yleensä kaikkia käyttää, jos se on mahdollista. Yksi tapa ei joko ihmisen tai koneen heikkoudesta johtuen vielä poista kaikkia ongelmia, mutta yhdessä nämä tavat vaikeuttavat todella merkittävissä määrin tietoturvanäkökulmasta hyökkääjän mahdollisuuksia saada aikaan vahinkoa tai oikeudetonta hyötyä. Jos ohjelmakoodiin on alun perin kirjoitettu 10 bugia per 1000 riviä vs. 100 per 1000 riviä, jos tarkistustyökalut löytävät näistä 9 ennen kuin bugit päätyvät ajoon versus 0 löydettyä bugia ("if it compilers, it's perfect!"), ja jos erilaiset mekaaniset työkalut saavat aikaan sen, että hyökkääjän pitäisi saada kierrettyä kääntäjän manipulointi ja stackin suojaus vs. yksinkertainen shellcode-injektio, ja ihmetellä chrootissa uidina 65534 ilman shelliä tai kääntäjää vs. uidina 0 /-nodessa, uskallettaneen arvioida, että järjestelmän tietoturvaa on kohennettu huomattavasti.
Heikki http://www.heikkikorpela.fi heikki@heikkikorpela.fi
weicco, 12.11.2003 10:34:34
Itse C:tä koodanneena ymmärrän, että puskurin ylivuotovirhe on helppo tehdä, mutta pienellä harjoittelulla sitä osaa välttää. Jotkut kielet taas mahdollistavat kaikenmaailman toimintoja, joiden pitäisi automaattisesti korjata tällaisia. Kuulemma ovat toimiviakin, mutta silti näitä ongelmia vain esiintyy...
Lisäksi on myös olemassa ohjelmia, jotka tarkastavat koodin ja varoittavat mahdollisista ylivuodoista sekä muista mahdollisista bugeista. Voisikin Eudoran kehittäjätiimille suositella jotain tällaista :)
Anonyymi kommentoija, 12.11.2003 12:24:43
bungle, 12.11.2003 15:32:50
"See the animal in his cage that you built, are you sure what side you're on?" -- Trent Reznor
weicco, 12.11.2003 13:15:23
Anonyymi kommentoija, 14.11.2003 12:00:22
superhoe, 12.11.2003 10:41:49
Anonyymi kommentoija, 12.11.2003 11:31:05