Chrome zero-day: "Questo exploit è allo stato brado", quindi controlla subito la tua versione

Chrome zero-day: "Questo exploit è allo stato brado", quindi controlla subito la tua versione

Nodo di origine: 2704382

L'ultimo aggiornamento di Chrome di Google è uscito e questa volta l'azienda non ha mezzi termini le sue parole su una delle due patch di sicurezza che include:

Google è consapevole che un exploit per CVE-2023-3079 esiste in natura.

Non esiste una verbosità di due gradi di separazione, come abbiamo spesso visto da Google prima, per dire che l'azienda "è a conoscenza delle segnalazioni" di un exploit.

Questa volta è "siamo consapevoli di tutto da soli", che si traduce ancora più schiettamente in "sappiamo che i truffatori ne stanno abusando mentre parliamo", dato che la segnalazione del bug è arrivata direttamente dal Threat Research Group di Google.

Come al solito, ciò implica che Google stava indagando su un attacco attivo (sia contro Google stesso, sia contro qualche organizzazione esterna, non lo sappiamo) in cui Chrome era stato colpito da una falla di sicurezza precedentemente sconosciuta.

Il bug è descritto semplicemente come: Digitare Confusione in V8. (Comprensibilmente, Google non sta dicendo altro in questa fase.)

Come abbiamo spiegato prima, a tipo confusione il bug si verifica quando fornisci a un programma un blocco di dati che dovrebbe analizzare, convalidare, elaborare e agire in un modo ...

…ma in seguito riesci a indurre il programma a interpretare i dati in un modo diverso, non autorizzato, non convalidato e potenzialmente pericoloso.

Spiegazione dei pericoli della confusione di tipo

Immagina di scrivere un programma in C. (Non importa se conosci o meno C, puoi comunque seguirlo.)

In C, di solito dichiari le variabili individualmente, quindi non solo riservando memoria dove possono essere archiviate, ma segnalando anche al programma come dovrebbero essere utilizzate quelle variabili.

Per esempio:

 long long int JulianDayNumber; carattere firmato* NomeCliente;

La prima dichiarazione di variabile riserva 64 bit per la memorizzazione di un semplice vecchio valore intero che rappresenta il numero del giorno astronomico. (Nel caso ve lo stiate chiedendo, questo pomeriggio è JDN 23157 – I giorni giuliani iniziano a mezzogiorno, non a mezzanotte, perché gli astronomi spesso lavorano di notte, con la mezzanotte che è la metà della loro giornata lavorativa.)

Il secondo riserva 64 bit per la memorizzazione di un indirizzo di memoria in cui è possibile trovare la stringa di testo del nome di un cliente.

Come puoi immaginare, è meglio non confondere questi due valori, perché un numero che ha senso ed è sicuro da usare come numero del giorno, come 23157, sarebbe quasi certamente pericoloso da usare come indirizzo di memoria.

Come puoi vedere da questo dump della memoria di un programma Windows in esecuzione, l'indirizzo di memoria più basso allocato per l'uso inizia da 0x00370000, che è 3,604,480 in decimale, molto più grande di qualsiasi numero ragionevole di giorni.

Gli indirizzi di memoria effettivi utilizzati da Windows variano in modo casuale nel tempo, per rendere il layout della memoria più difficile da indovinare per i truffatori, quindi se dovessi eseguire lo stesso programma, otterresti valori, ma saranno comunque simili:

E (sebbene sia nella parte inferiore dell'immagine sopra) gli indirizzi di memoria della sezione dei dati utente di runtime quando questo programma è stato eseguito da 0x01130000 a 0x01134FFF, che rappresenta l'intervallo di date improbabile dal 22 luglio 44631 al 16 agosto 44687.

In effetti, se provi a mescolare queste due variabili, il compilatore dovrebbe provare ad avvisarti, ad esempio in questo modo:

 JulianDayNumber = NomeCliente; CustomerName = JulianDayNumber; avviso: l'assegnazione rende il puntatore intero senza cast avviso: l'assegnazione rende il puntatore intero senza cast

Ora, se hai mai programmato in C, saprai che per comodità puoi dichiarare variabili con più interpretazioni diverse usando il union parola chiave, in questo modo:

 union { long long int JulianDayNumer; carattere firmato* NomeCliente; } dati;

Ora puoi fare riferimento esattamente alla stessa variabile in memoria in due modi diversi.

Se scrivi data.JulianDayNumber, interpreti magicamente i dati memorizzati come un numero intero, ma scrivendo data.CustomerName dice al compilatore che stai facendo riferimento a un indirizzo di memoria, anche se stai accedendo agli stessi dati memorizzati.

Quello che stai facendo, più o meno, è ammettere al compilatore che a volte tratterai i dati che hai come una data, e altre volte come un indirizzo di memoria, e che ti stai assumendo la responsabilità di ricordare quale interpretazione si applica in quale momento nel codice.

Potresti decidere di avere una seconda variabile, nota come a tag (tipicamente un numero intero) da abbinare al tuo union per tenere traccia del tipo di dati con cui stai lavorando in questo momento, ad esempio:

 struct { int tag; union { long long int JulianDayNumer; carattere firmato* NomeCliente; } dati; } valore;

Potresti decidere quando value.tag è impostato su 0, i dati non sono ancora stati inizializzati per l'uso, 1 significa che stai memorizzando una data, 2 significa che è un indirizzo di memoria e qualsiasi altra cosa denota un errore.

Beh, faresti meglio a non lasciare che qualcun altro interferisca con questo value.tag impostazione, o il tuo programma potrebbe comportarsi in modo anomalo in modo drammatico.

Un esempio più preoccupante potrebbe essere qualcosa del genere:

 struct { int tag; // 1 = hash, 2 = puntatori a funzione union { unsigned char hash[16]; // memorizza un hash casuale struct { void* openfunc; // o due void* closefunc accuratamente convalidati; // puntatori di codice da eseguire successivamente } validate; } } valore;

Ora stiamo sovraccaricando lo stesso blocco di memoria, quindi a volte possiamo usarlo per memorizzare un hash da 16 byte e talvolta per memorizzare due puntatori da 8 byte a funzioni che il nostro programma chiamerà in seguito.

Chiaramente, quando value.tag == 1, saremmo felici di consentire al nostro software di archiviare qualsiasi stringa di 16 byte nella memoria allocata per l'unione, poiché gli hash sono pseudocasuali, quindi qualsiasi raccolta di byte è ugualmente probabile.

Ma quando value.tag == 2, il nostro codice dovrebbe essere estremamente attento a non consentire all'utente di fornire indirizzi di funzione non convalidati, non attendibili e sconosciuti da eseguire in un secondo momento.

Ora immagina di poter inviare un valore a questo codice mentre il tag era impostato su 1, quindi non è stato controllato e convalidato...

…ma in seguito, appena prima che il programma utilizzasse effettivamente il valore memorizzato, sei stato in grado di ingannare il codice per far passare il tag a 2.

Il codice quindi accetterebbe i tuoi indirizzi di funzione non convalidati come "sicuri noti e già verificati" (anche se non lo erano) e invierebbe con fiducia l'esecuzione del programma in una posizione non autorizzata nella memoria che avevi scelto in anticipo di nascosto.

Ed è quello che succede in un bug di confusione di tipo, anche se usando un esempio artificioso e semplificato,

La memoria che sarebbe sicura da consumare se fosse gestita in un modo viene consegnata in modo dannoso al programma per l'elaborazione in un modo alternativo e non sicuro.

Cosa fare?

Assicurati di avere l'ultima versione di Chrome o Chromium.

Vuoi Chrome 114.0.5735.106 o più tardi su Mac e Linux, e 114.0.5735.110 o successivo su Windows.

Anche Microsoft Edge, basato su Chromium, è interessato da questo bug.

Microsoft ha finora [2023-06-06T16:25:00Z] osservato che

Microsoft è a conoscenza dei recenti exploit esistenti in natura. Stiamo lavorando attivamente al rilascio di una patch di sicurezza.

Edge è attualmente alla versione 114.0.1823.37, quindi qualsiasi cosa numerata più tardi dovrebbe includere le patch CVE-2023-3079 di Microsoft.

Per controllare la tua versione e forzare un aggiornamento se ce n'è uno che non hai ancora ricevuto:

  • Google Chrome. Menù a tre punti (⋮) > Aiuto > Informazioni su Chrome.
  • Microsoft Edge. Impostazioni e altro (…) > Aiuto e feedback > Informazioni su Microsoft Edge.

Prego.


Timestamp:

Di più da Sicurezza nuda