Chromen nollapäivä: "Tämä hyväksikäyttö on luonnossa", joten tarkista versiosi nyt

Chromen nollapäivä: "Tämä hyväksikäyttö on luonnossa", joten tarkista versiosi nyt

Lähdesolmu: 2704382

Googlen uusin Chrome-päivitys on julkaistu, ja tällä kertaa yritys ei ole vähätellyt sanojaan noin toinen kahdesta tietoturvakorjauksesta, joka sisältää:

Google on tietoinen, että hyväksikäyttö CVE-2023-3079 esiintyy luonnossa.

Ei ole olemassa kahden erotusasteen sananlaskua, kuten olemme usein nähneet Googlelta aiemmin, sanoakseen, että yritys "on tietoinen raporteista" hyväksikäytöstä.

Tällä kertaa se on "olemme tietoisia kaikesta itse", mikä kääntyy vielä suppeammin sanaksi "tiedämme, että roistot käyttävät tätä väärin puhuessamme", koska vikaraportti tuli suoraan Googlen omalta uhkatutkimusryhmältä.

Kuten tavallista, tämä tarkoittaa, että Google tutki aktiivista hyökkäystä (joko Googlea itseään tai jotain ulkopuolista organisaatiota vastaan, emme tiedä), jossa Chrome oli joutunut aiemmin tuntemattoman tietoturva-aukon takia.

Vika kuvataan yksinkertaisesti seuraavasti: Kirjoita Confusion V8:ssa. (Ymmärrettävästi Google ei sano tämän enempää tässä vaiheessa.)

Kuten olemme aiemmin selittäneet, a tyyppinen hämmennys virhe tapahtuu, kun toimitat ohjelmalle osan dataa, joka sen on tarkoitus jäsentää, validoida, käsitellä ja toimia yhdellä tavalla...

…mutta onnistut myöhemmin huijaamaan ohjelman tulkitsemaan tiedot eri tavalla, luvattomalla, vahvistamattomalla ja mahdollisesti vaarallisella tavalla.

Tyyppisekaantumisen vaarat selitetty

Kuvittele, että kirjoitat ohjelmaa C-kielellä. (Sillä ei ole väliä, osaatko C:tä vai et, voit vain seurata sitä joka tapauksessa.)

C:ssä muuttujat yleensä deklaroidaan yksitellen, jolloin ei vain varata muistia, johon ne voidaan tallentaa, vaan myös signaloida ohjelmalle, kuinka näitä muuttujia on tarkoitus käyttää.

Esimerkiksi:

 pitkä pitkä int JulianDayNumber; signed char* CustomerName;

Ensimmäinen muuttujan ilmoitus varaa 64 bittiä astromonomisen päivän numeroa edustavan tavallisen vanhan kokonaisluvun tallentamiseen. (Jos ihmettelet, tänä iltapäivänä on JDN 23157 – Julian Days alkaa keskipäivällä, ei keskiyöllä, koska tähtitieteilijät työskentelevät usein yöllä ja keskiyö on heidän työpäivänsä keskellä.)

Toinen varaa 64 bittiä muistiosoitteen tallentamiseen, josta asiakkaan nimen tekstijono löytyy.

Kuten voit kuvitella, sinun on parempi olla sekoittamatta näitä kahta arvoa, koska numero, joka on järkevä ja turvallinen käyttää päivänumerona, kuten 23157, olisi melkein varmasti vaarallista käyttää muistiosoitteena.

Kuten näet tästä käynnissä olevan Windows-ohjelman muistivedosta, pienin käytettäväksi varattu muistiosoite alkaa 0x00370000, joka on 3,604,480 XNUMX XNUMX desimaalilukuna, paljon suurempi kuin mikään järkevä päiväluku.

Windowsin käyttämät todelliset muistiosoitteet vaihtelevat satunnaisesti ajan myötä, mikä tekee muistiasetelmastasi huijareiden vaikeampaa arvata. Jos siis ajaisit samaa ohjelmaa, saat arvot, mutta ne ovat kuitenkin samanlaisia:

Ja (vaikka se on yllä olevan kuvan alareunassa) ajonaikaisten käyttäjätietojen osion muistiosoitteet, kun tämä ohjelma suoritettiin 0x01130000 että 0x01134FFF, joka edustaa epätodennäköistä ajanjaksoa 22. heinäkuuta 44631 - 16. elokuuta 44687.

Itse asiassa, jos yrität sekoittaa nämä kaksi muuttujaa, kääntäjän pitäisi yrittää varoittaa sinua, esimerkiksi näin:

 JulianDayNumber = AsiakkaanNimi; AsiakkaanNimi = JulianDayNumber; varoitus: määritys tekee kokonaisluvun osoittimesta ilman cast-varoitusta: määritys tekee osoittimen kokonaisluvusta ilman heittoa

Nyt, jos olet koskaan ohjelmoinut C:llä, tiedät, että mukavuuden vuoksi voit ilmoittaa muuttujia useilla eri tulkinnoilla käyttämällä union avainsana, kuten tämä:

 liitto { pitkä pitkä int JulianDayNumer; signed char* CustomerName; } data;

Voit nyt viitata täsmälleen samaan muuttujaan muistissa kahdella eri tavalla.

Jos kirjoitat data.JulianDayNumber, tulkitset taianomaisesti tallennetut tiedot kokonaislukuna, mutta kirjoittavat data.CustomerName kertoo kääntäjälle, että viittaat muistiosoitteeseen, vaikka käytät samoja tallennettuja tietoja.

Mitä teet, enemmän tai vähemmän, myönnät kääntäjälle, että joskus käsittelet saamiasi tietoja päivämääränä ja toisinaan muistiosoitteena, ja että otat vastuun muistaa, mikä tulkinta pätee millä hetkellä koodissa.

Saatat päättää ottaa käyttöön toisen muuttujan, joka tunnetaan nimellä a tag (yleensä kokonaisluku), joka sopii sinun kanssasi union seurataksesi, minkä tyyppisten tietojen kanssa työskentelet juuri nyt, esimerkiksi:

 struct { int tag; liitto { pitkä pitkä int JulianDayNumer; signed char* CustomerName; } data; } arvo;

Saatat päättää milloin value.tag asetetaan 0, tietoja ei ole vielä alustettu käytettäväksi, 1 tarkoittaa, että tallennat päivämäärän, 2 tarkoittaa, että se on muistiosoite, ja kaikki muu tarkoittaa virhettä.

No, sinun on parempi, ettet anna kenenkään muun sotkea sitä value.tag tai ohjelmasi saattaa toimia väärin dramaattisesti.

Huolestuttavampi esimerkki voisi olla tällainen:

 struct { int tag; // 1 = hash, 2 = funktioosoittimien liitto { unsigned char hash[16]; // joko tallentaa satunnaisen hash-rakenteen { void* openfunc; // tai kaksi huolellisesti vahvistettua void* closefunc; // koodiosoittimet suoritettavaksi myöhemmin } validoida; } } arvo;

Nyt ylikuormitamme samaa muistilohkoa, jotta voimme joskus käyttää sitä tallentamaan 16-tavuisen hashin ja joskus tallentamaan kaksi 8-tavuista osoitinta toimintoihin, joita ohjelmamme kutsuu myöhemmin.

Ilmeisesti milloin value.tag == 1, annamme ohjelmistomme tallentaa mielellämme minkä tahansa 16-tavuisen merkkijonon liitolle varattuun muistiin, koska tiivisteet ovat näennäissatunnaisia, joten mikä tahansa tavukokoelma on yhtä todennäköinen.

Mutta kun value.tag == 2, koodimme tulee olla erittäin varovainen, jotta käyttäjä ei anna vahvistamattomia, epäluotettavia, tuntemattomia toimintoosoitteita myöhemmin suoritettavaksi.

Kuvittele nyt, että voisit lähettää arvon tälle koodille, kun tagi oli asetettu arvoon 1, joten sitä ei tarkistettu ja vahvistettu…

…mutta myöhemmin, juuri ennen kuin ohjelma todella käytti tallennettua arvoa, pystyit huijaamaan koodin vaihtamaan tunnisteen arvoon 2.

Koodi hyväksyisi sitten vahvistamattomat toimintoosoitteesi "tunnetuiksi ja jo varmistetuiksi turvallisiksi" (vaikka ne eivät olleetkaan) ja lähettäisi ohjelman suorittamisen luotettavasti väärään paikkaan muistissa, jonka valitsit lujasti etukäteen.

Ja näin tapahtuu tyyppihämmennysvirheessä, vaikkakin käyttämällä keksittyä ja yksinkertaistettua esimerkkiä,

Muisti, joka olisi turvallista kuluttaa, jos sitä käsitellään yhdellä tavalla, toimitetaan haitallisesti ohjelmalle prosessoitavaksi vaihtoehtoisella, vaarallisella tavalla.

Mitä tehdä?

Varmista, että sinulla on Chromen tai Chromiumin uusin versio.

Haluat Chromen 114.0.5735.106 tai uudempi Macissa ja Linuxissa ja 114.0.5735.110 tai uudempi Windowsissa.

Tämä virhe vaikuttaa myös Microsoft Edgeen, joka perustuu Chromiumiin.

Microsoft on tähän mennessä [2023-06-06T16:25:00Z] huomasin sen

Microsoft on tietoinen viimeaikaisista luonnossa esiintyvistä hyväksikäytöistä. Työskentelemme aktiivisesti tietoturvakorjauksen julkaisemiseksi.

Edgen versio on tällä hetkellä 114.0.1823.37, joten mikä tahansa numeroitu sitä myöhemmin tulee sisältää Microsoftin CVE-2023-3079-korjaukset.

Voit tarkistaa version ja pakottaa päivityksen, jos et ole vielä saanut päivitystä:

  • Google Chrome. Kolmen pisteen valikko (⋮) > Apu: > Tietoja Chromesta.
  • Microsoft Edge. Asetukset ja paljon muuta (…) > Apua ja palautetta > Tietoja Microsoft Edgestä.

Ole hyvä.


Aikaleima:

Lisää aiheesta Naked Security