< Return to Video

Pegasus internals (33c3)

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

more » « less
Video Language:
English
Duration:
29:39
Iikka Yli-Kuivila edited Finnish subtitles for Pegasus internals (33c3)
Iikka Yli-Kuivila edited Finnish subtitles for Pegasus internals (33c3)
Iikka Yli-Kuivila edited Finnish subtitles for Pegasus internals (33c3)
Iikka Yli-Kuivila edited Finnish subtitles for Pegasus internals (33c3)
Iikka Yli-Kuivila edited Finnish subtitles for Pegasus internals (33c3)
Iikka Yli-Kuivila edited Finnish subtitles for Pegasus internals (33c3)
Iikka Yli-Kuivila edited Finnish subtitles for Pegasus internals (33c3)
Iikka Yli-Kuivila edited Finnish subtitles for Pegasus internals (33c3)
Show all

Finnish subtitles

Revisions