[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)]