Xlera8

Chrome zero-day: "Deze exploit is in het wild", dus controleer nu uw versie

De nieuwste Chrome-update van Google is uit, en dit keer van het bedrijf heeft geen blad voor de mond genomen over een van de twee beveiligingspatches die het bevat:

Google is zich ervan bewust dat het een exploit is voor CVE-2023-3079 bestaat in het wild.

Er is geen woordgebruik van twee graden van scheiding, zoals we al vaak van Google hebben gezien, om te zeggen dat het bedrijf "op de hoogte is van rapporten" van een exploit.

Deze keer is het "we weten het allemaal zelf", wat zich nog botter vertaalt in "we weten dat boeven dit op dit moment misbruiken", aangezien het bugrapport rechtstreeks afkomstig was van Google's eigen Threat Research Group.

Zoals gewoonlijk impliceert dit dat Google een actieve aanval aan het onderzoeken was (of het nu tegen Google zelf was of tegen een externe organisatie, we weten het niet) waarbij Chrome was gehackt door een voorheen onbekend beveiligingslek.

De bug wordt eenvoudig beschreven als: Typ Verwarring in V8. (Begrijpelijkerwijs zegt Google in dit stadium niet meer dan dat.)

Zoals we eerder hebben uitgelegd, a type verwarring bug doet zich voor wanneer je een programma voorziet van een stuk data dat het op een bepaalde manier zou moeten ontleden, valideren, verwerken en verwerken...

... maar je slaagt er later in om het programma te misleiden om de gegevens op een andere, niet-geautoriseerde, niet-gevalideerde en potentieel gevaarlijke manier te interpreteren.

Typ verwarringsgevaren uitgelegd

Stel je voor dat je een programma in C aan het schrijven bent. (Het maakt niet uit of je C kent of niet, je kunt het toch gewoon volgen.)

In C declareer je variabelen meestal afzonderlijk, waardoor je niet alleen geheugen reserveert waar ze kunnen worden opgeslagen, maar ook aan het programma doorgeeft hoe die variabelen zouden moeten worden gebruikt.

Bijvoorbeeld:

 lang lang int JulianDayNumber; ondertekend teken* Naam klant;

De eerste variabele declaratie reserveert 64 bits voor het opslaan van een gewone oude integerwaarde die het astromonomische dagnummer vertegenwoordigt. (Voor het geval je het je afvraagt, het is vanmiddag JDN 23157 – Juliaanse dagen beginnen om XNUMX uur, niet om middernacht, omdat astronomen vaak 's nachts werken, waarbij middernacht het midden van hun werkdag is.)

De tweede reserveert 64 bits voor het opslaan van een geheugenadres waar de tekststring van de naam van een klant kan worden gevonden.

Zoals u zich kunt voorstellen, kunt u deze twee waarden beter niet door elkaar halen, omdat een getal dat logisch en veilig is om als dagnummer te gebruiken, zoals 23157, vrijwel zeker onveilig zou zijn om als geheugenadres te gebruiken.

Zoals u kunt zien aan de hand van deze geheugendump van een actief Windows-programma, begint het laagste geheugenadres dat is toegewezen voor gebruik bij 0x00370000, wat 3,604,480 in decimaal is, veel groter dan enig verstandig dagnummer.

De werkelijke geheugenadressen die door Windows worden gebruikt, variëren willekeurig in de loop van de tijd, om uw geheugenlay-out moeilijker te raden te maken voor oplichters, dus als u hetzelfde programma zou uitvoeren, krijgt u waarden, maar ze zullen niettemin vergelijkbaar zijn:

En (hoewel het onderaan de afbeelding hierboven staat) de geheugenadressen van de runtime gebruikersgegevenssectie toen dit programma liep vanaf 0x01130000 naar 0x01134FFF, wat het onwaarschijnlijke datumbereik vertegenwoordigt van 22 juli 44631 tot 16 augustus 44687.

Inderdaad, als je die twee variabelen door elkaar probeert te halen, zou de compiler je moeten waarschuwen, bijvoorbeeld als volgt:

 JulianDayNumber = Klantnaam; KlantNaam = JulianDagNummer; waarschuwing: toewijzing maakt van pointer een geheel getal zonder cast waarschuwing: toewijzing maakt pointer van integer zonder cast

Nu, als je ooit in C hebt geprogrammeerd, weet je dat je voor het gemak variabelen kunt declareren met meerdere verschillende interpretaties met behulp van de union trefwoord, zoals dit:

 union { lang lang int JulianDayNumer; ondertekend teken* KlantNaam; } gegevens;

U kunt nu op twee verschillende manieren naar exact dezelfde variabele in het geheugen verwijzen.

Als je schrijft data.JulianDayNumber, interpreteer je op magische wijze de opgeslagen gegevens als een geheel getal, maar schrijven data.CustomerName vertelt de compiler dat je naar een geheugenadres verwijst, ook al heb je toegang tot dezelfde opgeslagen gegevens.

Wat je min of meer doet, is aan de compiler toegeven dat je de gegevens die je hebt soms als een datum zult behandelen, en op andere momenten als een geheugenadres, en dat je neemt de verantwoordelijkheid om te onthouden welke interpretatie op welk moment van toepassing is in de code.

Je zou kunnen besluiten om een ​​tweede variabele te hebben, bekend als a tag (meestal een geheel getal) om mee te gaan met uw union om bij te houden met wat voor soort gegevens u op dit moment werkt, bijvoorbeeld:

 struct { int-tag; union { lang lang int JulianDayNumer; ondertekend teken* KlantNaam; } gegevens; } waarde;

Dat zou je kunnen beslissen wanneer value.tag is ingesteld op 0, de gegevens zijn nog niet geïnitialiseerd voor gebruik, 1 betekent dat je een datum opslaat, 2 betekent dat het een geheugenadres is en al het andere wijst op een fout.

Nou, daar kun je maar beter niemand mee laten rotzooien value.tag instelling, anders zou uw programma zich dramatisch kunnen misdragen.

Een zorgwekkender voorbeeld zou zoiets kunnen zijn:

 struct { int-tag; // 1 = hash, 2 = function pointers union {unsigned char hash[16]; // sla ofwel een willekeurige hashstructuur op {void* openfunc; // of twee zorgvuldig gevalideerde void* closefunc; // codewijzers om later uit te voeren} valideren; } } waarde;

Nu belasten we hetzelfde geheugenblok, zodat we het soms kunnen gebruiken om een ​​16-byte hash op te slaan, en soms om twee 8-byte pointers op te slaan naar functies die ons programma later zal gebruiken.

Duidelijk wanneer value.tag == 1, laten we onze software graag elke string van 16 bytes opslaan in het geheugen dat is toegewezen voor de unie, omdat hashes pseudo-willekeurig zijn, dus elke verzameling bytes is even waarschijnlijk.

Maar wanneer value.tag == 2, zou onze code extra-super voorzichtig moeten zijn om de gebruiker niet toe te staan ​​om niet-gevalideerde, niet-vertrouwde, onbekende functie-adressen op te geven om later uit te voeren.

Stel je nu voor dat je een waarde aan deze code zou kunnen toevoegen terwijl de tag was ingesteld op 1, zodat deze niet werd gecontroleerd en gevalideerd...

... maar later, net voordat het programma de opgeslagen waarde daadwerkelijk gebruikte, was je in staat de code te misleiden om de tag naar 2 te veranderen.

De code zou dan uw niet-gevalideerde functie-adressen accepteren als "bekend en reeds geverifieerd veilig" (ook al waren ze dat niet), en zou de uitvoering van het programma vol vertrouwen naar een frauduleuze locatie in het geheugen sturen die u van tevoren stiekem had gekozen.

En dat is wat er gebeurt in een typeverwarringsbug, zij het met behulp van een gekunsteld en vereenvoudigd voorbeeld,

Geheugen dat veilig zou kunnen worden geconsumeerd als het op één manier zou worden behandeld, wordt kwaadwillig aan het programma geleverd om op een alternatieve, onveilige manier te worden verwerkt.

Wat te doen?

Zorg ervoor dat je de nieuwste versie van Chrome of Chromium hebt.

U wilt Chrome 114.0.5735.106 of later op Mac en Linux, en 114.0.5735.110 of hoger op Windows.

Microsoft Edge, dat is gebaseerd op Chromium, wordt ook getroffen door deze bug.

Microsoft heeft tot nu toe [2023-06-06T16:25:00Z] staat genoteerd

Microsoft is op de hoogte van de recente exploits die in het wild bestaan. We werken actief aan het uitbrengen van een beveiligingspatch.

Edge is momenteel op versie 114.0.1823.37, dus alles genummerd later dan dat zou de CVE-2023-3079-patches van Microsoft moeten bevatten.

Om uw versie te controleren en een update af te dwingen als er een is die u nog niet heeft ontvangen:

  • Google Chrome. Menu met drie stippen (⋮) > Help > Over Chrome.
  • Microsoft Edge. Instellingen en meer (…) > Hulp en feedback > Over Microsoft Edge.

Graag gedaan.


Chat met ons

Hallo daar! Hoe kan ik u helpen?