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