Chrome'i nullpäev: „See ärakasutamine on looduses”, nii et kontrollige oma versiooni kohe

Chrome'i nullpäev: „See ärakasutamine on looduses”, nii et kontrollige oma versiooni kohe

Allikasõlm: 2704382

Google'i uusim Chrome'i värskendus on väljas ja seekord ka ettevõte pole oma sõnu peenemaks teinud umbes üks kahest turvapaigast, mis sisaldab:

Google on teadlik, et ärakasutamine CVE-2023-3079 eksisteerib looduses.

Pole olemas kahe eraldusastmega sõnasõna, nagu oleme sageli varem Google'ilt näinud, et öelda, et ettevõte on ärakasutamise aruannetest teadlik.

Seekord on see "me oleme sellest kõigest ise teadlikud", mis tähendab veelgi otsekohemalt "me teame, et kelmid kuritarvitavad seda, kui me räägime", arvestades, et veaaruanne pärineb otse Google'i enda ohuuuringute rühmalt.

Nagu tavaliselt, viitab see sellele, et Google uuris aktiivset rünnakut (kas Google'i enda või mõne välise organisatsiooni vastu, me ei tea), mille käigus Chrome oli sattunud varem tundmatu turvaauku.

Viga kirjeldatakse lihtsalt järgmiselt: Tippige V8-s Segadus. (Arusaadavalt ei ütle Google praeguses etapis rohkemat.)

Nagu me varem selgitasime, a tüübi segadus viga juhtub siis, kui esitate programmile hulga andmeid, mida see peaks ühel viisil sõeluma, kinnitama, töötlema ja tegutsema...

…aga teil õnnestub hiljem petta programm andmeid tõlgendama teistsugusel, volitamata, kinnitamata ja potentsiaalselt ohtlikul viisil.

Selgitatud tüübisegaduse ohud

Kujutage ette, et kirjutate programmi C-keeles. (Pole oluline, kas teate C-d või mitte, saate niikuinii järgida.)

C-s deklareerite muutujad tavaliselt individuaalselt, seega mitte ainult ei reserveerite mälu, kus neid saab salvestada, vaid saate ka programmile märku, kuidas neid muutujaid tuleks kasutada.

Näiteks:

 pikk pikk int JulianDayNumber; signed char* Kliendinimi;

Esimene muutuja deklaratsioon jätab 64 bitti tavalise vana täisarvu salvestamiseks, mis tähistab astromonoomilist päeva numbrit. (Kui huvitab, siis täna pärastlõunal on JDN 23157 – Juliuse päevad algavad keskpäeval, mitte südaööl, sest astronoomid töötavad sageli öösel ja kesköö on nende tööpäeva keskpaik.)

Teine jätab 64 bitti mäluaadressi salvestamiseks, kust leiab kliendi nime tekstistringi.

Nagu võite ette kujutada, ärge segage neid kahte väärtust, sest arvu, mis on mõistlik ja ohutu kasutada päevanumbrina, näiteks 23157, oleks peaaegu kindlasti ebaturvaline mäluaadressina.

Nagu näete töötava Windowsi programmi mäluväljavõttest, algab väikseim kasutamiseks eraldatud mäluaadress 0x00370000, mis on 3,604,480 XNUMX XNUMX kümnendkohana, mis on palju suurem kui ükski mõistlik päevaarv.

Tegelikud Windowsi kasutatavad mäluaadressid varieeruvad aja jooksul juhuslikult, et teie mälu paigutus oleks kelmidel raskem ära arvata, nii et kui peaksite käivitama sama programmi, saaksite väärtused, kuid need on siiski sarnased:

Ja (kuigi see on ülaltoodud pildi allosas) käitusaja kasutajaandmete jaotise mäluaadressid, kui see programm käitati 0x01130000 et 0x01134FFF, mis esindab ebatõenäolist kuupäevavahemikku 22. juulist 44631 kuni 16. augustini 44687.

Tõepoolest, kui proovite neid kahte muutujat segada, peaks kompilaator proovima teid hoiatada, näiteks järgmiselt:

 JulianDayNumber = KliendiNimi; Kliendinimi = Juliapäevaarv; hoiatus: määramine muudab kursorist täisarvu ilma ülekandmise hoiatuseta: määramine muudab kursori täisarvust ilma ülekandeta

Nüüd, kui olete kunagi C-s programmeerinud, teate, et mugavuse huvides saate deklareerida muutujaid mitme erineva tõlgendusega, kasutades union märksõna, näiteks selline:

 liit { pikk pikk int JulianDayNumer; signed char* Kliendinimi; } andmed;

Nüüd saate viidata täpselt samale muutujale mälus kahel erineval viisil.

Kui kirjutad data.JulianDayNumber, tõlgendate salvestatud andmeid võluväel täisarvuna, kuid kirjutate data.CustomerName teatab kompilaatorile, et viitate mäluaadressile, kuigi pääsete juurde samadele salvestatud andmetele.

See, mida te teete, on enam-vähem kompilaatorile tunnistamine, et mõnikord käsitlete saadud andmeid kuupäevana ja mõnikord mäluaadressina ja et võtate vastutuse meeles pidada, milline tõlgendus mis hetkel kehtib koodis.

Võite valida teise muutuja, mida nimetatakse a tag (tavaliselt täisarv), et minna koos teiega union et jälgida, milliste andmetega te praegu töötate, näiteks:

 struct { int silt; liit { pikk pikk int JulianDayNumer; signed char* Kliendinimi; } andmed; } väärtus;

Võite otsustada, millal value.tag on seatud väärtusele 0, andmed pole veel kasutamiseks lähtestatud, 1 tähendab, et salvestate kuupäeva, 2 tähendab, et see on mäluaadress ja kõik muu tähistab viga.

Parem ära lase kellelgi teisel sellega jamada value.tag või teie programm võib dramaatiliselt valesti käituda.

Murettekitavam näide võib olla midagi sellist:

 struct { int silt; // 1 = räsi, 2 = funktsiooni osutite liit { unsigned char hash[16]; // salvestab kas juhusliku räsistruktuuri { void* openfunc; // või kaks hoolikalt kinnitatud void* closefunc; // koodiosutajad hiljem käivitamiseks } valideerida; } } väärtus;

Nüüd koormame sama mäluplokki üle, et saaksime seda mõnikord kasutada 16-baidise räsi salvestamiseks ja mõnikord kahe 8-baidise viida salvestamiseks funktsioonidele, mida meie programm hiljem kutsub.

Selge, millal value.tag == 1, laseksime oma tarkvaral hea meelega liidu jaoks eraldatud mällu salvestada mis tahes 16-baidise stringi, sest räsid on pseudojuhuslikud, nii et iga baitide kogum on võrdselt tõenäoline.

Aga kui value.tag == 2, peaks meie kood olema eriti ettevaatlik, et mitte lubada kasutajal esitada kinnitamata, ebausaldusväärseid ja tundmatuid funktsiooniaadresse, mida hiljem käivitada.

Kujutage nüüd ette, et saate sellele koodile väärtuse esitada, kui märgendiks oli seatud 1, nii et seda ei kontrollitud ega kinnitatud...

…aga hiljem, vahetult enne seda, kui programm tegelikult salvestatud väärtust kasutas, suutsite koodi petta ja lülitada sildi 2-le.

Seejärel aktsepteeriks kood teie kinnitamata funktsioonide aadresse kui "teadaolevaid ja juba kontrollitud ohutuid" (kuigi need ei olnud) ja saadaks programmi täitmise usaldusväärselt mällu võltsitud asukohta, mille olete eelnevalt varjatult valinud.

Ja see juhtub tüübisegaduse vea korral, kuigi kasutades väljamõeldud ja lihtsustatud näidet,

Mälu, mida oleks ühel viisil käsitsemise korral ohutu tarbida, edastatakse programmi pahatahtlikult, et seda töödelda alternatiivsel, ebaturvalisel viisil.

Mida teha?

Veenduge, et teil oleks Chrome'i või Chromiumi uusim versioon.

Tahad Chrome'i 114.0.5735.106 või hiljem Macis ja Linuxis ning 114.0.5735.110 või hiljem Windowsis.

See viga mõjutab ka Chromiumil põhinevat Microsoft Edge'i.

Microsoft on siiani [2023-06-06T16:25:00Z] märkis seda

Microsoft on teadlik hiljutistest looduses esinevatest ärakasutamistest. Tegeleme aktiivselt turvapaiga väljalaskmisega.

Edge on praegu versioonis 114.0.1823.37, seega kõik nummerdatud sellest hiljem peaks sisaldama Microsofti CVE-2023-3079 plaastreid.

Oma versiooni kontrollimiseks ja värskenduse sundimiseks, kui te pole seda veel saanud, toimige järgmiselt.

  • Google Chrome. Kolme punktiga menüü (⋮) > aitama > Chrome'i kohta.
  • Microsoft Edge. Seadistused ja muud (…) > Abi ja tagasiside > Microsoft Edge'i kohta.

Sa oled teretulnud.


Ajatempel:

Veel alates Alasti turvalisus