< Return to Video

PHP7 unserializen hyväksikäyttö (exploiting)

  • 0:00 - 0:05
    Translated by Jouko Voutilainen (ITKST56 course assignment at JYU.fi)
  • 0:05 - 0:13
    Teksti: PHP7:n epäsarjallistamisen hyödyntäminen
    "Vanhojen temppujen opettaminen uudelle koiralle"
  • 0:13 - 0:16
    Noniin hyvää huomenta.
  • 0:18 - 0:24
    Hyvää huomenta ja tervetuloa taas päivämme toiseen esitelmään.
  • 0:25 - 0:28
    Puhujamme on turvallisuustutkija CheckPointilla
  • 0:29 - 0:35
    ja hän esitelmöi meille PHP7 sarjallistamismekanismien hyödyntämisestä.
  • 0:35 - 0:39
    Antakaa siis suuret aplodit Yannay Livneh:lle.
  • 0:39 - 0:46
    (Yleisö taputtaa
  • 0:46 - 0:51
    Hei ja tervetuloa esitelmääni:
  • 0:52 - 0:53
    "Opettamassa uudelle koiralle vanhoja temppuja."
  • 0:54 - 0:57
    Kyse on PHP7 sisäisestä muistista turvallisuustutkijoille.
  • 0:58 - 1:03
    Tiedoksi alkuun, että kyseessä ei ole puhe PHP-koodista
  • 1:03 - 1:05
    vaan PHP7-tulkista.
  • 1:05 - 1:07
    Toivottavasti nautitte.
  • 1:08 - 1:09
    Alkuun hieman itsestäni.
  • 1:09 - 1:12
    Nimeni on Yannay ja työskentelen CheckPointissa.
  • 1:12 - 1:14
    Tiimini ja minä työskentelemme monien asioiden parissa:
  • 1:14 - 1:20
    Verkko, sulautetut laitteet, käyttäjäpuolen haavoittuvuusasiat.
  • 1:20 - 1:21
    Lisäksi myös muistin korruptoimisen.
  • 1:22 - 1:24
    Tämän päivän agenda:
  • 1:24 - 1:28
    Ensiksi lyhyt alustus PHP:stä ja sen jälkeen
  • 1:28 - 1:30
    PHP:n unserializesta.
  • 1:30 - 1:35
    Sitten ZVAL järjestelmä: PHP7:n arvojärjestelmä.
  • 1:35 - 1:41
    Tämän tiedon pohjalta hieman bugeja ja haavoittuvuuksia.
  • 1:41 - 1:47
    Sitten PHP7:n jakajasta. Ja näiden
  • 1:47 - 1:49
    hyödyntämistä edellisen tiedon pohjalta
  • 1:49 - 1:54
    näemme miten voimme exploitata näitä bugeja sekä suorittaa koodia etänä
  • 1:54 - 1:57
    Sitten johtopäätökset ja keskustelu jne.
  • 1:57 - 2:07
    Aloitetaanpa. PHP on kaikkein käytetyin web-sovellusten kieli.
  • 2:07 - 2:10
    Kyseessä on palvelinpuolen kieli ja palvelimet hallitsevat maailmaa.
  • 2:10 - 2:15
    Kaikki tietomme web-sovelluksissa on palvelimilla.
  • 2:15 - 2:21
    On hyvin mielenkiintoista miten hyökkääjä saa tietonsa useiten serveriltä.
  • 2:22 - 2:26
    Kun sanoin sen olevan käytetyin tämän päivän kieli,
  • 2:26 - 2:29
    tänään käytetyimmän kielen versio on v5.
  • 2:30 - 2:35
    Mutta juuri julkaistu versio on v7
  • 2:35 - 2:37
    ja tästä me puhumme tänään.
  • 2:38 - 2:41
    Se on siis yksi tärkeimmistä kielistä tänä päivänä,
  • 2:41 - 2:44
    mutta miten sen ja PHP-sovellusten turvallisuus?
  • 2:44 - 2:51
    Jokaisessa suositussa kielessä on haavoittuvuuksia
  • 2:51 - 2:53
    tai sillä on kirjoitettu niitä.
  • 2:53 - 2:58
    Tiedämme miten paljon SQLi ja XSS-haavoittuvuuksia on ilmennyt viime vuosina.
  • 2:58 - 3:00
    Nämä ovat korkean tason haavoittuvuuksia
  • 3:00 - 3:03
    ja ne riippuvat sovellukseen kirjoitetusta koodista.
  • 3:03 - 3:05
    Mutta on olemassa myös muistikorruptiota.
  • 3:05 - 3:08
    Miten muistikorruptiota voi olla korkealla tasolla saatat kysyä?
  • 3:08 - 3:13
    Osa PHP:n toiminnallisuudesta on käsitelty tulkissa,
  • 3:13 - 3:14
    joka on kirjoitettu C-kielellä.
  • 3:14 - 3:17
    Ja kun syötät käyttäjätietoja tällaiseen toiminnallisuuteen
  • 3:17 - 3:20
    ja siellä on bugeja, saatat törmätä muistikorruptioon.
  • 3:20 - 3:24
    Paras esimerkki tästä on UNSEARLIZE("epäsarjallistamisen")-funktio,
  • 3:24 - 3:28
    jota on hyväksikäytetty monissa tilanteissa viime vuosien aikana.
  • 3:28 - 3:31
    Ja tämä on juurikin se funktio josta tänään puhumme,
  • 3:31 - 3:33
    mutta PHP7:n liittyen.
  • 3:34 - 3:37
    Mitäpä unserializen historiasta?
  • 3:38 - 3:40
    Liikaa CVE:itä laskettavaksi.
  • 3:40 - 3:45
    Ja suurin osa näistä CVE:istä on olioinjektiosta.
  • 3:45 - 3:46
    Ominaisuusorientoitunut ohjelmointi,
  • 3:46 - 3:47
    jos olet kuullut siitä.
  • 3:48 - 3:49
    Tähän on looginen hyväksikäyttötapa.
  • 3:49 - 3:56
    Se liittyy sovellukseen kirjoitustapaan.
  • 3:56 - 3:59
    Mutta siihen liittyy myös muistikorruptiota.
  • 3:59 - 4:01
    Muistikorruptio ei liity itse sovellukseen.
  • 4:01 - 4:05
    Muistikorruption hyväksykäyttäminen perustuu ainoastaan PHP-versioon.
  • 4:05 - 4:07
    Niinkuin mainitsin. Versio 5 tai 7.
  • 4:08 - 4:11
    Muistikorruptioista PHP5:ssä:
  • 4:11 - 4:12
    Siinä oli geneerinen exploitti.
  • 4:12 - 4:15
    Ionicin Stefan Essarin tekemä.
  • 4:16 - 4:19
    Siitä kirjoitettiin Blackhat:ssa 2010.
  • 4:19 - 4:28
    Ja tämä exploit käytännössä toimi missä tahansa PHP5:n unserialize-muistikorruptiossa.
  • 4:29 - 4:31
    Eli niinkuin mainitsin se on vanha ongelma.
  • 4:31 - 4:35
    Tässä on esimerkki tältä vuodelta heinäkuulta.
  • 4:35 - 4:39
    Tämä pieni nettisivu, en tiedä oletko tietoinen siitä,
  • 4:39 - 4:48
    avasi Bug-Bounty:n ja tämä herätti huomion Evenide-yritykseltä.
  • 4:48 - 4:53
    He tarkastelivat API:a ja huomasivat tämän API POST-pyyntö.
  • 4:53 - 4:55
    Tässä voitte nähdä evästeen,
  • 4:55 - 4:57
    jolla on mielenkiintoinen formaatti.
  • 4:57 - 4:58
    Tämä on unseralizen formaatti.
  • 4:58 - 5:02
    Ja kun lähetät pyynnön ja saat vastauksen ja näet,
  • 5:02 - 5:05
    että tämä eväste käsitellään.
  • 5:05 - 5:08
    Eli meillä on haavoittuvainen sarjallistaminen juurikin tässä.
  • 5:08 - 5:13
    Ja he fuzzasivat unserialize-funktiota versio 5:ssä
  • 5:13 - 5:17
    löytäen uuden haavoittuvuuden, hyödyntäen sitä ja saaden palkkion.
  • 5:17 - 5:20
    Eli mitenkä PHP7:ssä.
  • 5:20 - 5:22
    Se on uusi kielen julkaisu,
  • 5:22 - 5:25
    julkaistu noin vuosi sitten.
  • 5:25 - 5:28
    He järjestelivät kaiken tehokkuusnäkökulmalla.
  • 5:28 - 5:30
    He uusivat value-systeemin.
  • 5:30 - 5:33
    Uudelleenimplementoivat muistiallokaatiomekanismi.
  • 5:33 - 5:40
    Ja tästä syystä muistikorruption exploit-tekniikat eivät toimi enää.
  • 5:40 - 5:43
    Muistikorruption hyödyntäminen riippuu vahvasti muistin järjestystavasta.
  • 5:43 - 5:45
    Kun kaiken tämän muuttaa,
  • 5:45 - 5:47
    mikään ei enää toimi.
  • 5:47 - 5:51
    Mutta meillä on vieläkin unserialize-toiminnallisuus PHP7:ssä,
  • 5:51 - 5:54
    sillä jonkin verran taaksepäin yhteensopivuutta löytyy.
  • 5:54 - 5:56
    On ollut joitakin CVE:itä.
  • 5:56 - 5:58
    Olioinjektio edelleen toimii,
  • 5:58 - 5:59
    sillä se on puhtaasti loogista.
  • 5:59 - 6:05
    Mutta muistikorruptiot, vaikka ne edelleenkin voi löytää unserializessa,
  • 6:05 - 6:10
    etä-exploitteja ei ollut vasta kuin tämän esitelmän jälkeen.
  • 6:10 - 6:11
    Enemmän tai vähemmän.
  • 6:11 - 6:13
    Kyllä, kiitoksia vain minulle.
  • 6:13 - 6:16
    Eli puhutaanpa unserializesta:
  • 6:16 - 6:21
    Ensiksi minun pitää selventää jotakin.
  • 6:21 - 6:22
    Sinun pitäisi sanoa "deserialize".
  • 6:22 - 6:25
    Unserialize on kieliopillisesti väärin ja jos se häiritsee sinua,
  • 6:25 - 6:27
    niin sitten niin käy koko tämän esitelmän ajan.
  • 6:27 - 6:28
    Eli olen pahoillani.
  • 6:28 - 6:31
    Mutta koska PHP on PHP voimme edetä.
  • 6:31 - 6:37
    Tämä on sarjallistamisen dokumentointi PHP:ssä.
  • 6:37 - 6:40
    Käytännössä sarjallistaminen ottaa arvon,
  • 6:40 - 6:42
    ja muuttaa sen merkkijonoksi,
  • 6:42 - 6:44
    jonka voi säilöä ja palauttaa myöhemmin.
  • 6:44 - 6:47
    Unserialize on tämän vastakohta.
  • 6:47 - 6:50
    Eli saat merkkijonon sarjallistamisen tietyssä formaatissa,
  • 6:50 - 6:53
    ja muutat sen takaisin arvoksi.
  • 6:53 - 6:56
    Ja tämä on hyvin yksinkertaista,
  • 6:56 - 6:56
    voisit sanoa,
  • 6:56 - 6:59
    mutta tässä on ollu liian paljon haavoittuvuuksia ja näemme juurikin miksi.
  • 7:00 - 7:03
    Eli katsotaanpa esimerkki sarjallistamisesta.
  • 7:03 - 7:06
    Eli kohta haluamme sarjallistaa tämän kivan taulukon,
  • 7:06 - 7:08
    jonka sisällä on toinen taulukko ja niin edelleen.
  • 7:08 - 7:10
    Etenemme askel askeleelta,
  • 7:10 - 7:13
    ja sarjallistamme sen unserialisoituun formaattiin.
  • 7:13 - 7:16
    Ensiksi sarjallistamme taulukon neljällä elementillä.
  • 7:16 - 7:18
    Eli kuten näette alla,
  • 7:18 - 7:21
    meillä on merkkijono ja se on a-kaksoispiste-4.
  • 7:21 - 7:25
    A tarkoittaa saraketta, 4 neljälle arvolle.
  • 7:25 - 7:30
    Ja PHP:ssä jokainen taulukkon on itseasiassa hash-taulukko tai sanakirja,
  • 7:30 - 7:32
    eli se on avain-arvo-varasto.
  • 7:32 - 7:33
    Mutta kun sinulla on taulukko,
  • 7:33 - 7:35
    avaimet ovat epäsuoria.
  • 7:35 - 7:39
    Avaimet ovat vain juokseva indeksointi ja se on sokeaa.
  • 7:39 - 7:44
    Eli sarjallistamme ensimmäisen arvon avaimenaan kokonaisluku 0.
  • 7:44 - 7:45
    Eli sinulla on i-kaksoispiste-nolla.
  • 7:45 - 7:47
    ja seuraavaksi arvon pariin.
  • 7:47 - 7:54
    Seuraavaksi sarjallistamme kokonaisluvun 1 avaimeksi ja kokonaisluvun 1337 arvoksi.
  • 7:55 - 7:58
    Sitten sarjallistamme merkkijonon.
  • 7:58 - 8:01
    Eli meillä on kokonaisluku 2 avaimena ja lukujono.
  • 8:01 - 8:04
    Eli meillä on s lukujonona, kaksoispiste, sarake 5,
  • 8:04 - 8:05
    viideksi merkiksi ja sitten meillä on "apple",
  • 8:05 - 8:07
    joka on merkkijonon arvo.
  • 8:07 - 8:09
    Nyt sarjallistamme taas uuden taulukon.
  • 8:09 - 8:11
    Eli meillä on epäsuora avain kokonaisluku 3
  • 8:11 - 8:17
    ja arvo a-kaksoispiste-kolme, kolmea arvoa varten tässä sisäkkäisessä taulukossa.
  • 8:17 - 8:19
    Seuraavaksi meillä on epäsuora avain merkkijono a,
  • 8:19 - 8:21
    eli meillä on s merkkijonona,
  • 8:21 - 8:22
    kaksoispiste-1 yhtä arvoa varten,
  • 8:22 - 8:25
    a merkkijonon arvoksi ja tämä on se avain.
  • 8:25 - 8:27
    Ja arvo on kokonaisluku 1.
  • 8:27 - 8:30
    Seuraavaksi sarjallistamme luokan ja olion.
  • 8:30 - 8:31
    Oikeastaan, eli meillä on...
  • 8:31 - 8:32
    Palaamme takaisin epäsuoriin avaimiin,
  • 8:32 - 8:35
    eli kokonaisluku 0 epäsuorana lukuna.
  • 8:35 - 8:39
    Sitten meillä on olio, jonka luokkanimessä on 8 merkkiä.
  • 8:39 - 8:43
    Eli se on kaksoispiste-8-kaksoispiste-luokan nimi "stdClass".
  • 8:43 - 8:47
    Sitten meillä on sarakkeet 0. 0 on ominaisuuksien määrä tässä oliossa.
  • 8:47 - 8:49
    0 ominaisuutta=Ei mitään luokassa.
  • 8:49 - 8:51
    Kaarisulkeiden välissä tyhjää.
  • 8:51 - 8:58
    Ja sitten sarjallistamme kokonaisluvun 1 avaimena ja kokonaisluvun 7331 arvona.
  • 8:58 - 9:00
    Ja tämä oli sarjallistamisen prosessi.
  • 9:00 - 9:03
    Sangen yksinkertaista ja meillä on tämä mukava formaatti,
  • 9:03 - 9:04
    josta nyt tiedämme.
  • 9:04 - 9:06
    Seuraavaksi haluan näyttää teille unserializen.
  • 9:06 - 9:08
    Ja tämä tulee olemaan täysin päinvastainen prosessi,
  • 9:08 - 9:10
    eli se tulee olemaan hieman tylsä,
  • 9:10 - 9:12
    mutta haluan näyttää teille tässä jotakin.
  • 9:12 - 9:16
    PHP tukee viittaukset(references)-nimistä toimintoa.
  • 9:16 - 9:19
    Viittaukset tarkoittavat että unserializen aikana,
  • 9:19 - 9:23
    voimme määrittää formaatissa kokonaisluvun
  • 9:23 - 9:26
    tai merkkijonon asemasta viittauksen.
  • 9:26 - 9:29
    Ja tämä kertoo PHP-mekanismille palata takaisin ja tarkastaa,
  • 9:29 - 9:32
    mikä oli äskeinen jäsennetty arvo,
  • 9:32 - 9:37
    ja haluan kopion siitä arvosta tai viittaukset siihen arvoon.
  • 9:37 - 9:41
    Jotta tämä toiminto on mahdollinen unserializen aikana,
  • 9:41 - 9:43
    jokaisesta unserialize-mekanismin käsittelevästä arvosta,
  • 9:43 - 9:48
    on pidetty viittaus. Joten meillä on taulukko nimeltä var_hash -taulukko.
  • 9:48 - 9:51
    Ja tässä taulukossa meillä on osoittimet jokaiseen käsiteltyyn arvoon.
  • 9:51 - 9:52
    Katsotaanpa miten se toteutetaan.
  • 9:52 - 9:55
    Ensiksi unserialisoidaan taulukko, jossa on 4 elementtiä.
  • 9:55 - 9:58
    Eli näette var_hash -taulukossa, joka on 1-pohjainen taulukko,
  • 9:58 - 10:01
    meillä on osoitin tähän taulukkoon, jonka juuri loimme.
  • 10:01 - 10:05
    Seuraavaksi meillä on avain: kokonaisluku 0 ja arvo NULL.
  • 10:05 - 10:10
    Ja voimme nähdä että toinen osoitin osoittaa juuri käsittelemäämme NULL-arvoon.
  • 10:10 - 10:11
    Seuraavaksi meillä on kokonaisluku 1,
  • 10:11 - 10:17
    jonka arvona on 1337. Ja kolmas osoitin osoittaa 1337:ään.
  • 10:17 - 10:20
    Sitten meillä on merkkijono "apple" arvona,
  • 10:20 - 10:24
    ja neljäs osoitin osoittaa tähän arvoon.
  • 10:24 - 10:28
    Seuraavaksi meillä on sisäinen taulukko,
  • 10:28 - 10:31
    mutta var_hash taulukko on flat-taulukko.
  • 10:31 - 10:33
    Vaikka meillä on hieman sisäkkäisiä taulukoita tässä,
  • 10:33 - 10:39
    arvot ovat sisäkkäisiä ja var_hash taulukko on litteä (flat).
  • 10:39 - 10:41
    Viides osoitin osoittaa taulukkoon.
  • 10:41 - 10:45
    Seuraavaksi unserialisoimme avaimen a ja arvon 1
  • 10:45 - 10:47
    ja meillä on uusi osoitin tähän arvoon.
  • 10:47 - 10:50
    Sitten luomme std-olion.
  • 10:50 - 10:53
    Eli meillä on toinen olio siellä
  • 10:53 - 10:56
    ja seitsemäs osoitin osoittaa tähän luotuun olioon.
  • 10:56 - 10:59
    Ja nyt jotain mielenkiintoista tulee tapahtumaan.
  • 10:59 - 11:02
    Me unserialisoimme viittauksen kolmanteen arvoon.
  • 11:02 - 11:05
    Eli mitä tulisi tapahtumaan tässä.
  • 11:05 - 11:09
    PHP:n unserialize-toiminnallisuus käy tarkistamassa var_hash -taulukon
  • 11:09 - 11:11
    menemällä kolmanteen arvoon.
  • 11:11 - 11:15
    Kolmas arvo tässä on osoitin kokonaislukuun 1337.
  • 11:15 - 11:19
    Ja nyt meidän täytyy luoda viittaus tähän arvoon,
  • 11:19 - 11:20
    joten tässä on mitä teemme:
  • 11:20 - 11:22
    Me unserialisoimme tämän arvon
  • 11:22 - 11:25
    ja luomme viittauksen aiemmin käsiteltyyn arvoon.
  • 11:25 - 11:30
    Eli näin PHP tukee taaksepäin tapahtuvaa viittaus-toiminnallisuutta.
  • 11:30 - 11:32
    Ja tämä mekanismi, toiminnallisuus,
  • 11:32 - 11:34
    aiheutti paljon bugeja menneisyydessä,
  • 11:34 - 11:35
    sillä kuten näette,
  • 11:35 - 11:38
    me pidämme osoittimia asioihin,
  • 11:38 - 11:40
    joita ehkä tarvitsemme tai emme tarvitse uudestaan.
  • 11:40 - 11:43
    Tässä on ollut hieman hämmennystä kuluneina vuosina.
  • 11:44 - 11:47
    Jos menit sekaisin seuratessa tätä monimutkaista formaattia,
  • 11:47 - 11:48
    minulla on muutama asiat,
  • 11:48 - 11:49
    mitä haluan teidän muistavan.
  • 11:49 - 11:51
    Eli ensiksi se on monimutkainen formaatti.
  • 11:51 - 11:51
    Okei?
  • 11:51 - 11:52
    (Yleisö nauraa)
  • 11:52 - 11:53
    Kyllä on ilmeistäkin,
  • 11:53 - 11:56
    että monimutkainen formaatti johtaa bugeihin,
  • 11:56 - 11:59
    jonka näemme hetken päästä.
  • 12:00 - 12:03
    Meillä on paljon keinoja kontrolloida muistin varausta.
  • 12:03 - 12:05
    Me luomme olioita,
  • 12:05 - 12:12
    unserialisoimme eri mittaisia merkkijonoja ja hash-taulukoita,
  • 12:12 - 12:14
    joten meillä on paljon kontrollia käyttäjinä.
  • 12:14 - 12:20
    Me pidämme nämä viittaukset aiemmin unserialisoituihin asioihin,
  • 12:20 - 12:22
    ja voimme uudelleenkäyttää niitä.
  • 12:22 - 12:23
    Eli tässä tilanteessa voimme käyttää asioita
  • 12:23 - 12:24
    niiden vapauttamisen jälkeen.
  • 12:24 - 12:26
    Onnistuimme vapauttamaan muistista jonkun objektin
  • 12:26 - 12:27
    jollakin taikuudella
  • 12:27 - 12:28
    ja meillä on kuitenkin edelleen osoitin
  • 12:28 - 12:31
    siihen ja näin voimme edetä exploittaajina.
  • 12:31 - 12:34
    Eli nyt puhumme Zvals-systeemistä PHP:ssa.
  • 12:34 - 12:36
    Zvalit ovat käytännössä arvoja.
  • 12:36 - 12:41
    Tämä on miten PHP-tulkki kutsuu arvoja tai säilyttää muuttujia.
  • 12:41 - 12:42
    Tämä on PHP-muuttuja.
  • 12:42 - 12:43
    Olen pahoillani,
  • 12:43 - 12:44
    että meillä PHP:ta tässä,
  • 12:44 - 12:49
    mutta sitä ei ole jatkossa paljoa.
  • 12:49 - 12:52
    Korkean tason kielenä,
  • 12:52 - 12:54
    meillä on muutama toiminnallisuus muuttujillemme.
  • 12:54 - 12:57
    Meillä on automaattinen muistinhallinta tai roskankerääjä.
  • 12:57 - 13:00
    Ja meillä on nämä viittaukset.
  • 13:00 - 13:04
    Viittaukset kun Y:llä viitataan X:ään,
  • 13:04 - 13:06
    se tarkoittaa, että muuttujan Y arvo
  • 13:06 - 13:08
    muuttuu kun arvon X arvo muuttuu,
  • 13:08 - 13:10
    sekä toisinpäin.
  • 13:10 - 13:12
    Eli ne molemmat ovat käytännössä muuttujia,
  • 13:12 - 13:14
    jotka sisältävät saman arvon.
  • 13:15 - 13:18
    Ja tämä on miten zvalit oli implementoitu PHP5:een.
  • 13:18 - 13:19
    Meillä oli tämä tietue,
  • 13:19 - 13:20
    nimeltään zval_struct.
  • 13:20 - 13:22
    Se toimi kekomuistissa,
  • 13:22 - 13:24
    ja viittauslaskettu ja jokainen zval
  • 13:24 - 13:26
    oli käytännössä osoitin tähän tietueeseen
  • 13:26 - 13:28
    ja aina kun loimme uuden zvalin,
  • 13:28 - 13:32
    jouduimme allokoimaan tämän rakenteen ja alustamaan sen.
  • 13:33 - 13:37
    Muistinhallinta oli hyvin ilmiselvä.
  • 13:37 - 13:38
    Meillä oli viittauslaskenta ja
  • 13:38 - 13:40
    muistin syklin tunnistaminen,
  • 13:40 - 13:42
    eli se oli hyvin yksinkertainen algoritmi,
  • 13:42 - 13:45
    jonka suurin osa tietääkin.
  • 13:45 - 13:46
    Tehdäkseen viittauksia,
  • 13:46 - 13:48
    tehdäkseen kaksi muuttujaa osoittamaan
  • 13:48 - 13:50
    samaan arvoon oli kyse vain kahdesta
  • 13:50 - 13:52
    osoittimesta osoittamassa samaan tietueeseen keossa.
  • 13:52 - 13:54
    Kaikki oli hyvin yksinkertaista ja mukavaa.
  • 13:55 - 13:57
    Mutta se oli hidasta.
  • 13:57 - 13:59
    Eli kun implementoitiin PHP7:ää,
  • 13:59 - 14:03
    oli jonkin verran motivaatiota muuttaa sitä.
  • 14:03 - 14:07
    Implementoijat halusivat vähemmän viittauksien poistoa.
  • 14:07 - 14:09
    Aina kun zval oli osoittimena,
  • 14:09 - 14:12
    tarvittiin viittausta muodostaessa osoittimen viittauksen poisto,
  • 14:12 - 14:16
    joka voi olla kallista ja aina kun luodaan uusi arvo,
  • 14:16 - 14:18
    vaikka se olisikin vain lyhyeksi aikaa ja tiedän tarkasti missä se on,
  • 14:18 - 14:21
    joudut kuitenkin tekemään varauksen kekomuistiin,
  • 14:21 - 14:22
    joka voi olla kallista.
  • 14:22 - 14:24
    Eli tämä systeemi suunniteltiin upottamista(embed) varten.
  • 14:24 - 14:25
    Sanottiin:
  • 14:25 - 14:27
    Okei, en halua zvalien olevan vain kekomuistissa vaan haluan,
  • 14:27 - 14:29
    että ne voidaan upottaa
  • 14:29 - 14:31
    mihin tahansa pinossa muissakin tietueissa
  • 14:31 - 14:32
    ja niin edelleen.
  • 14:33 - 14:35
    Ja tämä on miten uusi zval-järjestelmä on implementoitu.
  • 14:35 - 14:39
    Meillä on tämä zval-tietue, mutta nyt se on hieman yksinkertaisempi.
  • 14:39 - 14:44
    Zvalit ovat vain tämä tietue ja tämä tietue sisältää vain arvon ja tyypin.
  • 14:44 - 14:45
    Joten tässä ei ole mitään viittausten laskentaa.
  • 14:45 - 14:49
    Ja me voimme laittaa tämän tietueen mihin vain haluamme.
  • 14:50 - 14:53
    Arvo voi olla tässä jokin kahdesta:
  • 14:53 - 14:54
    Se voi olla primitiivinen tyyppi,
  • 14:54 - 14:56
    esimerkiksi primitiivinen C-tyyppi,
  • 14:56 - 14:58
    kuten kokonaisluku tai liukuluku ja niin edelleen.
  • 14:58 - 15:00
    Mutta PHP tukee myös merkkijonoja.
  • 15:00 - 15:03
    Eli jos haluamme tukea monimutkaisia tyyppejä
  • 15:03 - 15:04
    kuten merkkijonoja tai objekteja,
  • 15:04 - 15:07
    tämä arvo olisi osoitin johonkin monimutkaiseen tietueeseen.
  • 15:07 - 15:09
    Tämä tietue olisi kekomuistissa.
  • 15:09 - 15:14
    Eli tämä tietue ei olisi pinossa vaan jossakin kekomuistissa.
  • 15:14 - 15:16
    Ja se olisi myös viittauslaskettu.
  • 15:17 - 15:18
    Eli tässä on esimerkki.
  • 15:18 - 15:23
    Tämä on kokonaisluku ja muistissa meillä on vain arvo 1337.
  • 15:23 - 15:25
    Ja tyyppi long.
  • 15:25 - 15:27
    Siinä se, emme tiedä missä se on,
  • 15:27 - 15:29
    ja se on hyvin yksinkertainen.
  • 15:31 - 15:36
    Nyt tukeaksemme viittaustenlaskentaa sen vastuu on sillä,
  • 15:36 - 15:38
    kuka tahansa alustaa sen zvalin.
  • 15:38 - 15:41
    Jos zval on tietueessa, kuka ikinä sen alustaakin sen,
  • 15:41 - 15:42
    joutuu myös tyhjentää sen.
  • 15:42 - 15:45
    Mutta tässä on yksi ongelmakohta.
  • 15:45 - 15:48
    Jos arvo on primitiivinen, kaikki on hyvin.
  • 15:48 - 15:50
    Mutta jos kyseessä on osoitin toiseen tietueeseen,
  • 15:50 - 15:52
    tämä tietue tulisi olla viittauslaskettu.
  • 15:52 - 15:56
    Ja näin roskankerääjä toimii.
  • 15:56 - 15:59
    Se tarkistaa zvalin osoittaman arvon
  • 15:59 - 16:02
    ja sillä on myös viittauslaskenta ja roskankerääjä.
  • 16:02 - 16:03
    Ja nyt katsotaanpa esimerkki.
  • 16:03 - 16:05
    Okei eli tässä on merkkijonotietue,
  • 16:05 - 16:07
    kuten sanoin se on monimutkainen tyyppi,
  • 16:07 - 16:10
    joten tämä tietue on kekomuistissa ja se on osoitettu zvalilla.
  • 16:10 - 16:12
    Kuten näette,
  • 16:12 - 16:15
    ensimmäinen kenttä tässä tietueessa on viittauslaskenta.
  • 16:15 - 16:19
    Ja viimeinen kenttä on joustava taulukko.
  • 16:19 - 16:24
    Joten, kun allokoitaessa merkkijonoa,
  • 16:24 - 16:28
    me allokoimme riittävästi dataa, muistia, säilöäksemme merkkijonon
  • 16:28 - 16:31
    sisällön ja pääsemme siihen käsiski tämän kentän kautta.
  • 16:31 - 16:33
    Tältä se näyttää taulukossa,
  • 16:33 - 16:38
    kun alustamme merkkijonomuuttujan.
  • 16:38 - 16:42
    Sitten meillä on zval-tietue tyyppiä merkkijono.
  • 16:42 - 16:45
    Allokoimme tämän merkkijonon kekoon.
  • 16:45 - 16:47
    Alustamme sen näillä arvoilla.
  • 16:47 - 16:48
    Näette arvon "apple" tässä.
  • 16:48 - 16:52
    Ja me vain osoitamme tämän zvalin tähän merkkijonoon
  • 16:52 - 16:54
    ja viittauslaskentaluku on 1.
  • 16:54 - 16:56
    Ja tämä tietue on keossa.
  • 16:58 - 17:01
    Eli miten me voimme hallita viittauksia.
  • 17:02 - 17:04
    Miten viittaustoiminnallisuus implementoitiin.
  • 17:06 - 17:09
    Tällä kertaa emme voi tehdä vain yhtä zval-osoitinta toiseen,
  • 17:09 - 17:11
    sillä ne saattavat olla eri tasoilla.
  • 17:11 - 17:18
    Toinen voi olla tietueessa ja toinen pinossa ja niiden tulee olla hallittu, eikö?
  • 17:18 - 17:20
    Eli tähän on ratkaisu.
  • 17:20 - 17:25
    PHP:ssä implementoitiin uusi tyyppi nimeltä references (viittaukset).
  • 17:25 - 17:28
    Tämä on helpompi näyttää kuin selittää,
  • 17:28 - 17:29
    joten näytän miten se toimii.
  • 17:29 - 17:35
    Oletetaan että teillä on muuttuja X luvulla 1337 ja sitten meillä on muuttuja Y,
  • 17:35 - 17:37
    jolla on viittaus muuttujaan X.
  • 17:37 - 17:40
    Eli meillä on se nyt muistissa ja haluamme tehdä viittauksen siihen.
  • 17:40 - 17:47
    Eli me alustamme uuden tietueen kekoon nimeltä reference.
  • 17:47 - 17:48
    Ja tällä tietueella on kaksi kenttää.
  • 17:48 - 17:52
    Ensimmäinen kenttä on viittauslaskenta ja toinen on zval.
  • 17:52 - 17:55
    Ja me alustamme tämän zval-arvon olemaan sama kuin X.
  • 17:55 - 17:57
    Joten näette, että sillä on kopio X:n arvosta.
  • 17:57 - 18:01
    Sen jälkeen vaihdamme X:n tyypin viittaukseksi,
  • 18:01 - 18:03
    jonka jälkeen se viittaa _zend_referenceen.
  • 18:03 - 18:05
    Ja nyt voimme alustaa Y:n ja se tulee olemaan sama.
  • 18:05 - 18:07
    Eli se on myös viittaus johonkin kekomuistissa.
  • 18:07 - 18:13
    Eli siirsimme X:n sisällön kekoon ja nyt meillä voi olla kaksi zval-muuttujaa X ja Y.
  • 18:13 - 18:15
    Ne vaan osoittavat kekomuistiin niinkuin aiemminkin.
  • 18:17 - 18:19
    Pääasia muistaa zvaleista on,
  • 18:19 - 18:21
    että ne on suunniteltu upotteiksi,
  • 18:21 - 18:23
    eli ne voivat olla monissakin paikoissa,
  • 18:23 - 18:24
    jotka voivat johtaa bugeihin.
  • 18:26 - 18:29
    Tavoitteet saavutettiin kun oli vähemmän viittauksenpoistoja
  • 18:29 - 18:31
    ja vähemmän keon käyttöä.
  • 18:31 - 18:34
    Mutta viittausten tekeminen on hieman monimutkaista.
  • 18:35 - 18:39
    Viittaus ei ole toiminnallisuus jota käytetään paljon muualla kuin exploiteissa.
  • 18:39 - 18:47
    Eli tässä on kompromissi:
  • 18:47 - 18:49
    Zvalit eivät ole kaikkein yksinkertaisin juttu,
  • 18:49 - 18:50
    mutta viittaukset ovat monimutkaisempia
  • 18:50 - 18:53
    ja se on tämän kompromissin arvoista minun mielestäni ainakin.
  • 18:54 - 18:57
    Eli nyt kun tiedämme unserializesta ja zvalista,
  • 18:57 - 18:59
    katsotaanpa hieman bugeja ja haavoittuvuuksia.
  • 19:00 - 19:02
    Eli ensiksi määrittämättömien arvojen käyttäminen.
  • 19:02 - 19:05
    Sillä zvalit olivat alunperin osoittimia.
  • 19:05 - 19:08
    Osoittimien alustaminen oli helppoa.
  • 19:08 - 19:10
    Kaikki tietävät miten osoitin alustetaan.
  • 19:10 - 19:12
    Osoitit vain nulliin ja se oli siinä.
  • 19:12 - 19:15
    Tietueiden alustaminen on hieman eri tarina.
  • 19:15 - 19:19
    Ne joudutaan alustamaan jonkin macrojen tai vakiomuuttjien kanssa.
  • 19:19 - 19:24
    Se saattaa vaatia hieman aikaa ja ohjelmoijilla on tapana ohittaa tämä vaihe.
  • 19:24 - 19:27
    Jos se on mahdollista, et alusta tietueita,
  • 19:27 - 19:28
    mikä on ongelma.
  • 19:28 - 19:31
    Tämä voi johtaa joihinkin haavoittuvuuksiin.
  • 19:31 - 19:33
    Ja tässä on juurikin se esimerkkinä.
  • 19:33 - 19:36
    Meillä on tämä SplObjectStorage::unserialize-funktio.
  • 19:36 - 19:44
    Tämä funktio on mukautettu implementaatio SpLObjectStoragen unserializesta.
  • 19:44 - 19:46
    Tämä luokka on implementoitu C-koodissa.
  • 19:46 - 19:50
    Osa luokista SPL:ssä, joka on yksi PHP:n kirjastoista,
  • 19:50 - 19:52
    ovat implementoitu C:ssä, ja siitä on tässä kyse.
  • 19:52 - 19:54
    Kuten näette ensimmäisellä rivillä.
  • 19:54 - 19:57
    Kaksi arvoa on määritetty: entry ja inf.
  • 19:57 - 19:59
    Nämä ovat zval-arvoja.
  • 19:59 - 20:01
    Eli ovat zval-tietue-typpiä.
  • 20:01 - 20:05
    Ja niitä ei missään vaiheessa alusteta tässä koodissa.
  • 20:05 - 20:09
    Ja muutaman rivin jälkeen pääsemme tähän lauseeseen,
  • 20:09 - 20:12
    jossa kutsutaan php_var_unserialize-funktiota.
  • 20:12 - 20:15
    Tämä on C-implementaatio unserialize-funktiosta.
  • 20:15 - 20:18
    Ensimmäinen arvo on viittaus tähän inf-arvoon,
  • 20:18 - 20:19
    jota ei koskaan alustettu.
  • 20:19 - 20:24
    Tämän tuli olla out-muuttuja, mutta se ei ole. Okei.
  • 20:24 - 20:27
    Mutta tässä aiomme säilöä merkkijonon ja unserialisoida sen.
  • 20:27 - 20:29
    Seuraava muuttuja on p.
  • 20:29 - 20:31
    P osoittaa merkkijonoon jota ollaan unserialisoimassa.
  • 20:31 - 20:33
    Joten mitä tämä funktio tekee.
  • 20:33 - 20:37
    Se unserialisoi P:n osoittaman merkkijonon ja säilöö arvon inf-muuttujaan.
  • 20:38 - 20:41
    Kuitenkin sisäisesti päädymme tähän riville:
  • 20:41 - 20:43
    "zval pointer destroy",
  • 20:43 - 20:44
    joka tarkoittaa
  • 20:44 - 20:46
    "olkaa hyvä ja tuhotkaa tämä zval",
  • 20:46 - 20:48
    johon viitataan rval-muuttujalla.
  • 20:48 - 20:49
    Ja mikä on rval meidän tilanteessamme?
  • 20:49 - 20:52
    Se on inf. Se on juurikin se asia,
  • 20:52 - 20:54
    mitä emme alustaneet.
  • 20:54 - 20:56
    Ja syy miksi koodi tekee tämän,
  • 20:56 - 21:01
    on varmistaakseen ettei zvalissa ole mitään arvoa ennen kuin siihen ollaan kirjoittamassa uusia arvoja.
  • 21:01 - 21:04
    Mutta koska tätä arvoa ei koskaan alustettu,
  • 21:04 - 21:07
    tämä arvo on pelkkää roskaa stackista.
  • 21:07 - 21:09
    Ja jos muodostat pinosi oikein,
  • 21:09 - 21:10
    voit aiheuttaa pahoja asioita.
  • 21:11 - 21:15
    Joten tämä oli CVE-2016-7480.
  • 21:16 - 21:18
    Seuraava esimerkki on tyyppihämmennys/-sekaannus.
  • 21:18 - 21:21
    Me aiomme luottaa siihen faktaan,
  • 21:21 - 21:25
    että viittausten tekeminen on hyvin monimutkainen prosessi kuten näitte.
  • 21:25 - 21:28
    Ja se muuttaa zvalin tyyppiä.
  • 21:28 - 21:29
    Ja me voimme olettaa,
  • 21:29 - 21:32
    että joku unohti tämän mahdollisuuden
  • 21:32 - 21:33
    ja tämä on juurikin se mitä tapahtui.
  • 21:33 - 21:36
    Joten meillä on sama funktio uusiksi.
  • 21:36 - 21:39
    Tässä on hieman enemmän koodia samasta funktiosta,
  • 21:39 - 21:43
    mutta se on siis SplObjectStoragen unserialize.
  • 21:43 - 21:45
    Ja kuten näette toisella rivillä,
  • 21:45 - 21:47
    kutsumme sisäistä unserializea
  • 21:47 - 21:50
    ja muunnamme taas p:n osoittaman merkkijonon
  • 21:50 - 21:56
    ja tallennamme tuloksen zval entryyn. Okei?
  • 21:56 - 21:58
    Kaksi riviä myöhemmin tarkastamme
  • 21:58 - 22:00
    juuri äsken unserialisoimamme asian tyypin.
  • 22:00 - 22:02
    Tarkastaaksemme, että se on olio-tyyppiä.
  • 22:02 - 22:06
    Jos entryn tyyppi ei ole object,
  • 22:06 - 22:07
    funktio epäonnistuu:
  • 22:07 - 22:08
    Huonoja asioita tapahtuu.
  • 22:08 - 22:13
    Mutta jos se on tyyppiä object, voimme jatkaa.
  • 22:13 - 22:17
    Ja viimeisellä rivillä unserialisoimme seuraavan arvon.
  • 22:17 - 22:21
    P on edennyt ja nyt se osoittaa eteenpäin merkkijonossa
  • 22:21 - 22:23
    ja me muutamme p:n osoittaman merkkijonon
  • 22:23 - 22:24
    ja tallennamme sen inf-muuttujaan.
  • 22:25 - 22:29
    Mutta mitä tapahtuu, jos inf on oikeasti viittaus entryyn.
  • 22:29 - 22:33
    No, entryn tyyppi muuttuu. Ja katsotaanpa mitä tapahtuu.
  • 22:33 - 22:37
    Eli ensiksi unserialisoimme entryn ja se on olio.
  • 22:37 - 22:41
    Me tarkastamme, että tämä on oikeasti olio ja kaikki on hyvin.
  • 22:41 - 22:43
    Mutta seuraavaksi me unserialisoimme inf:n.
  • 22:43 - 22:47
    Ja inf on viittaus entryyn.
  • 22:47 - 22:49
    Joten prosessin mukaan,
  • 22:49 - 22:51
    ensiksi allokoimme _zend_reference:n kekoon,
  • 22:51 - 22:54
    ja alustamme sen olemaan entryn kopio.
  • 22:54 - 22:58
    Sitten vaihdamme entryn tyypin viittaukseksi
  • 22:58 - 23:00
    ja osoitamme sen tähän viittaukseen.
  • 23:00 - 23:03
    Ja tietysti lopuksi alustamme inf:n.
  • 23:03 - 23:04
    Mutta tässä prosessissa,
  • 23:04 - 23:07
    me oikeastaan vaihdamme entryn tyypin sen jälkeen,
  • 23:07 - 23:08
    kun se on tarkistettu.
  • 23:08 - 23:11
    Tämä on siis bugi ja huonoja asioita tapahtuu.
  • 23:11 - 23:15
    Se ei ole exploitti, mutta se on bugi ja se korjattiin.
  • 23:15 - 23:19
    Tämä on siis BUG #73258 PHP-system():ssä.
  • 23:19 - 23:22
    Tämä on päivän viimeinen bugi.
  • 23:22 - 23:23
    Ja se on "Vapautuksen jälkeinen käyttö".
  • 23:24 - 23:26
    Ongelman juurisyy on se,
  • 23:26 - 23:29
    että zval:t ovat upotettuna tietueisiin.
  • 23:29 - 23:31
    Ja me pidämme osoittimia zvaleihin,
  • 23:31 - 23:33
    mutta tietueilla on omat sääntönsä niiden muokkautumiselle.
  • 23:33 - 23:37
    Jotkut tietueet vaihtavat paikkaa muistissa,
  • 23:37 - 23:40
    kertomatta siitä mitään muuta.
  • 23:40 - 23:42
    Ja jos jatkamme näiden osoittimien käyttöä,
  • 23:42 - 23:44
    me todellisuudessa osoitamme muistipaikkaan,
  • 23:44 - 23:46
    joka ei ole enää pätevä.
  • 23:46 - 23:51
    Eli tällainen dynaaminen tietue voi olla esimeriksi hash-taulukko.
  • 23:51 - 23:55
    Ja tämä koodi process_nested_data -funktiosta.
  • 23:55 - 23:59
    Tämä funktio prosessoi jokaisen hash-taulukon unserializen aikana.
  • 23:59 - 24:03
    Hash-taulukot voivat olla myös olion ominaisuuksia.
  • 24:04 - 24:06
    Tässä ensimmäisellä rivillä määritetään muuttujat
  • 24:06 - 24:10
    ja seuraavalla rivillä lisäämme uuden arvon hash-taulukkoon.
  • 24:10 - 24:13
    Eli mitä teemme tässä zend_hash_add_new,
  • 24:13 - 24:15
    lisäämme uuden arvon.
  • 24:15 - 24:19
    Ensimmäinen parametri on hash-taulukko ja toinen on avain.
  • 24:19 - 24:24
    Funktion tuloksena on osoitin zval-arvoon.
  • 24:24 - 24:27
    Saamme dataa, joka osoittaa zval:iin.
  • 24:27 - 24:32
    Sitten kutsumme viimeistä riviä,
  • 24:32 - 24:35
    joka kutsuu unserialize-funktion sisäistä implementaatiota.
  • 24:35 - 24:39
    Ja se taas muuttaa p:n osoittaman merkkijonon
  • 24:39 - 24:43
    ja säilöön sen arvon muuttujaan data tai mihin data osoittaa.
  • 24:43 - 24:46
    Mutta katsokaapa viimeistä parametriä tässä.
  • 24:46 - 24:47
    Se on var_hash, eli se taulukko,
  • 24:47 - 24:49
    josta puhuimme edellisessä osiossa.
  • 24:49 - 24:55
    var_hash ylläpitää osoittimia jokaiseen arvoon,
  • 24:55 - 24:57
    jonka olemme käsitelleet, mukaanlukien data.
  • 24:57 - 25:00
    Data siis osoittaa sisäisesti hash-taulukkoon
  • 25:00 - 25:02
    ja se säilötään var_hash-taulukkoon.
  • 25:02 - 25:04
    Mutta mitä tapahtuu, jos onnistut lisäämään
  • 25:04 - 25:06
    jonkun muun arvon hash-taulukkoon.
  • 25:06 - 25:08
    Hash-taulukko saattaa muokata kokoaan.
  • 25:08 - 25:10
    Eikö? Hash-taulukot kasvavat joskus muistissa.
  • 25:10 - 25:12
    Kun ne kasvavat,
  • 25:12 - 25:15
    ne sisäisesti uudelleenallokoivat muistiaan sisältääkseen lisää arvoja.
  • 25:15 - 25:17
    Eli tältä se näyttää muistissa.
  • 25:17 - 25:19
    Ensiksi olet unserialisoimassa objektia.
  • 25:19 - 25:21
    Ja tällä objektilla on jotain ominaisuuksia.
  • 25:21 - 25:23
    Esimerkiksi sillä on kaksi ominaisuutta: 0 ja 1.
  • 25:23 - 25:26
    ja sitten onnistumme taianomaisesti lisäämään
  • 25:26 - 25:28
    uuden arvon ominaisuuden hash-taulukkoon.
  • 25:28 - 25:31
    Jolloin tämä uudelleenallokoi itsensä.
  • 25:31 - 25:34
    Eli nyt var_hash osoittaa uudet arvot,
  • 25:34 - 25:36
    jotka unserialisoitiin,
  • 25:36 - 25:39
    mutta kaksi edellistä arvoa eivät ole enää päteviä.
  • 25:40 - 25:42
    Tämä ei ole hyvin yleinen skenaario.
  • 25:42 - 25:45
    Se on hyvin vaikea hyväksikäyttää tai oikeastaan laukaista tätä haavoittuvuutta,
  • 25:45 - 25:47
    koska jos muistat tämän formaatin,
  • 25:47 - 25:53
    ennen olion unserialisoimista sen ominaisuuksien määrä määritetään.
  • 25:53 - 25:55
    Ja PHP varmistaa,
  • 25:55 - 25:57
    että hash-taulukossa on tarpeeksi tilaa
  • 25:57 - 25:59
    säilyttääkseen kaikki nämä ominaisuudet.
  • 25:59 - 26:04
    Mutta... On kaksi tapaa laukaista tämä haavoittuvuus.
  • 26:04 - 26:06
    Ensimmäinen on wakeup-funktio.
  • 26:06 - 26:09
    Tämä on funktio, jonka objektit voivat määrittää.
  • 26:09 - 26:14
    Tätä funktiota, metodia, kutsutaan objektin unserialisoimisen jälkeen.
  • 26:14 - 26:20
    Ja jos jostain syystä tämä funktio määrittää uuden ominaisuuden lennossa,
  • 26:20 - 26:22
    tulkki ei ole tietoinen tästä etukäteen.
  • 26:22 - 26:25
    Eli asettaessa uuden ominaisuuden lennossa,
  • 26:25 - 26:28
    voi laukaista tämän haavoittuvuuden.
  • 26:28 - 26:32
    Ja meillä on lisäksi myös minun lempiobjektini PHP:ssa tai siis luokka,
  • 26:32 - 26:34
    "date interval class".
  • 26:34 - 26:36
    Ja tällä luokalla on hyvin mielenkiintoinen käyttäytyminen.
  • 26:36 - 26:40
    Se ei alusta omia ominaisuuksien hash-taulukkoa etukäteen.
  • 26:40 - 26:46
    Tai se oikeastaan ainoastaan käsiteltäessä tämän objektin ominaisuuksia,
  • 26:46 - 26:50
    se määrittää ja lisää ominaisuutensa hash-taulukkoon.
  • 26:50 - 26:53
    Eli jos onnistumme päätymään johonkin toiminnallisuuteen,
  • 26:53 - 26:55
    esimerkiksi toString tai wakeup,
  • 26:55 - 26:59
    joka käsittelee tämän tai jonkun muun objektin ominaisuuksia,
  • 26:59 - 27:00
    kuten "date interval",
  • 27:00 - 27:02
    voimme laukaista tämän haavoittuvuuden.
  • 27:03 - 27:07
    Ja tämä oli CVE-2016-7479.
  • 27:07 - 27:10
    Eli nämä bugit ovat monimutkaisia.
  • 27:10 - 27:12
    On edelleen olemassa unserialize-haavoittuvuuksia.
  • 27:12 - 27:15
    Jopa tämän esitelmän lähettämisen ja tämän esityksen pitämisen välillä,
  • 27:15 - 27:20
    on raportoitu ja julkistettu ainakin yksi uusi.
  • 27:20 - 27:23
    Haavoittuvuudet ovat hieman erilaisia kuin mitä olemme tottuneet näkemään,
  • 27:23 - 27:25
    sillä zval-systeemi on hieman erilainen,
  • 27:25 - 27:27
    mutta silti muistikorruptiot...
  • 27:27 - 27:31
    Ja nämä haavoittuvuudet antavat meidän käyttää vapautettuja arvoja,
  • 27:31 - 27:32
    kuten olemme nähneet.
  • 27:32 - 27:34
    2 haavoittuvuutta antoivat meidän käyttää
  • 27:34 - 27:36
    vapautettuja arvoja ja tämä on ominaisuus,
  • 27:36 - 27:40
    jota tarvitsemme hyväksikäyttääksemme näitä haavoittuvuuksia.
  • 27:41 - 27:44
    Eli kun nyt tiedämme,
  • 27:44 - 27:46
    miten tämä järjestelmä toimii sisäisesti
  • 27:46 - 27:49
    ja miten zval toimii sekä olemme löytäneet hieman bugeja,
  • 27:49 - 27:52
    aiomme puhua hieman allokaattorista.
  • 27:52 - 27:56
    Sillä exploitatessamme tämänkaltaista muistikorruptiohaavoittuvuutta,
  • 27:56 - 27:57
    meidän pitää tietää,
  • 27:57 - 28:01
    miten allokaattori toimii ja miltä muisti näyttää.
  • 28:01 - 28:04
    Eli meillä oli edellinen PHP5-allokaattori,
  • 28:04 - 28:05
    joka ei ole niin tärkeä,
  • 28:05 - 28:08
    mutta se oli keko-pohjainen allokaattori.
  • 28:08 - 28:12
    Jokainen paikka muistissa sovitti allokaatioyksikön PHP:ssä.
  • 28:12 - 28:13
    Okei, eli sitä kutsutaan paikaksi (slot),
  • 28:13 - 28:18
    ja sillä on koko sekä liput jokaista allokaatiota kohti.
  • 28:18 - 28:20
    Ja myös vapaiden paikkojen lista välimuistia varten.
  • 28:20 - 28:24
    Ja se oli tosi hauska ja kiva hyväksikäyttöä varten,
  • 28:24 - 28:26
    mutta nyt meillä on erilainen allokaattori.
  • 28:26 - 28:28
    Tämä allokaattori tässä on kokonaan uudelleenkirjoitettu.
  • 28:28 - 28:30
    Siinä ei ole mitään samaa,
  • 28:30 - 28:35
    ja se sisältää muistisäiliö kuten te tunnette ne sekä vapaalistan.
  • 28:35 - 28:36
    Tämä on käytännössä miten allokaattori toimii.
  • 28:36 - 28:38
    Nämä ovat käytännössä perus rakennuspalikat.
  • 28:38 - 28:40
    Ja nyt aion heittää teille hieman yksityiskohtia
  • 28:40 - 28:43
    ja te varmaankin näette ne, tai ette.
  • 28:43 - 28:47
    Allokaattori toimii 2 MB paloissa käyttöjärjestelmältä
  • 28:47 - 28:49
    ja nämä palat on jaettu sivuihin.
  • 28:49 - 28:51
    Ensimmäinen sivu on sivukuvaaja,
  • 28:51 - 28:53
    joka kuvaa palan.
  • 28:54 - 28:58
    Sillä on pari tietuetta ja kaksi tärkeää ovat se joka kuvailee sivut:
  • 28:58 - 29:01
    Mitkä sivut ovat käytössä tai
  • 29:01 - 29:04
    vapaana ja se joka sisältää osoittimet muistisäiliö
  • 29:04 - 29:05
    ja vapaisiin muistipaikkoihin,
  • 29:05 - 29:07
    jotka oli alustettu.
  • 29:07 - 29:11
    Ja jokainen muistivarasto on tietyn kokoinen vapaalista.
  • 29:11 - 29:14
    Meillä on 32-tavuiset ja 16-tavuiset.
  • 29:14 - 29:17
    Ja se voi olla useita sivuja pitkä.
  • 29:17 - 29:19
    Nyt katsotaanpa siinä muodossa missä voitte edes muistaa tämän.
  • 29:19 - 29:26
    Eli tässä on yksi 2MB pala käyttöjärjestelmästä. Ja se on jaettu sivuihin.
  • 29:26 - 29:28
    Ensimmäinen sivu on palankuvaaja.
  • 29:28 - 29:33
    Näette vapaat paikat, jotka ovat vain taulukko osoittimia vapaalistoihin.
  • 29:33 - 29:36
    Ja sivuinformaatio jokaista sivua varten.
  • 29:36 - 29:38
    Ja tältä muistisäiliö näyttää.
  • 29:38 - 29:40
    Eli se voi olla useita sivuja pitkä.
  • 29:40 - 29:42
    Tämä on 16-tavuinen säiliö,
  • 29:42 - 29:44
    ja me alustamme sen vapaalistana.
  • 29:44 - 29:46
    Eli jokainen 16 tavua osoittaa seuraaviin tavuihin.
  • 29:46 - 29:50
    Ja me rekisteröimme sen palan kuvauksessa.
  • 29:50 - 29:54
    Joten meillä on sivun tiedot 16 tavua joka on 2 sivun alueella,
  • 29:54 - 29:57
    ja osoittaa vapaalistaan.
  • 29:57 - 30:00
    Allokointialgoritmi on varsin yksinkertainen.
  • 30:00 - 30:05
    Ensiksi olettaen, että haluamme allokoida 30-kokoisen paikan,
  • 30:05 - 30:07
    tarkastamme mihin säiliöön se kuuluu.
  • 30:07 - 30:09
    Uskoisin, että se kuuluu säiliöön numero 5.
  • 30:09 - 30:14
    Sitten tarkistamme onko vapaalistaa vapaana tai onko säiliö alustettu.
  • 30:14 - 30:17
    Jos yhtään alustettua säiliötä ei ole me alustamme uuden säiliön
  • 30:17 - 30:19
    ja otamme sen käyttöön vapaalistasta.
  • 30:19 - 30:22
    Oletetaan, että haluamme allokoida 30 tavua.
  • 30:22 - 30:25
    Nyt ei ole 30-tavuista säiliötä vapaana,
  • 30:25 - 30:30
    joten alustamme uuden säiliön ja otamme sen vapaalistalta.
  • 30:30 - 30:33
    Olettaen, että haluamme tehdä siirron samankokoiseen,
  • 30:33 - 30:34
    se on vieläkin yksinkertaisempaa:
  • 30:34 - 30:35
    Otamme sen vain vapaalistalta.
  • 30:36 - 30:39
    "Free memory" on päinvastainen operaatio.
  • 30:39 - 30:41
    Eli saamme jonkun osoittimen,
  • 30:41 - 30:43
    jonka haluamme vapauttaa takaisin muistivarastoon.
  • 30:43 - 30:45
    Eli tarkistamme mihin palaan se kuuluu
  • 30:45 - 30:48
    ja mille sivulle siinä palassa.
  • 30:48 - 30:49
    Luemme palan kuvauksen,
  • 30:49 - 30:52
    tietääksemme mihin vapaalistaan työntää se takaisin
  • 30:52 - 30:54
    ja työnnämme sen takaisin vapaalistaan.
  • 30:54 - 30:59
    Eli olettaen, että haluamme vapauttaa tämän säiliön ensimmäisen paikan.
  • 30:59 - 31:01
    Silloin katsomme, että se kuuluu kolmanteen sivuun
  • 31:01 - 31:04
    ja kolmas sivu on säiliöstä 32.
  • 31:04 - 31:07
    Menemme vapaalistaan ja puskemme sen takaisin.
  • 31:09 - 31:10
    Haluan muistaa allokaattorista sen,
  • 31:10 - 31:13
    että allokaattori on hyvin ennustettava,
  • 31:13 - 31:15
    mikä on tärkeää meille, eli exploittaajille.
  • 31:15 - 31:19
    Ja on mahdotonta vapauttaa sekalaisia osoittimia.
  • 31:19 - 31:22
    Tätä käytettiin edellisessä exploittitekniikassa,
  • 31:22 - 31:23
    mutta se ei ole enää mahdollista,
  • 31:23 - 31:25
    sillä meillä on bittioperaatioita ja lookup-toimintoja
  • 31:25 - 31:28
    ja on vaikeaa väärentää muistia näyttämään oikeannäköiseltä,
  • 31:28 - 31:30
    jotta tämä toimisi.
  • 31:30 - 31:33
    Ja me voimme hyväksikäyttää vapaalistan osoittimia saadaksemme mielivaltaisia oikeuksia.
  • 31:33 - 31:38
    Eli jos pystymme muuttaamaan vapaalistaa ja allokoimaan,
  • 31:38 - 31:41
    muutamia paikkoja, saatamme pystyä allokoimaan mihin paikkaan vain haluamme.
  • 31:41 - 31:44
    Ja aion selittää sen paljon myöhemmin.
  • 31:45 - 31:46
    Eli nyt kun meillä on haavoittuvuuksia
  • 31:46 - 31:49
    ja tiedämme allokaattorin toiminnasta,
  • 31:49 - 31:52
    on aika kirjoittaa exploitti.
  • 31:53 - 31:55
    Ja jokainen exploitti sisältää pari vaihetta.
  • 31:55 - 31:57
    Kaikkein yleisin on vuodot.
  • 31:57 - 32:01
    Haluamme vuodattaa hieman muisti-informaatiota kiertääksemme ASLR:n.
  • 32:01 - 32:06
    Sitten haluamme lukea hieman muisteja lukemalla dataa tai gadgetteja,
  • 32:06 - 32:09
    funktio-osoittimia jne.
  • 32:10 - 32:11
    Jos haluat kirjoittaa, voit kirjoittaa shell-koodia,
  • 32:11 - 32:15
    ehkä kirjoitat jotain muuta juttua ja me haluaisimme suorittaa koodia.
  • 32:16 - 32:17
    Sitä varten me täällä olemme.
  • 32:18 - 32:20
    Ensimmäinen asia mistä haluan puhua on vuoto.
  • 32:20 - 32:22
    Mielestäni se on kaikkein monimutkaisin vaihe
  • 32:23 - 32:25
    ja aiomme hyväksikäyttää allokaattoria.
  • 32:25 - 32:26
    Se on meidän paras ystävämme tässä.
  • 32:27 - 32:30
    Se perustuu karkeasti edelliseen exploittiin,
  • 32:30 - 32:31
    mutta on sen yleistys.
  • 32:32 - 32:35
    Aiomme käyttää kykyämme sarjallistaa vapautettuja objekteja,
  • 32:35 - 32:37
    ja uskoisin, että pystymme sarjallistamaan objekteja.
  • 32:37 - 32:38
    Ei pelkästään käyttämään niitä,
  • 32:38 - 32:40
    sillä tällä tavalla alunperin aloitimmekin.
  • 32:40 - 32:43
    Meillä oli unserialize. Jos unserialisoimme jotain,
  • 32:43 - 32:45
    se todennäköisesti oli aiemmin sarjallistettu.
  • 32:45 - 32:47
    Meillä on jonkinlainen mekanismi,
  • 32:47 - 32:50
    jolla sarjallistamme jotain ja unserialisoimme ja sarjallistamme takaisin
  • 32:50 - 32:52
    ja niin edespäin.
  • 32:52 - 32:54
    Allokaattori, jos muistatte, on vapaalista.
  • 32:54 - 32:57
    Eli se ohittaa kaiken, joka sille syötetään.
  • 32:57 - 33:02
    Eli jos vapautamme osoittimia allokaattori ohittaa ne.
  • 33:03 - 33:06
    Ja kun olemme vapauttaneet ja käyttäneet niitä,
  • 33:06 - 33:09
    voimme lukea näiden osoittimien kautta ja lukea jotain dataa,
  • 33:09 - 33:11
    joka oli myös vapautettu.
  • 33:12 - 33:13
    Eli tällä tavalla se tulee toimimaan.
  • 33:13 - 33:19
    Allokaattori on vapaalista ja ensimmäinen osoitin näissä vapaissa paikoissa on seuraava paikka.
  • 33:19 - 33:20
    Sehän on vain se osoitin, eikö?
  • 33:20 - 33:22
    Tässä on vapaan paikan tietue,
  • 33:22 - 33:25
    ja kuten näette, ensimmäinen kenttä on osoitin.
  • 33:25 - 33:27
    Kun luemme vapautettuja objekteja,
  • 33:27 - 33:29
    pystymme joskus lukemaan tämän osoittimen kautta.
  • 33:30 - 33:33
    Tarkoitan, että me vapautimme paikan ja edelleen käytämme sitä,
  • 33:33 - 33:37
    eli voimme lukea tämän osoittimen kautta seuraavaa vapaata paikkaa.
  • 33:37 - 33:41
    Eli tässä on minun lempiluokkani PHP:ssä:
  • 33:41 - 33:43
    Date interval -luokka.
  • 33:43 - 33:45
    Ja kuten näette, tässä on miten tietue on implementoitu muistissa
  • 33:45 - 33:47
    ja ensimmäinen kenttä on osoitin.
  • 33:47 - 33:49
    Kuinka onnekkaita olemmekaan. EIkös?
  • 33:50 - 33:52
    Se osoittaa tähän tietueeseen.
  • 33:52 - 33:54
    Tämä tietue on hyvin yksinkertainen.
  • 33:54 - 33:56
    Sillä on paljon kenttiä, mutta ne kaikki ovat kokonaislukuja.
  • 33:56 - 33:58
    Ne eivät pelkästään ole kokonaislukuja,
  • 33:58 - 34:00
    vaan "unsigned long long",
  • 34:00 - 34:04
    eli ne myös unserialisoidaan ja luetaan takaisin käyttäjälle.
  • 34:04 - 34:06
    Kun tätä luokkaa unserialisoidaan,
  • 34:06 - 34:10
    saamme myös nämä numerot: vuosi, kuukausi, päivä jne.
  • 34:11 - 34:14
    Eli miten väärennämme vuodot käytännössä.
  • 34:14 - 34:16
    Ensiksi allokoimme tämän DateIntervalin
  • 34:16 - 34:18
    ja allokoimme jonkun objektin vuodettavaksi,
  • 34:18 - 34:19
    esimerkiksi merkkijonon.
  • 34:19 - 34:21
    Sitten vapautamme molemmat objektit,
  • 34:21 - 34:24
    ensiksi merkkijonon ja seuraavaksi DateIntervalin.
  • 34:26 - 34:31
    Eli allokaattori aikoo ohittaa DateIntervalin osoittimella vapautettuun merkkijonoon,
  • 34:31 - 34:32
    koska näin se toimii.
  • 34:32 - 34:36
    Allokaattori ohittaa myös tämän merkkijonon joillakin osoittimilla.
  • 34:36 - 34:38
    Eli kun sarjallistamme tämän DateIntervalin,
  • 34:38 - 34:40
    aiomme lukea tämän objektin
  • 34:40 - 34:42
    Ja tässä on teille hieman hex-dumppia,
  • 34:42 - 34:44
    sillä todellakin halusitte sitä.
  • 34:44 - 34:47
    Ja tässä näette vapaalistan ennen kuin aloitamme exploittimme,
  • 34:47 - 34:49
    ja nyt allokoimme DateIntervalin.
  • 34:49 - 34:52
    Kuten näette, se osoittaa johonkin tietueeseen,
  • 34:52 - 34:55
    jonka alustin arvolla -1-luvuilla, koska sillä ei ole juurikaan merkitystä.
  • 34:55 - 35:00
    Allokoimme, tai siis unserialisoimme merkkijonon yksi toisensa jälkeen.
  • 35:00 - 35:05
    Ja nyt vapautamme nämä kaksi ja kuten näette DateInterval osoitin,
  • 35:05 - 35:08
    ensimmäinen osoitin, osoittaa vapautettuun merkkijonoon.
  • 35:08 - 35:10
    Ja sarjallistaessa tätä DateIntervalia,
  • 35:10 - 35:12
    se oikeastaan saa arvonsa merkkijonosta.
  • 35:12 - 35:14
    Se saa nämä osoittimet kokonaislukuina,
  • 35:14 - 35:15
    joka on varsin mukavaa.
  • 35:16 - 35:17
    Kuinka voimme lukea muistia?
  • 35:17 - 35:20
    Meillä on tämä hyvin kiva tietue jo valmiiksi olemassa.
  • 35:20 - 35:24
    Jos pystymme kontrolloimaan zvalia täydellisesti,
  • 35:24 - 35:28
    voimme vain vaihtaa tämän osoittimen mihin tahansa vain haluamme.
  • 35:28 - 35:30
    Eli ensimmäiseen kenttään osoittaminen DateIntervalissa
  • 35:30 - 35:34
    antaa meidän lukea minkälaista muistia tahansa.
  • 35:34 - 35:35
    Jos emme kontrolloi zvalia täysin,
  • 35:35 - 35:37
    mikä voi ollakin.
  • 35:37 - 35:39
    64-bittisessä se oli näin.
  • 35:39 - 35:41
    On olemassa monimutkaisempikin tapa,
  • 35:41 - 35:43
    mutta en aio puhua siitä tässä.
  • 35:43 - 35:46
    Mutta käytännössä voimme käyttää erilaista oliota:
  • 35:46 - 35:50
    DatePeriod-oliota, jonka ensimmäinen kenttä on osoitin,
  • 35:50 - 35:53
    joka osoittaa toiseen tietueeseen ja tämä tietue hallitsee toista osoitinta,
  • 35:53 - 35:56
    joka on annettu eteenpäin strcpy:lle unserialisoinnin yhteydessä.
  • 35:56 - 35:58
    Eli voimme lukea muistia strcpy:llä.
  • 35:58 - 36:00
    Ja voitte nähdä kaikki yksityiskohdat
  • 36:00 - 36:03
    julkaisemassani artikkelissa aiemmin tänä vuonna.
  • 36:03 - 36:06
    Annan teille linkit tämän esitelmän lopussa.
  • 36:07 - 36:09
    Miten voimme kirjoittaa muistiin?
  • 36:09 - 36:13
    Muistiin kirjoittaminen on paljon monimutkaisempaa.
  • 36:13 - 36:14
    Tässä on mitä aiomme tehdä.
  • 36:14 - 36:16
    Aiomme vapauttaa merkkijonoja takaisin allokaattorille.
  • 36:16 - 36:19
    Ja merkkijonoihin aiomme kirjoittaa osoittimia,
  • 36:19 - 36:23
    mihin tahansa muistiin haluammekin kirjoittaa.
  • 36:23 - 36:25
    Sitten aiomme hyväksikäyttää vapaalistaa.
  • 36:25 - 36:27
    Aiomme vaihtaa osoittimia vapaalistassa
  • 36:27 - 36:29
    ja aion lisätä tai vähentää niitä,
  • 36:29 - 36:33
    riippuen haavoittuvuudestamme eteenpäin muistissa.
  • 36:33 - 36:35
    Ja jossain vaiheessa lisätessämme niitä tarpeeksi,
  • 36:35 - 36:39
    ne oikeastaan osoittavat siihen muistikohtaan mihin haluamme kirjoittaa.
  • 36:39 - 36:41
    Eli muutaman allokoinnen jälkeen,
  • 36:41 - 36:45
    muistiallokaattori antaa meille osoitteen johon haluamme kirjoittaa.
  • 36:46 - 36:49
    Tältä näyttää mitä haluamme tehdä.
  • 36:49 - 36:51
    Eli miten voimme vapauttaa nämä merkkijonot?
  • 36:52 - 36:53
    Kuten sanoin,
  • 36:53 - 36:56
    jokainen käsittelemämme unserialisoitu arvo saa viittauksen var_hash-taulukkoon.
  • 36:56 - 36:59
    Eli meillä on viittaus lähes kaikkeen
  • 36:59 - 37:01
    ja mitään ei vapauteta unserialisoinnin yhteydessä.
  • 37:01 - 37:04
    On kuitenkin olemassa yksi poikkeus.
  • 37:04 - 37:07
    Hash-taulukossa voimme käyttää samaa avainta kahdesti.
  • 37:07 - 37:09
    Avaimiin ei säilytetä viittauksia.
  • 37:09 - 37:11
    Ja jos käytämme samaa avainta kahdesti,
  • 37:11 - 37:13
    ja avaimet voivat olla merkkijonoja.
  • 37:13 - 37:15
    Toisella kertaa käytettäessä avainta,
  • 37:15 - 37:18
    se vapautuu. Hash-taulukko katsoo avainta ja toteaa:
  • 37:18 - 37:20
    "Minulla on jo tuo avain, en tarvitse sitä uudestaan",
  • 37:20 - 37:22
    ja vapauttaa sen takaisin allokaattorille.
  • 37:22 - 37:24
    Mitään viittauksia siihen ei ole tehtynä
  • 37:24 - 37:26
    ja se on takaisin allokaattorissa meitä varten.
  • 37:27 - 37:32
    Seuraavaksi meidän pitää tietää miten hyväksikäyttää osoittimia vapaalistassa.
  • 37:32 - 37:34
    Tämä on kaikkein mielenkiintoisin osa tässä.
  • 37:35 - 37:38
    Syy miksi se on mahdollista,
  • 37:38 - 37:39
    ja se on hyvin yleistä,
  • 37:39 - 37:42
    on sillä meillä on tässä tyyppihämmennystä.
  • 37:42 - 37:46
    Meillä on vapaat paikat, jonka ensimmäinen kenttä on osoitin.
  • 37:46 - 37:49
    Mutta meillä on myös jotain vapautettuna.
  • 37:49 - 37:51
    Arvo, joka vapautettii, johon meillä on edelleen viittaus.
  • 37:51 - 37:58
    Ja kekomuistissa kaikilla tietueilla on viittauslaskenta.
  • 37:58 - 38:01
    Viittauslaskenta on aina ensimmäinen kenttä.
  • 38:01 - 38:04
    Eli jos otetaan esimerkiksi _zend_object.
  • 38:04 - 38:06
    Tämän tietueen ensimmäinen kenttä on viittauslaskenta.
  • 38:06 - 38:11
    Eli jos meillä on tyyppihämmennystä olion ja...
  • 38:11 - 38:13
    Tai ei tyyppihämmennys,
  • 38:13 - 38:15
    mutta jos objekti olisi vapautettu ja voisimme edelleen käyttää sitä,
  • 38:15 - 38:20
    kasvattamalla tai vähentämällä viittauksia tähän olioon,
  • 38:20 - 38:22
    oikeastaan kasvattaa tai vähentää osoitinta.
  • 38:22 - 38:25
    Eli tällä tavalla voimme kontrolloida tätä osoitinta.
  • 38:25 - 38:27
    Tässä vähän lisää hex-dumppia.
  • 38:27 - 38:29
    Eli tämä on osa exploittia,
  • 38:29 - 38:32
    jonka kirjoitin bugiin 71311.
  • 38:32 - 38:37
    Ja tässä näette, että vapautimme merkkijonot jo takaisin allokaattorille.
  • 38:37 - 38:40
    Eli näette neljäykköset hex-dumpissa.
  • 38:40 - 38:42
    Ja nyt aiomme laukaista haavoittuvuuden.
  • 38:42 - 38:47
    Tämä haavoittuvuus on taulukko-objekti-luokassa.
  • 38:47 - 38:51
    Tämän jäsentäminen kasvattaa osoittimen arvoa vapaalistassa kahdella.
  • 38:51 - 38:55
    Ja nyt meillä on vapautuksen jälkeinen käyttö tässä osoitteessa,
  • 38:55 - 38:58
    johon vapaalista osoittaa.
  • 38:58 - 38:59
    Se on edelleen allokaattorissa,
  • 38:59 - 39:01
    mutta meillä on viittaus siihen.
  • 39:01 - 39:05
    Ja se oli 11. arvo, jonka jäsensimme,
  • 39:05 - 39:07
    eli viittauksen lisääminen tähän osoitteseen.
  • 39:07 - 39:09
    Eli R11 jäsentää R11 jne.
  • 39:09 - 39:13
    Me kasvatamme tätä osoitinta kahdella joka kerta.
  • 39:13 - 39:15
    Ja jossain vaiheessa päädymme arvoon,
  • 39:15 - 39:18
    joka juuri vapautettiin allokaattorille.
  • 39:18 - 39:22
    Eli nyt jos allokoimme kahdesti tästä säiliöstä,
  • 39:22 - 39:26
    ensimmäisellä kerralla allokoimme äskettäisen korruptoituneen objektin
  • 39:26 - 39:29
    ja toisella kertaa voimme kirjoittaa 414141:een,
  • 39:29 - 39:30
    ja saamme segmentointivirheen.
  • 39:30 - 39:32
    Tämä on juurikin se mitä halusimmekin.
  • 39:33 - 39:34
    Eli koodin suorittaminen.
  • 39:34 - 39:37
    Kaiken tämän jälkeen koodin suorittaminen on sangen yksinkertaista.
  • 39:38 - 39:39
    Jos kontrolloimme zvalia,
  • 39:39 - 39:41
    yksinkertaisin tapa, kuten sanoin,
  • 39:41 - 39:43
    on ohittaa takaisinkutsu.
  • 39:43 - 39:44
    Kun hallitset jotain objektia,
  • 39:44 - 39:46
    voit päättää mitä takaisinkutsuja sillä on.
  • 39:46 - 39:48
    Mutta jos et kontrolloi zvalia täysin,
  • 39:48 - 39:50
    voit vain... Meillä on oikea primitiivi.
  • 39:50 - 39:54
    Eli voimme kirjoittaa funktion osoittimen ja se on aikalailla siinä.
  • 39:54 - 39:57
    Eli: opittavaa tästä exploitista.
  • 39:57 - 39:59
    Allokaattori on ystäväsi,
  • 39:59 - 40:00
    käytä sitä viisaasti.
  • 40:00 - 40:03
    Nämä primitiiviset tietotyypit ovat uudelleenkäytettäviä,
  • 40:03 - 40:07
    niitä voi käyttää monissa eri haavoittuvuuksissa liittyen unserialisointi-mekanismeihin.
  • 40:07 - 40:09
    Yhdistäen nämä kaikki primitiivit,
  • 40:09 - 40:11
    pystyt suorittamaan koodia etänä (RCE)
  • 40:13 - 40:17
    Johtopäätöksiä: Vaikka kirjoitat koodia korkean tason kielellä kuten PHP,
  • 40:17 - 40:20
    olet edelleen haavoittuvainen muistikorruptioon
  • 40:20 - 40:22
    tai muihin matalan tason ongelmiin.
  • 40:23 - 40:26
    PHP:n uusi malli perustuu tehokkuuteen.
  • 40:26 - 40:28
    Sinulla on edelleen haavoittuvuuksia.
  • 40:28 - 40:30
    En usko, että se on sen turvallisempi tai turvattomampi.
  • 40:32 - 40:34
    Allokaattori on exploitti-ystävällinen.
  • 40:34 - 40:37
    Kun kirjoitat exploittia, käytä sitä.
  • 40:38 - 40:40
    Ja älä ikinä ikinä käytä unserialisea.
  • 40:40 - 40:43
    Tämä funktio on käytännössä on etänä koodin suorittamista varten.
  • 40:43 - 40:47
    Jokainen kerta, kun se on ollut koodissa tavoitettavissa,
  • 40:47 - 40:49
    sitä on hyväksikäytetty.
  • 40:49 - 40:52
    Lisää tietoa löydät checkpoint-blogista,
  • 40:52 - 40:56
    ja myös tämän esitelmän kuvaustekstissä on linkki julkaisemaani artikkeliin.
  • 40:57 - 41:02
    Lähiaikoina toinenkin julkaisu tulee tulemaan puhumistani haavoittuvuuksista.
  • 41:02 - 41:05
    Lisää tietoa ja myös kolmas haavoittuvuus,
  • 41:05 - 41:07
    josta en tässä puhunut.
  • 41:07 - 41:10
    PHP bugisysteemi on toinen linkki
  • 41:10 - 41:14
    ja siellä on kaikki listatut bugit sekä haavoittuvuudet.
  • 41:14 - 41:17
    Osalla bugeista ei ole CVE:tä ikävä kyllä.
  • 41:18 - 41:20
    Kolmas linkki on Nikita Popova-blogi.
  • 41:20 - 41:23
    Uskoisin, että äänsin hänen nimensä oikein.
  • 41:23 - 41:25
    Hän on PHP:n pääkontribuuttori
  • 41:25 - 41:29
    ja hänellä on paljon selityksiä PHP:n sisäisistä mekanismeista.
  • 41:29 - 41:31
    Jos haluatte olla minuun yhteydessä,
  • 41:31 - 41:33
    teillä on minun yrityssähköposti, Twitter ja olen yannayl
  • 41:33 - 41:35
    monilla muilla alustoilla,
  • 41:35 - 41:38
    kuten gmail jne. Couch surfing, enpä tiedä.
  • 41:39 - 41:43
    Eli tässäpä tämä. Onko kysyttäviä?
  • 41:43 - 41:54
    (Yleisö taputtaa)
  • 41:54 - 41:56
    Kiitos Yannay.
  • 41:56 - 41:57
    Jos teillä on kysymyksiä,
  • 41:57 - 42:01
    olkaa hyvä ja asettukaa jonoon mikrofonien viereen ja kysykää kysymyksenne.
  • 42:01 - 42:03
    Jos olet lähdössä, tehkää se hiljaa.
  • 42:04 - 42:08
    Onko kysymyksiä täältä tai internetistä?
  • 42:15 - 42:17
    Ihmiset ovat ällikällä lyötyjä.
  • 42:19 - 42:21
    Aloitan sitten itse kysymyksellä,
  • 42:21 - 42:21
    koska minulla on yksi.
  • 42:21 - 42:23
    En ymmärtänyt sisäisiä juttuja ihan hirveästi,
  • 42:23 - 42:26
    mutta tietyissä hyväksikäytön tavoissa,
  • 42:26 - 42:30
    joista puhutaan, voimmeko olettaa näkemämme tätä luonnossa?
  • 42:30 - 42:34
    Oikeastaan PHP7 ei ole hirveän laajalti käytetty tällä hetkellä.
  • 42:34 - 42:35
    Luulisin, että se on noin 2%.
  • 42:35 - 42:36
    Se on vasta vuoden vanha,
  • 42:36 - 42:41
    mutta kunhan suuret alustat ja sisällönhallintajärjestelmät
  • 42:41 - 42:45
    siirtyvät tähän uuteen kieleen ennustan,
  • 42:45 - 42:47
    että tulemme näkemään jotain näistä ja muista haavoittuvuuksista.
  • 42:47 - 42:50
    Mutta uskon, että näemme exploitteja tapahtuvan.
  • 42:51 - 42:52
    Kiitos
  • 42:53 - 42:55
    Kysymyksiä yleisöltä tai internetistä?
  • 42:57 - 42:59
    Internetillä on kysymys.
  • 42:59 - 43:00
    Kyllä.
  • 43:00 - 43:01
    Onko olemassa mitään suosittuja projekteja,
  • 43:01 - 43:03
    joihin nämä haavoittuvuudet vaikuttavat?
  • 43:04 - 43:09
    Ei tietääkseni, sillä PHP7 ei ole vielä laajalti käytössä.
  • 43:09 - 43:12
    Mikään suuri sisällönhallintajärjestelmä ei käytä PHP7:ää.
  • 43:12 - 43:14
    (Naurua yleisöstä)
  • 43:14 - 43:15
    Anteeksi.
  • 43:15 - 43:19
    Internet, jos teillä on muita kysymyksiä, olkaa hyvä.
  • 43:23 - 43:25
    Kukaan yleisöstä? Viimeinen mahdollisuus.
  • 43:27 - 43:27
    Okei,
  • 43:27 - 43:31
    taas antakaa suuret aplodit Yannaylle hyvästä esitelmästä.
  • 43:31 - 43:32
    Kiitos.
  • 43:32 - 43:38
    (Yleisö taputtaa)
  • 43:38 - 43:42
    (Teemamusiikki soi)
  • 43:42 - 43:49
    Translated by Jouko Voutilainen (ITKST56 course assignment at JYU.fi)
Title:
PHP7 unserializen hyväksikäyttö (exploiting)
Description:

more » « less
Video Language:
English
Duration:
44:02

Finnish subtitles

Revisions