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