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