-
Translated by Robert Ylitalo
(KYBS2001 course assignment at JYU.fi)
-
♪ (38C3 intromusiikki) ♪
-
Ollaan jo kirimässä menetettyä aikaa.
-
Tervetuloa kaikki meidän esitykseen:
"Matka menneisyyteen: RCE faksikoneen kautta, koska miksei?"
-
Tämä projekti vaati paljon enemmän työtä kuin osasimme odottaa,
joten toivottavasti olette valmiita hyppäämään kyytiin.
-
Nimeni on Rick de Jaeger ja vieressäni on kollegani Carla Meyer tässä 80-luvun henkisessä kuvassa.
-
Ennen kuin mennään liian pitkälle, haluamme aloittaa tunnustuksella.
-
Suuri osa tästä työstä sai inspiraationsa aiemmasta CCC-esityksestä,
-
jossa Eyal Itkin ja Yaniv Balmas hakkeroivat fakseja.
-
He tekivät erinomaista työtä, ja se istutti meille ajatuksen:
-
jos joskus löydämme kirjan, jota voisi lukea faksin kautta, niin meidän pitäisi kokeilla, kuinka vaikeaa se olisi ja se tulisi olemaan hauskaa.
-
Eli vaikka uutuuden viehätys ei ollutkaan varsinainen motivaattori, miksi sitten juuri faksikone?
-
No, tämä kaunis faksilaite on ollut yksi Pwn2Own-kilpailun kohteista jo neljän vuoden ajan.
-
Olemme itse osallistuneet Pwn2Owniin kolmena vuonna.
-
Pwn2Own on nollapäivähaavoittuvuuskilpailu, jossa järjestäjä antaa listan kohteista kolme kuukautta ennen kilpailua,
-
ja osallistujien pitää löytää uusia haavoittuvuuksia, joilla saadaan suoritettua koodia kohdelaitteissa.
-
Pwn2Own-kilpailussa on eri sarjoja:
-
työpöytäsovellukset kuten selaimet ja virtuaalikoneet,
-
autohakkerointi eli automotive,
-
ja sitten IoT-laitteet eli kulutuselektroniikka, jossa me kilpailtiin.
-
Miksi me katsottiin tulostimia?
-
No, me päädyttiin tähän projektiin, kun nähtiin eräs julkaisu CDI-blogissa.
-
Siinä kerrottiin, että jos hakkeroit ensin reitittimen ja siirryt siitä esimerkiksi tulostimeen, voit voittaa 100 000 dollaria.
-
Ajattelimme, että 100K kuulostaa hyvältä, niin koitetaan sitä.
-
Mutta palkintoraha ei ole aina 100K.
-
Jos joku toinen löytää saman haavoittuvuuden, summa pienenee merkittävästi.
-
Tulostimissa hyökkäyspinta on iso, joten on vähemmän todennäköistä, että joku muu löytää saman bugin.
-
Päätettiin siis valita vaikeampi haavoittuvuus, kuten muistinkäsittelybugi.
-
Ne ovat yksityiskohtaisempia ja työläämpiä, joten muut eivät välttämättä löydä juuri samaa haavoittuvuutta.
-
Meillä oli monta tulostinta valittavana, ja strategiamme oli valita sellainen, joka oli kohtuullisen halpa
-
mutta jonka laiteohjelmisto oli salattu.
-
Eli sisäänpääsy vaatii ensin laitteen ostamista, sen purkamista ja firmwaren purkua.
-
Toivoimme, että muut kilpailijat valitsevat helpomman kohteen,
-
jotta he eivät löytäisi samaa haavoittuvuutta.
-
Tässä on siis päähenkilömme: Lexmarkin 331-sarja.
-
Se on ollut Pwn2Own-kohde vuodesta 2021.
-
Me aloitimme vuonna 2022, ja olemme kirjoittaneet siihen exploitin jo kolmesti.
-
Laite perustuu Yocto Linuxiin, joka on varsin järeä käyttöjärjestelmä.
-
Se pyörittää joitain Rust-komponentteja ja Qt-sovelluksia, eli aika moderni kokonaisuus.
-
Verrattuna muihin tulostimiin, sanoisin että Lexmark on tehnyt ihan hyvää työtä
-
tietoturvan saralla.
-
Järjestelmässä on useita käyttäjätilejä,
-
ohjelmistot ovat melko ajan tasalla,
-
ja siellä on yrityksiä hiekkalaatikointiin systemd-komponenttien avulla.
-
Eli he suoriutuvat kohtalaisen hyvin.
-
Mutta me silti hakkeroimme laitteen kolme kertaa, eli ei täydellistä.
-
Ja tärkeimpänä tämän päivän kannalta
-
tässä laitteessa on faksituki.
-
Emme valinneet sitä sen takia, mutta se vain sattui olemaan mukana.
-
Ja me satuimme sen löytämään.
-
Rahan lisäksi, miksi teemme tätä?
-
No, faksien kulta-aika oli ehkä vuoteen -99 asti.
-
Itse olen 25-vuotias, joten tuntuu, että koko faksikulttuuri meni vähän ohi.
-
Tähän projektiin asti en ollut koskaan lähettänyt yhtäkään faksia.
-
Tässä vaiheessa niitä on tullut varmasti satoja.
-
No miten tämä oikein toteutetaan?
-
Ensimmäisenä tarvitsemme tietenkin firmware-kuvan.
-
Ilman sitä tämä olisi täysin sokkona ampumista.
-
Sen jälkeen tarvitsemme jonkinlaisen debuggauksen mahdollisuuden,
-
koska jos haluat hyödyntää muistikorruptiobugia,
-
tarvitset tietoa ohjelman sisäisestä tilasta ja muusta sellaisesta.
-
Eli suunnitelmana oli saada käyttöön hyvä debuggausympäristö
-
joko koodin suorittamisen kautta tai JTAG-debugin avulla.
-
Näiden työkalujen avulla voimme löytää haavoittuvuuden,
-
hyödyntää sitä, kerätä palkkion
-
ja tuoda bugin faksitoimintoon sekä pitää tästä hyvä esitys CCC:ssä.
-
Ja tässä me nyt olemme.
-
Aloitetaan siis firmware-kuvan hankinnasta.
-
Ensimmäinen paikka, josta kannattaa katsoa, on tietenkin Lexmarkin verkkosivusto.
-
Sieltä voi ladata firmware-kuvan.
-
Mutta kun laitoimme sen binwalkin läpi, tuloksena oli pelkkää siansaksaa.
-
Mietimme, että mikäs tässä nyt mättää.
-
Kävi ilmi, että tiedoston entropia oli tosi korkea
-
oikeastaan ihan järkyttävän korkea.
-
Eli hyvin selvä merkki siitä, että kuva on salattu. Valitettavasti.
-
Tässä kohtaa oli selvää, että kuvasta ei ole hyötyä,
-
koska se on salattu emmekä tiedä avaimia.
-
Eli takaisin piirustuspöydälle.
-
Hauska nippelitieto muuten:
-
tulostimen firmwarepäivitys toimitetaan itse asiassa tulostettavana tiedostona.
-
Se on upotettu PostScript-dokumenttiin
-
ja kun tulostat sen, laite päivittää itsensä automaattisesti.
-
Seuraava vaihe oli siis hankkia itse laite.
-
Tässä on kuva tulostimesta autoni takakontissa.
-
Ostimme tämän käytettynä.
-
Kauppa meni suunnilleen näin:
-
Kävin myyjän kanssa keskustelun, ja hän ystävällisesti varoitti:
-
"Oletko varma, että haluat ostaa tämän tulostimen?"
-
Vastasin, että "Joo, miksi en haluaisi?"
-
"No, musteet on melkein lopussa. Ja jos haluat tulostaa, ne on tosi kalliita."
-
"Kannattaa ehkä miettiä toista laitetta."
-
Mutta me ei oltu kiinnostuneita tulostamisesta, joten:
-
"Printataanko? Miksi ihmeessä haluaisin tehdä niin?"
-
Tulostin oli nyt käsissämme
-
ja pääsimme tutkimaan piirilevyä.
-
Huomasimme, että siinä on JTAG-merkinnät, mikä on mahtavaa.
-
Se tekee elämästä todella helppoa.
-
Jos JTAG ei ole sinulle tuttu, se on käyttöliittymä,
-
jonka kautta voi kurkistaa laitteen muistiin,
-
asettaa breakpointteja, muuttaa rekisteriarvoja
-
käytännössä unelmatyökalu exploit-kehittäjälle.
-
Se olisi se kultainen standardi.
-
Eli elämästämme piti tulla helppoa.
-
Kytkimme siis tulostimen Raspberry Pi:hin,
-
jossa on GPIO-portit.
-
OpenOCD:llä voi puhua JTAG-protokollaa kohdelaitteelle.
-
Tuki toimii suoraan “out of the box”, joten kaikki toimi kauniisti.
-
Lähetimme ID-koodikyselyn, ja laite vastasi "ARM Limited"
-
tämä vahvisti, että signaali toimi.
-
Eli emme olleet kuvitelleet mitään.
-
Mutta päivän säätämisen jälkeen selvisi,
-
että mikään muu ei vastaa. Ei mitään mielenkiintoista.
-
Todennäköisesti jotkin toiminnot on kytketty pois päältä ei-haihtuvassa muistissa.
-
Takaisin suunnittelupöydälle siis.
-
Seuraava vaihtoehto firmware-kuvan saamiseksi:
-
juotetaan tallennuspiiri irti emolevyltä.
-
Tämä on aika suoraviivaista, kuumailma-asemalla irti,
-
sitten EEPROM-lukijaan.
-
Käytimme B-PROG C4 -lukijaa.
-
Tämä oli ajalta, jolloin olin vielä opiskelija
-
leikittelin tällä laitteella silloin ja se on yhä tallella.
-
Mutta selvisi, että tämä lukija rakastaa omia, proprietaarisia TSOP48-sovittimiaan.
-
Ja tietysti meillä oli halpa kopio eBaysta,
-
jota se ei hyväksynyt.
-
Mikään ei toki estä tekemästä softakorjausta,
-
mutta en suosittele tätä reittiä.
-
Kannattaa valita laite, jossa on vähemmän kiristyksen makua.
-
Onneksi lopulta saimme sen toimimaan,
-
ja saimme firmware-dumpin.
-
Kävi ilmi, että käytössä on UBI
-
Se ei ole erityisen jännä, mutta toimiva ratkaisu.
-
UBI on lohkonhallintakerros,
-
joka huolehtii viallisista lohkoista, kulumisesta,
-
ja se on kirjoitettu Linuxia varten.
-
Sen sisällä on squashfs-tiedostojärjestelmä,
-
jonka voi purkaa helposti.
-
Purku onnistui, ja saimme käyttöön root-fs:n,
-
joka sisältää kaikki binäärit ja sisällöt.
-
Eli nyt meillä oli dekryptattu firmware-kuva.
-
Mutta entä jos Lexmark julkaisee päivityksen?
-
Meidän pitäisi tehdä tämä koko prosessi uudelleen.
-
Löysimme myös salausavaimet,
-
ja teimme oman purkutyökalun.
-
Joten jatkossa voimme vain ladata uuden firmwaren,
-
purkaa sen itse ja jatkaa suoraan eteenpäin.
-
Mitä tapahtui tulostimelle, kun siru oli irrotettu?
-
No, tietenkin juotin sen takaisin
-
Ja tämä saattaa yllättää
-
että yllättäen se toimii.
-
Nyt kun meillä on firmware-kuva,
-
seuraava tavoite oli saada debuggausmahdollisuus.
-
Mutta laitteessa on secure boot,
-
joten emme voi vain muokata muistipiiriä ja laittaa asentaa takaporttia.
-
Lexmark ei myöskään halua, että loppukäyttäjät pääsevät SSH:lla
-
laitteeseen käsiksi.
-
Eli tarvitsemme exploitin.
-
Kävi ilmi, että NCC Group oli jo löytänyt yhden edellisenä vuonna.
-
He osallistuivat Pwn2Owniin ja kirjoittivat blogipostauksen aiheesta.
-
Mutta he jättivät oleellisia asioita kertomatta.
-
Me kuitenkin pystyimme täydentämään ne puuttuvat kohdat,
-
nyt kun meillä oli firmware itsellämme.
-
Näin saimme root-shellin käyttöön
-
mikä oli mielestämme varsin hyvä juttu.
-
Nyt voimme tutkia järjestelmää,
-
debugata prosesseja esimerkiksi lataamalla GDB-palvelimen.
-
Toki NCC:n löytämä bugi oli jo paikattu uusimmassa firmware-versiossa.
-
Joten emme tietenkään käyttäneet uusinta versiota
-
jos päivität, bugi katoaa ja pitää aloittaa alusta.
-
Mutta tällä välin pystyimme käyttämään tätä kykyä
-
löytääksemme uusia haavoittuvuuksia,
-
jotka ehkä säilyvät myös seuraavassa versiossa.
-
Nyt kun debuggaus toimii,
-
oli aika alkaa etsiä haavoittuvuutta,
-
jonka voisimme lähettää Pwn2Owniin.
-
Ensimmäinen askel tällaisessa tilanteessa
-
on määritellä koko hyökkäyspinta-ala.
-
Ja kuten diasta näkyy, se on valtava.
-
Laite tukee useita protokollia,
-
ja kymmeniä skriptejä ja binäärejä,
-
joita voi ajaa suoraan.
-
Iso määrä erilaisia tuettuja tiedostomuotoja
-
eikä tämä lista ole edes täydellinen.
-
PDF-tiedostot voivat sisältää
-
kaikenlaista kuvadataa, formaatteja ja jopa fontteja.
-
Me valitsimme lopulta jbg2-purkulogiikan,
-
joka on saavutettavissa PDF:n kautta
-
eli voit syöttää sisältöä, joka menee sen käsiteltäväksi.
-
Mutta sama purkulogiikka toimii myös faksin kautta.
-
Tässä on eri tapauksia, joista tiedämme
-
on hyödynnetty kolmen viime vuoden aikana.
-
Kuten näkyy, joukossa on selkeitä klustereita:
-
osa keskittyy web-komponentteihin ja CGI-skripteihin,
-
toiset taas postscriptiin ja heillä on siellä hauskaa.
-
Me puolestamme hyödynsimme JPX decodea, eli JPEG 2000 -formaattia.
-
Ja kuulimme, että tänä vuonna koko komponentti aiotaan poistaa,
-
koska sen kautta päästiin sisään jo kolmena vuotena peräkkäin.
-
Noniin,
-
Siirrytään yhteenvetoon,
-
sillä olemme pwnanneet tämän laitteen nyt kolmena vuonna peräkkäin,
-
joten halusimme antaa yleiskatsauksen.
-
Ensimmäisenä vuonna teimme pohjatyön:
-
firmwaren purku, dekryptaus,
-
ja pysyvyyden rakentaminen tulostimeen,
-
jotta hyökkäys selviää myös päivityksistä.
-
Ensimmäisenä vuotena käytimme tulostinbugia osana ketjua:
-
ensin hakkeroitiin reititin,
-
sitten siirryttiin tulostimeen.
-
Valitettavasti reititinbugi meni rikki päivityksessä
-
bugi oli yhä olemassa, mutta koodi muuttui niin paljon,
-
että exploit ei enää toiminut vakaasti
-
ja esitys epäonnistui lavalla,
-
mutta opimme valtavasti tulostimen hakkeroinnista.
-
Käytimme siihen paljon tunteja, eikä se mennyt hukkaan.
-
Seuraavana vuonna palasimme.
-
Tiesimme, että JPEG 2000 on heikko kohta.
-
Jos vain käynnistämme AFL:n viideksi minuutiksi,
-
löytäisimme uuden bugin.
-
Bugi löytyi ja olimme valmiita Pwn2Owniin.
-
Aloitin lomakkeen täytön, mutta vain muutama tunti ennen deadlinea
-
huomasimme, että uusi päivitys oli julkaistu.
-
Paniikissa asensin sen
-
ja huomasimme, että siinä on nyt täysin uusi kryptaus.
-
Vanha purkutyökalu ei toimi.
-
Pahinta oli se, että päivitystä ei voi peruuttaa.
-
Olimme jumissa.
-
Bluffasimme ilmoittautumislomakkeessa: "kyllä meillä on exploit".
-
Ja exploit toimi, mutta muistikorruptiossa offsetit muuttuivat.
-
Meillä oli 2–3 päivää aikaa korjata se.
-
Huomasin nopeasti, että kryptoa ei murreta kolmessa päivässä.
-
Joten otin yhteyttä Blastieen,
-
joka oli käyttänyt tätä tulostinta edellisvuoden Pwn2Ownissa.
-
Tänä vuonna hän ei aikonut käyttää sitä.
-
Ajattelin: pahimmassa tapauksessa hän sanoo ei.
-
Sanoin: "Meidän exploit meni rikki. Pystytkö auttamaan?"
-
Ja koska Blastie on hyvä tyyppi, hän vastasi: "Totta kai. Mitä tarvitsette?"
-
Sanoin: "Minulla on tämä backdoor, voin lähettää sen sinulle.
-
Jos asennat sen tulostimeesi, se voi mennä rikki
-
mutta jos menee, ostamme uuden.
-
Tai sitten se antaa meille shellin uusimmassa firmwareversiossa."
-
Pyysin häntä ottamaan dumpin hakemistosta /usr/bin,
-
koska emme halunneet vielä kertoa, mitä binääriä hakkeroimme.
-
Blastie mietti hetken ja sanoi: "Aika iso pyyntö. Mitä minä saan tästä?"
-
Sanoin: "Saat pysyvyyden ensi vuodeksi,
-
ikuisen kiitollisuutemme, ja ilmaista juotavaa Pwn2Ownissa."
-
No, vähän huijasimme häntä
-
koska Pwn2Ownissa on avoin baari.
-
Emme siis oikeasti ostaneet hänelle juomia.
-
Mutta lopulta: Blastie pelasti meidät.
-
Exploit toimi, saimme siitä 20 000 dollaria.
-
Seuraavana vuonna hän ei kantanut kaunaa, vaan liittyi tiimiimme.
-
Blastie suuttui uudelle kryptolle ja murtoi sen huvikseen.
-
Tänä vuonna tiputimme kaksi uutta exploittia,
-
joista toinen on se, jonka lähetämme faksin kautta.
-
Kyseinen exploit kohdistuu siis jbg2-kirjastoon.
-
Se on saavutettavissa sekä faksilla että PDF:llä.
-
Alun perin se on tarkoitettu faksikäyttöön.
-
Lexmark kirjoitti oman kirjastonsa
-
ja silloin tietää, että bugia löytyy.
-
Kirjoitimme exploitin ensin PDF:lle
-
se kesti noin viikon.
-
Saatiin rahat Pwn2Ownista.
-
Seuraavaksi se portattiin faksiin, sillä "kuinka vaikeaa se voisi olla?"
-
Itse bugin yksityiskohtia en voi jakaa vielä
-
Lexmarkilla on vielä pari viikkoa aikaa julkaista korjaus.
-
Mutta haluan puhua hieman heap shapingista jbg2:n avulla.
-
jbg2:n maine on, että se on monimutkainen formaatti
-
ja sitä se onkin.
-
NSO Group käytti sitä exploitissa,
-
joka rakensi oman virtuaalisen CPU:n.
-
Mutta koska meidän ympäristössä mitigoinnit ovat heikkoja,
-
emme tarvinneet kaikkea sitä.
-
JPEG 2000 on oikeastaan aika hyvä heap shaping -formaatti.
-
Ei yhtä hyvä kuin PostScript (jossa on melkein tulkki),
-
mutta saat joustavat allokaatiot ja kontrollin olioiden elinkaareen.
-
Jos haluat tehdä ison heap sprayn,
-
voit jopa pakata kaiken toisen kompressioformaatin sisään
-
ja lähettää sen JPEG-pakattuna streamina.
-
Kohde purkaa sen, joten sinun ei tarvitse lähettää paljoa dataa.
-
Me emme käyttäneet sitä, mutta se voisi olla hyödyksi.
-
Me käytimme pääasiassa extensions-segmenttejä.
-
Ne ovat valmistajakohtaisia osia JPEG-streamissa,
-
joiden avulla voi toteuttaa mitä tahansa ei-standardoitua.
-
Lexmark käyttää vain comment-segmenttiä,
-
joka on yleinen tapa lisätä debuggaukseen tarkoitettua dataa.
-
Ne ovat siistejä, hallittuja allokaatioita.
-
Jos sanot: “haluan kommentin, jossa on tätä dataa”,
-
se data menee heapille suoraan ilman säätöä.
-
Toteutuskin on helppoa.
-
Joten et tarvitse rasterointeja, matikkaa tai kompressiota.
-
Tältä näyttää Lexmarkin kirjaston rakenne,
-
siinä on tyyppi, osoitin dataan ja koko.
-
Jokaisella segmentillä (ei vain kommenteilla)
on tällainen header.
-
Ja mikä tärkeintä: niissä on osoittimia.
-
Eli jos teet muistikorruptiota, tämä on hieno hyökkäyspinta.
-
Tältä meidän kirjastomme näytti.
-
Se hyvin paljon monimutkaisempi,
-
Kun varsinaisesti implementoit sen siihen haavoittuvuuteen.
-
Esimerkiksi kommentin rakentaminen oli yksinkertaista,
-
funktio tekee ID:n ja datan,
-
ja parseri näkee sen vain kommenttina,
-
Ja tämä data päätyy muistiin.
-
Et hallitse ensimmäisiä 16 tavua (ID, tyyppi, koko),
-
mutta datan pituutta ei ole rajoitettu ja se voi olla niin suuri kuin haluat.
-
Jos yhdistät kaiken tähän asti,
-
PDF-tiedosto sisältää hyökkäyksen, joka näyttää jotakuinkin tältä.