[Translated by {Iikka}{Yli-Kuivila} (ITKST56 course assignment at JYU.FI)]
*33C3 preroll-musiikkia*
Heralnd: Max on turvallisuustutkija Look- out:lla, hän on tehnyt tätä noin 10 vuotta
hän on viettänyt paljon aikaa hämäämisen, hyväksikäyttömenetelmien kehittämisen ja
turvallisuustutkinna parissa, hän on puhu- nut Black Hat:issä, hän keskittyy nykyisin
mobiiliturvallisuuteen ja hänen väitös- kirjaansa. Hän kertoo teille Pegasus-
haittaohjelman sisuksista tänään. Ja nyt annetaan Maxille vuoronsa.
Max: Kiitokset.
*aplodeja*
M: Terve kaikki, nimeni on Max Bazaliy, ja tänään juttelemme Pegasuksen sisus-
värkeistä. Olen Kiovasta, Ukrainasta, työskentelen nyt turvallisuustutkijana
Lookout:illa ja viimeisen parin vuoden aikana olen keskittynyt jailbreak-teknii-
koihin. Sen vuoksi olin mukana perustamas- sa Fried Apple-tiimiä ja olen työskenellyt
monien iOS-jailbreakkien parissa, ml. 8 ja 9. Niin, Pegasus. Pegasus on korkean
laadun vakoiluohjelmisto, jota voi käyttää laitteen täydelliseen vakoiluun. Mitä ta-
hansa henkilökohtaisen datan varastami- sesta mikrofonin tai kameran etäaktivoin-
tiin laitteella ilman mitään indikaatiota siitä että jotain tapahtuu. Jotta Pegasus
voi toimia, sen pitää jailbreakata laite ensin, koska iOS:n hiekkalaattikko-ominai-
suus estää sovelluksia vakoilemasta toi- siaan. Sen vuoksi Pegasus nojaa Trident
haavoittuvuusketjuun saadakseen koko lait- teen hallintaansa, ja asentaakseen pysy-
vyyskomponentin, jota voidaan käyttää laitteella. Tässä on todella pelottava
lista maalitetuista sovelluksista, joista osa tunnetaan hyvin turvallsiina, kuten
Telegram, WhatsApp, Viber ja olen melko varma että löydätte tuosta listasta suo-
sikkiviestimenne. Ennen kuin mennään sy- vään tekniseen analyysiin käytetyistä haa-
voittuvuuksista, hlauan kertoa teille kui- nka tähän päästiin, Pegasus-näytteeseen.
Poliisi tapasi Ahmed Mansoorin, joka tun- netaan ihmisoikeuksien puolustajana. Hän
on saanut jopa Martin Ennal-palkinnon, jo- ta pidetään ihmisoikeuksien Nobelin pal-
kintona. Joten, ymmärtääkseni Ahmed vas- taanotti tänä vuonna tekstiviestin, jossa
sanottiin että joku on valtion vankilassa. Hän ja joku muu saivat toisen samankal-
taisen tekstarin seuraavan päivänä. Mutta hän oli ollut hakkeroinnin kohteena 2012
ja hänelle tartutettiin FinFisher 2011. Joten nyt linkin klikkaamisen sijaan hän
kontaktoi Citizen Labia, koska hän oli työskennellyt heidän kanssaan aiemmin.
Hän lähetti linkin Citizen Labille analyy- siä varten ja me Lookoutin tutkimustiimis-
sä saimme tämän ensimmäisen näytteen ja linkin Citizen Labilta. Tässä puheessa
keskityn enimmäksene tekniseen osioon. Toimiakseen Pegasus nojaa Trident-haavoit-
tuvuusketjuun, joka toimii kolmessa vai- heessa. Ensimmäisessä vaiheessa se kor-
ruptoi muistia saavuttaakseen koodin etä- ajamista Safarin kontekstissa. Sen jälkeen
se hyppää laitteella toiseen vaiheeseen ja käyttää kahta haavoittuvuutta hyväksikäyt-
tääkseen kerneliä. Toinen hyödyntää yti- men Address Space Layout Randomisationia,
ja toinen hankkii ytimen tasolla tapahtu- van koodin etäajokyvykkyyden, RCE:n.
Lopuksi kolmannessa vaiheessa se asentaa vakoiluohjelmiston ja
käyttää erikoista temppua saavuttakseen laitteella pysyvyyttä.
Keskityn jokaiseen vaiheeseen yksityis- kohtaisesti. Ensimmäisessä vaiheessa tulee
kertakäyttöinen spear-phish URL, joka in- validoidaan ensimmäisen klikkauksen jäl-
keen. Se sisältää peiteltyä JavaScriptiä, joka ensimmäiseksi tarkistaa laitteen tyy-
pin: onko se iPhone, iPad, 32- vai 64-bit- tinen. Ja perustuen tietoon, minkä tyyppi-
nen prosessori laitteella on, siihen lada- taan tietty versio höykkäyskoodista. Mikä
on vaihe kakkosessa. Ja lopuksi se hyväk- sikäyttää RCE-haavoittuvuutta WebKit:ssä
suorittaakseen tuon hyökkäys (shell) -koodin. Niin, mitä haavoittuvuuttaa se
käyttää? CVE 4657 etäkäyttöhaavoittuvuutta WebKitissä. Periaatteessa haavoittuvuus on
Use-After-Free, joka saavutetaan kahdella bugilla ja näytteessä, jonka me saimme
se ei ollut vakaa, koska se nojaa WebKit:n automaattiseen roskienkeräykseen.
Ongelma asustaa MarkedArgumentBuffer:issa, jota voidaan hyväksikäyttää määriteltyjen
ominaisuuksien avulla (defined properties) Defined properties on metodi, joka määrit-
tää uusia tai muuttuneita ominaisuuksia suoraan oliossa. Se ottaa vastaan muutamia
argumentteja, olion itsessään, ja ominai- suudet-olioita, joilla voi olla deskripto-
reita, jotka muodostavat ominaisuuden jota määritellään tai muokataan. Sillä on aika
yksinkertainen algoritmi, se sisältää muu- tamia silmukoita ensimmäisellä iteraatio-
lla jokaiselle ominaisuus-deskriptorille jolla se tarkistaa alustuksen, ja sen
jälkeen se liittää sen deskriptorin vekto- riin ja varmistaakseen ettei viittaukset
ominaisuuksien deskriptoreihin happane, niitä suojellaan automaattiselta roskien-
keruulta. Tätä tarkoitusta varten Marked- ArgumentBufferia käytetään. Näemme tässä
lopussa MarkedArgumentBuffer append:n. MarkedArgumentBuffer estää olioita tuhou-
tumasta. Ja jokaisen property-get:n onnis- tuneen validoinnin jälkeen tuo defineOwn-
Property assosioi jokaisen käyttäjän anta- man ominaisuuden kohde-oliolle.
Ja tässä on ongelma, koska kun definePro- pertyä kutsutaan on mahdollista kutsua
mitä tahansa käyttäjän määrittelemää Java- Script-metodia. Ja jos näissä JavaScript-
metodeissa roskienkeruu saadaan laukaistua se tulee de-allokoimaan kaikki merkitse-
mättömät heapissä (keossa) olevat oliot. Menen vähän syvemmälle yksityiskohtiin:
ensinnäkin pari sanaa MarkedArgumentBuffer :sta ja JavaScriptin roskienkeruusta.
JavaScriptin roskienkeruu on vastuussa olioiden de-alolokoinnista muistista, kun
niihin ei enää viitata. Se ajetaan satun- naisin väliajoin perustuen silloiseen
muitipaineeseen, laitetyyppiin ja niin edelleen. Kun roskienkeruu on tarkis-
tanut pitääkö olio deallokoida, se menee pinon (stack) lävitse ja tarkistaa
viittaukset objekteihin. Viittaus objektiin voi olla olemassa myös sovellus-
keossa, mutta tässä tapauksessa vaihtehto- ista tapaa käytetään, jota kutsutaan slow-
Appendiksi. Joten, MarkedArgumentBuffer koostuu ensimmäisistä pinossa sijaitse-
vista kahdeksasta arvosta. Se tarkoittaa, että kun yhdeksäs arvo lisätään, Marked-
ArgumentBufferin kapasiteettia laajenne- taan. Se tullaan siirtämään pinomuistista
kekomuistiin. Tätä slowAppend tekee. Slow- Append siirtää puskurissa olevan pinon
kekoon ja nyt olio ei olekaan automaatti- sesti suojeltu roskienkeruulta. Jotta
varmistetaan, että noita olioita ei deallokoida, ne pitää lisätä
keon markListSet:iin. Tämän me näemme tässä. Joten,
slowAppend yrittää saada kekokontekstia ja se voidaan saada lisäämällä olio, esim.
merkitsemällä olio markListSet:iin. Ja tässä on ongelma, sillä kun keko-kontek-
stia hankitaan, se voidaan hankkia pelkäs- tään monimutkaiselle oliolle. Tämä tarkoit
taa, että perustyypit kuten integer, bool- ean tai muut, ne eivät ole keossa olevia
olioita ja niitä ei merkitä markListSet:iin.
Ja slowAppendissa on bugi. Meidän pitäisi pystyä kutsumaan sitä vain kerran. Eli kun
puskuri siirretään pinomuistista kekomuis- tiin ja jokin ominaisuuksista on yksinker-
tainen tietotyyppi, esim. integer, niitä ei automaattisesti suojella roskienker-
uulta, ja kaikki sitä seuraavat arvot ei- vät myöskään tule olemaan suojeltuja
koska slowAppendissa on tuo bugi. Tässä on kuva, joka havainnollistaa sitä ja todel-
lisuudessa viittaus JavaScript-olioon on yhä vieläkin olemassa.
Mutta jos kutsuttaessa definedOwnProperty- metodia yksikään käyttäjän antamista
metodeista kutsutaan, ne voivat poistaa tämän viittauksen ja olio deallokoidaan.
Yhteenvetääkseni kaikki tieto on tässä, kuinka sitä voi hyväksikäyttää.
Me määrittelemme props-olion, joka sisäl- tää 12 deskriptoria ja niistä ensimmäiset
yhdeksän ovat yksinkertaisia tyypiltään, kuten 0:sta 8:aan. Joten p8, joka on
yhdeksäs arvobitti, tullaan lisäämään markListSeti:in. Se laukaisee slowAppendin
ja puskuri siirretään pinosta kekoon. Ja seuraava arvo on pelkkä pituus, tyypillä
not_number, ja seuraava taulukko niitä ei tulla merkitsemään markListSet:iin ja
niitä ei automaattisesti suojella roskien- keruulta.
Mitä tapahtui seuraavaksi, kun erilaisia ominaisuuksia kutsutaan length-ominaisuu-
delle ja siinä yritetään muuttaa not_- number:ia numeroarvoksi käyttäjän määri-
tettyä, että toString-metodi kutsutaan tuossa tapauksessa. ToString-metodi pois-
taa viimeisen viittauksen taulukkoon ja pakottaa roskienkeruusyklin päälle allo-
koimalla ison määrän muistia. Joka johtaa siihen, että olio deallokoidaan roskien-
keruun toimesta. Seuraavaksi se uudelleen- allokoi olion hapantuneen päälle. Tämä oli
miten tätä erityisesti rakennettua use- after-free:tä käytetiin Safarissa koodin
etäajokyvykkyyden saavuttamiseksi ja shell -koodin ajamiseksi. Shell-koodi on mukana
toisessa vaiheessa, missä hyötykuorma koostuu shell-koodista ja tiivistetystä
datasta. Mielenkiintoisin seikka meille on shell-koodi koska sitä käytetään kernelin
hyväksikäyttööön Safari-kontekstissa, ja tiivistetty data on periaatteessa lataaja,
joka lataa ja purkaa salauksen seuraavassa vaiheessa. Yksi haavoittuvuus, jota käy-
tettiin oli CVE 4655 mikä on tiedonvuoto- haavoittuvuus, jota käytettiin kernelin
osoiteavaruussatunnaisuuden päihittämiseen Se hyväksikäyttää sitä, että konstruktori
ja OSUnserializeBinary-metodi eivät tar- kista rajoja. Eli hyökkääjä voi luoda OS-
Number-olion todella suurella bittimää- rällä ja kutsua sitä sovellushiekkalaati-
kossa io_registry_entry_get_property_bytes :lla.
Tältä se näytti. Eli OSUnseralizeBinary- metodi käsittelee binäärin jaksotuksia
kernelille. Se konvertoi binääriformaatin kernelin perus-dataobjektiksi.
Se tukee useita eri tietotyyppejä, listoja , sanakirjoja, tualukkoja, oliotyyppejä,
stringejä, numeroita ja tässä kiinnostava on siis OSNumber. Kuten näeme tässä, sille
annetaan kaksi argumenttia: arvo ja pituus eikä siinä ole oikeaa tarkistusta pituus-
arvolle. Se tarkoittaa että voimme hallita oliolle annettua pituutta. Ja miksi
se on ongelma? Koska tässä on OSNumber: init-konstruktori ja kuten nähdään niin
pituus-arvo, joka annetaan tässä, on new- NumberOfBits ja se ylikirjoittaa pituus-
arvo-muuttujan. Ja ongelma muodostuu siitä, että tuota kokoa käytetään muissa
metodeissa, esimerkiksi OSNumber number- OfBytes:issa, joka johtaa siihen että
paluuarvo numberOfBytes:ille on nyt täysin hyökkääjän hallussa. Mikä on erittäin paha
sillä sitä käytetään seuraavaksi io_regis- try_entry_get_property_bytes:issa, joka
käsittelee OSNumber:eita ja se käyttää tuota numberOfBytes:ia laskeakseen olion
pituuden, OSNumber:n pituuden. Valitetta- vasti se käyttää pinoperustaista puskuria
parsintaan ja tallentaa OSNumber-arvon. Mitä tapahtui seuraavaksi, se kopioi muis-
tin kernelin pinosta kekoon, käyttäen hyök -kääjän hallinnassa olevaa pituutta. Mikä
tarkoittaa että voimme kertoa kuinka mon- ta tavua kopioidaan kernelin pinosta ja
palautetaan käyttäjäavaruuteen. Käy näin: einsimmäiseksi luodaan ominaisuus-taulukko
jossa on sanakirja, jossa on OSNumber pit- källä pituudella, meidän tapauksessa 256.
Seuraavaksi luodaan käyttäjän asiakasoh- jelma kutsumalla IOService open extend:iä
joka deserialisoi tämän OSNumber-olion ja luo tämän olion ytimessä. Ja nyt meidän
täytyy lukea se kutsumalla IORegistry- EntryGetPropertyä, joka johtaa että:
kopioimme 256 tavua kernelin pinomuistia ja tämä ytimen pinomuisti sisältää kernel-
osoittajia. Kernel-osoittajilla voidaan määrittää kernelin perusta. Joten nyt
saamme kernelin perustan selville ja voimme hypätä seuraavaan haavoittuvuuteen,
joka on CVE 4656, use-after-free jolla saavutetaan kernel-tasoinen koodiajo. Se
hyävksikäyttää tietoa, koska setAtIndex- makro ei oikeasti säilytä oliota, ja me
voimme laukaista sen myös sovellushiekka- laatikon sisältä OSUnSerializeBinaryllä.
Ja kertaukseksi, OSUnSerializeBinary on funktio, joka parsii ja deserialisoi
olioita kernelissä. Se tukee erilaisia tietotyyppejä, erilaisia sisältötyyppejä.
Ja mikä on milenkiintoista on se, että se tukee kOSSerialize-oliota.
Se tarkoittaa että voimme luoda viittauk- sen toiseen olioon. Erittäin hyödyllinen
tulevaisuudessa, koska olioiden deseria- lisoinnin ja parsinnan yhteydessä OSUnse-
rializeBinary tallensi olio-osoittimen erityiseen oliotaulukkoon. Ja käyttämällä
setAtIndex:iä siihen. Ja kuten näemme set- AtIndex vain tallentaa olio-osoittimen
taulukkoon johonkin kohtaan, tallentamatta oliota. Se on huono asia, sillä seuraavas-
sa koodissa OSString tyyppimuunnetaan OS- Symbol:iksi se vapauttaa olio-osoittimen.
Mitä se meinaa? Meillä on vieläkin tauluk- ko jossa on kaikki olio-osoittimet joka on
oliotaulukko ja me juuri vapautimme olion, mutta säilytimme olio-osoittimen. Jos me
voimme luoda viittauksen objektiin, voimme hyväskikäyttää use-after-free:tä. Tämä
tapahtuu, sillä kOSSerializeObject sallii meidän luoda viittauksen ja me kutsumme
säilytystä jo valmiiksi deserialisoidulle, deallokoidulle oliolle. Tältä tämä exploit
näyttää. Joten ensimmäiseksi, luomme OS- dictionary:n joka sisältää stringin, joka
tämän bugin vuoksi deallokoidaan. Joten nyt meidän täytyy uudelleenallokoida se
meidän hallinnassa olevalla oliolla, jotta se mahtuu samaan muistipaikkaan. Meidän
tapauksessamme se on OSString, ja muistis- sa oleva OSString-luokka vie 32 tavua.
Meidän täytyy allokoida sama koko. Tähän tarkoitukseen OSData on täydellinen kandi-
taatti sillä me hallitsemme OSData-pusku- ria: sen kokoa ja sisältöä. Me voimme luo-
da tekaistun OSStringin tekaistulla vtab- lella: vtable osoittaa joihinkin numeroi-
hin kernelissä. Viimeiseksi meidän täytyy laukaista use-after-free lisäämällä kOS-
SerializeObject. Joten: OSString deseria- lisoitiin, deallokoitiin, uudelleenallo-
koitiin uuteen olioon joka on OSData-pus- kurissa, joka osoittaa samaan muisti-
paikkaan: Saimme aikaan use-after-free:n. Saavutettuamme use-after-free:n, Pegasus
tekee jotain kernel-paikkauksia kytkeäk- seen pois päältä turvakontrolleja, kuten
setuid:n asettamisen käyttöoikeuksein laa- jentamiseksi, amfi-tsekkausten ohituksen,
poistamalla amfi_get_out_of_my_way:n, kyt- kemällä pois koodin allekirjoitusvaadinnan
ylikirjoittamalla cs_enforcement_disable- muuttujan ja lopulta se uudelleenmounttaa
järjestelmäosion niin, että se on luetta- vissa ja kirjoitettavissa, jotta se voi
suorittaa lataajan jollla se lataa ja pur- kaa seuraavan vaiheen. Seuraavassa vai-
heessa on oikeat vakoiluasiat, joita käy- tetään esim. tekstiviestien, puheluiden ja
henkilökohtaisen datan kuunteluun. Siinä on kolme ryhmää. Yksi on prosessiryhmä,
jossa pääprosessina on kuuntelupalvelu- malli, joka käyttää SIP-protokollaa C2-
kommunikointiin, prosessimanageri ja niin edelleen. Seuraava kiinnostava ryhmä on
dylibs-ryhmä, koska Pegasus nojaa Cydia substrate-jailbreak framework:iin, jonka
he uudelleennimesivät libdata:ksi. Se käyttää Cydia substratea injektoidakseen
dynaamisia kirjastoja sovellusprosessiin. Meidän tapauksessamme meillä oli kirjasto-
ja Viberille, WhatsAppille, joita voitiin injektoida sovellusavaruuteen jotta saa-
tiin sovellushookit asennettua. Ja viimei- senä on com.apple.itunesstored-tiedosto.
Se on JavaScriptiä, joka sisältää shell- koodin joka suoritetaan ja joka voi suo-
rittaa allekirjoittamatonta koodia. Kes- kityn siihen seuraavaksi. Bugi on olemassa
JSC-binäärissä. JSC-binääri on apuri Java- Scripitin ytimelle Apple:lla. Se voi joh-
taa allekirjoittamattoman koodin ajami- seen. Yhdistämällä se rtbuddyd-temppuun
sitä voidaan käyttää saavuttamaan täysi pysyvyys laitteella. Se hyväksikäyttää
huonoa tyyppimuunnosta setEarlyValue-meto- dissa, joka onneksi voidaan laukaista vain
Jesty-sovelluskontekstissa. Joten mikä on ongelmana? Se hyväksikäyttää JavaScript:
issä olevaa ongelmaa sitomalla SetImpure- GetterDelegate:n C++:n funktioon SetImpu-
reGetterDelegate. Tämä funktio ottaa pari argumenttia: yksi on impureGetter ja toi-
nen on geneerinen isObject, joka asetetaan täksi impureGetter-delegaatiksi.
Ongelma on - seuraava dia - että me parsimme kaksi argumenttia ja sitten kut-
sutaan setDelegate:a. SetDelegate kutsuu set:iä, joka lopulta kutsuu setEarlyValuen
Tässä on ongelma, sillä tässä ei ole var- sinaista tarkistusta sille, että olio,
joka annetaan setImpureGetterDelegate:lle on oikeasti ImpureGetter.
Se tarkoittaa, että jos sille annetaan mikä tahansa muu olio, niin sille tehdään
huono tyyppimuunnos ImpureGetter-osoitti- mena. Näin tässä kävi. Eli se on huono
tyyppimuunnos, jossa ei ole varsinaista tarkistusta olion tyypille, mikä johtaa
olion kenttien ylikirjoittamiseen. Tässä on sama funktio, mutta takaisinkäännet-
tynä IDA Pro:lla. Meidän tapauksessa Impu- reGetter on perusmuuttuja tässä, ja dele-
gaatti on tämä geneerinen JS-olio. Näemme, että osoitin joka on perus +16, voidaan
ylikirjoittaa osoittimella delegaattiin. Joka johtaa - näette oikealla JSArray-
BufferView-luokan - jos välitän JSArray- BufferView-luokan ensimmäisenä argument-
tina, m_vector-kenttä ylikirjoitetaan osoittimella delegaattiin.
Mikä on hyvin huono, sillä se voi johtaa luettaviin, kirjoitettaviin primitiiveihin
Hyväksikäyttääkseen tuota, Pegasus käyttää kahta dataview:iä. Minä kutsun niitä data-
view1:ksi ja dataview2:ksi. Niile kutsu- taan ja suoritetaan setImpureGetterDele-
gate molempiin, mikä johtaa dataview1:sen m_vector-kentän ylikirjoittamiseen osoit-
timella dataview2:seen. Ja nyt, asettamal- la ja lukemalla arvot ensimmäisestä data-
view:stä voimme ylikirjoittaa toisen data- view:n tietokentät. Kun tarvitsemme, voim-
me asettaa toisen dataview:n koko prosessi -muistiin ylikirjoittamalla toisen data-
view:n taulukkopuskurin offset:n olemaan 0 ja ylikirjoittamalla toisen dataview:n
pituuden olemaan 4 gigatavua 32-bittisellä prosessilla ja asettamalla tyypiksi fast
array-tyypin. Joten periaatteesas toinen dataview sisältää nyt koko prosessiavaruu-
den ja voimme getint:ata, setint:ata, lukea ja kirjoittaa minne tahansa prosessi
-muistissa. Samaa asiaa voidaan käyttää jopa suoritusprimitiivien hankkimiseen.
Tässä tapauksessa me kutsumme setImpure- GetterDelegate:a kahdesti ja sen sijaan,
että paljastamme koko prosessimuistin me vain vuodamme olion osoitteen. Jos voi-
daan vuotaa olioiden osoitteita, voimme tehdä funktion jolla on satoja tyhjiä try-
catch lauseita ja pakottaa JIT kääntämään se. Ja tässä prosessissa erikoinen luet-
tava, kirjoitettava, suoritettava muisti- alue allokoidaan. Voimme vuotaa tämän
JIT-osion osoitteen, ylikirjoittaa sen shell-koodilla ja suorittaa sen.
Joten tämä on miten huonoa tyyppimuunnosta voidaan käyttää kernelin uudelleenhyväksi-
käyttöön jokaisen buutin yhteydessä. Sitä käytetään pysyvyysmekanismi rtbuddyd:n
kanssa. Ongelmana on että System luo rtbuddyd-palvelun erikoisella early-boot
argumentilla. Eli voidaan ottaa ottaa mikä tahansa toinen binääri, jonka allekirjoit-
tajana on Apple, nimetä se rtbuddyd:ksi ja se ajetaan buutin yhteydessä. Tätä Pegasus
tekee. He ottivat JSC-binäärin, joka on Applen allekirjoittama, nimesivät sen rt-
buddyd:ksi, ja sitten otetaan JavaScript joka sisältää hyväksikäyttökoodin, tehdään
siitä symbolinen linkki, kutsutaan sitä early-boot:illa joka johtaa siihen että:
rtbuddyd ajetaan early-boot:illa, se kut- suu JSC:n sijaan js-exploittia. Tällä
tempulla ja huonolla tyyppimuunnoksella saadaan kernelin hyväksikäytöt jokaisella
bootilla. Pegasus käyttää muutamia kik- koja tehdäkseen takaisinmallinnuksesta
vaikeampaa: se käyttää kertakäyttöisiä linkkejä. Joten klikkauksen jälkeen ne in-
validoidaan ja ne johtavat enää Googleen tai vastaaville sivustoille. Se uudelleen-
salaa kaikki höytykuormat joka latauksella lennosta. Ja tietenkin se yrittää piilou-
tua näyttäen järjestelmäkomponentilta. Tietenkin se myös estää iOS järjestelmä-
päivitykset, varmitaen että laitteita ei voi lennosta päivittää ja korjata. Se
hävittää todisteita: tyhjentämällä Safari- historiaa ja cacheja, ja löysimme itsetuho
-mekanismin joka voidaan aktivoida etänä tai jaastettuna. Sen pelottavan tuettujen-
sovellusten listan lisäksi se tallentaa kaiken mikforonin käytön, kameran käytön,
GPS:n, sijainnin, keychain-salasanat, jopa WiFin ja reitittimen salasanat. Mihin he
tarvitsevat reitittimen salasana? En tiedä Sovellushookkaus. Miten se toimii: kuten
mainitsin ennemmin, se käyttää Cydia sub- stratea ja sen avulla se esilataa dynaami-
sia kirastoja sovellusprosessiin ja saa siepattua kriittiset funktiot. Se
käyttää Cynjectiä injektoituakseen jo käynnissä oleviin prosesseihin. Tässä on
korkean tason kuva, miltä se näyttää. Pegasus saa siepattua kaikki sovellus- ja
kehystason kriittiset funktiot. Joten nyt Pegagus voi hallita niitä, voi kerätä
niitä, voi suorittaa niitä, voi varmistaa niitä, voi lähettää hallintayhteyttä jne.
Yhteenvedoksi: Pegasus on etäkäyttöinen jailbreak jota on havaittu maailmalta. Se
on hyvin pelottava, sillä se ei vaadi mi- tään käyttäjävuorovaikutusta. Viimeksi
nähty samanlainen asia oli viisi vuotta sitten kun comex julkaisi hänen jailbreak-
me 3:sen. Tänä vuonna Luca Todesco käytti yhtä Trident-haavoittuvuuksista hänen jail
-breakissään. Haluan erityisesti kiittää Citizen Labia heidän avustaan Pegasus-
näytteen saamisessa. Kaikkia Lookout:n tutkinta- ja vastetiimissä, Divergent Secu
-rityn tyyppejä ja kaikkia yksityisiä tut- kijoita, jotka olivat mukana. Viimeiseksi
muutamia höydyllisiä linkkejä, joista yksi on 44-sivuinen PDF-raportti hyvin, hyvin
syvillä yksityiskohdilla liittyen haavoit- tuvuuksiin, joita käytettiin, jopa erotel-
len 32- ja 64-bittiset keskenään. Jos olette kiinnostuneita, tsekatkaa ne.
Tämä oli tässä luullakseni, onko teillä mitään kysymyksiä?
*aplodeja*
M: Mmm hmm. H: Ok, pitäkää tämä lyhyenä. Meillä on
vain muutama minuutti aikaa kysymyksille, jos teillä on niitä menkää hallissa ole-
ville mikrofoneille. Ja me aloitamme Sig- naalienkelillä Internetistä.
SE: Kiitos, onko mitään tapaa rakentaa sovellus niin, että se on suojeltu tältä?
M: Kyllä ,koska Pegasus käyttää joitain tunnettuja jailbreak-tekniikoita, on mah-
dollista havaita esimerkiksi että järjes- telmäosio on uudelleenmountattu luettavana
ja kirjoiettavana. Se voi olla yksi indi- kaattori että jokin geneerinen jailbreak
on ajossa laitteella. Tai esim. tsekata Pegasuksen käyttämien tiedostojen varalta,
mutta parempi tapa on tsekata geneerisen jailbreak-pagejen, kernel-pagejen varalta.
*yleisön liikkeen ääniä* H: Voitteko yrittää olla vähän hiljempaa.
Meillä on yhä Q&A kesken. Jos teidän ei täydy lähteä nyt, jääkää istuutumaan tai
jos teidän täytyy lähteä nyt, älkää puhuko. Mikrofoni kolme, olkaa hyvät.
M3: Mikä on käyttäjän kokemus tästä?
M: Käyttäjän kokemus? Tarkoitatteko siis - tarkoitatteko että kun laite saastuu
Pegasuksella? Pelottavaa tässä itse asiassa on se ettei siitä oikein ole
mitään jälkiä, mitään indikaattoreita että jotain on käynyt. Klikkaat linkkiä,
laitteen web-selain aukeaa ja kaatuu sulkeutuen. Ei ole mitään uusia sovelluk-
sia joita voi nähdä näkyvistä sovelluksis- ta, vaikka oikeasti laitteella on kolme
uutta järjestelmäpalvelua, mutta ne eivät näy käyttäjälle.
H: Kiitos. Ja seuraavaksi toinen kysymys Internetistä.
SE: Kiitos. Onko teillä mitään käsitystä, kuinka aktiivinen tämä on maailmalla?
M: Toistaisitteko, kiitän? SE: Onko teillä mitään käsitystä, kuinka
aktiivinen tämä exploit on maailmalla? M: Olen varma että se on hyvin kohdistettu
hyökkäys, koska nämä ovat erittäin, erit- täin kalliita hyävksikäyttömenetelmiä.
Zerodium esimerkiksi maksaa nyt 1,5 mil- joonaa tällaisesta etä-jailbreakistä joten
en luule, että nämä toimijat tämän vakoilu -ohjelmiston takana halua tehdä tästä
haittaohjelmasta helpommin saavutettavaa kiakille. Joten se on hyvin, hyvin kohdis-
tettu hyökkäys. Tiedämme Mansoorin tapauk- sesta, joten ajattelen että se on hyvin,
hyvin kohdistettua, koska se on erittäin kallista.
H: Kiitokset tästä vastauksesta. Mikrofoni numero viisi, kiitos.
M5: Onko teillä mitään lisätietoa NSO:sta tai ryhmästä, joka on sen takana? Käyttä-
vätkö he muita ohjelmistoja? Ja onko tämä kuinka paljon levinnyt maailmalla?
M: Joo, eli tässä tapauksessa keskityimme lähinnä Pegasuksen teknisiin yksityis-
kohtiin, mutta Citizen Lab on suorittanut tutkinnan NSO:hon liittyen ja NSO on taval
-laan kyberasetoimittaja. Tutustukaa Citi- zen Labin raporttiin aiheesta.
Heillä on paljon enemmän tietoa siinä.
H: Onko meillä kysymyksiä Internetistä? Enkö näe jotakuta? Ei, no sitten tämä oli
tässä. Kiitoksia puheestanne.
*aplodeja*
*jälkimusiikkia*
Tekstitykset luotu c3subtitles.de:llä vuonna 2022. Liity ja auta meitä!
[Translated by {Iikka}{Yli-Kuivila} (ITKST56 course assignment at JYU.FI)]