CVE-2026-63825 in Linux
Riassunto
di VulDB • 19/07/2026
Nel kernel Linux è stata risolta la seguente vulnerabilità:
gcov: utilizzare aggiornamenti atomici dei contatori per risolvere i crash dovuti ad accesso concorrente
L'instrumentazione GCOV di GCC può fondere i contatori globali dei branch con le variabili di induzione del ciclo come ottimizzazione. In inflate_fast(), i loop interni di copia vengono trasformati in modo che il valore del contatore GCOV venga caricato più volte per calcolare l'indirizzo base, l'indice iniziale e il limite finale del ciclo. Poiché i contatori GCOV sono globali (non per-CPU), l'esecuzione concorrente su CPU diverse provoca la modifica del contatore tra un caricamento e l'altro, generando valori incoerenti e scritture fuori dai limiti della memoria (out-of-bounds).
Il crash si manifesta durante il processing di IPComp (IP Payload Compression) quando inflate_fast() viene eseguito contemporaneamente su più CPU:
BUG: unable to handle page fault for address: ffffd0a3c0902ffa RIP: inflate_fast+1431 Call Trace: zlib_inflate __deflate_decompress crypto_comp_decompress ipcomp_decompress [xfrm_ipcomp]
ipcomp_input [xfrm_ipcomp]
xfrm_input
Al punto del crash, il compilatore ha generato tre caricamenti dallo stesso contatore GCOV globale (__gcov0.inflate_fast+216) per calcolare base, start ed end di un ciclo indicizzato. Un'altra CPU ha modificato il contatore tra i caricamenti, rendendo i valori incoerenti: la scrittura è avvenuta a 3,4 MB oltre un buffer da 65 KB.
Aggiungere -fprofile-update=prefer-atomic alle CFLAGS_GCOV a livello globale nel Makefile di primo livello (top-level), protetto da un test di compilazione try-run. Il test compila un programma minimo con e senza l'opzione -fprofile-update=prefer-atomic utilizzando le KBUILD_CFLAGS complete, quindi confronta i simboli non definiti nei file oggetto risultanti. Se prefer-atomic introduce nuove referenze undefined (come __atomic_fetch_add_8 su i386 o __aarch64_ldadd8_relax su arm64 con outline-atomics), il flag non viene aggiunto: il kernel non effettua il linking contro libatomic.
Sulle architetture in cui GCC inline gli aggiornamenti atomici a 64 bit dei contatori (x86_64, s390, ...), il test supera e il flag è abilitato, impedendo al compilatore di fondere i contatori con le variabili di induzione del ciclo e risolvendo il crash da accesso concorrente osservato.
Sulle architetture in cui il flag introdurrebbe dipendenze verso libatomic, esso viene omesso silenziosamente e il comportamento non è peggiore rispetto a prima della patch.
Spostare il blocco CFLAGS_GCOV dalla sua posizione originale (prima dell'inclusione del Makefile per architettura) dopo gli assegnamenti delle KBUILD_CFLAGS core ma prima dell'inclusione di scripts/Makefile.gcc-plugins. Questa collocazione garantisce che il test try-run veda i flag specifici dell'architettura (-m32, -march=, -mno-outline-atomics) evitando al contempo i flag dei plugin GCC (-fplugin=) che interromperebbero il test su build pulite quando gli oggetti condivisi del plugin non esistono ancora.
If you want to get best quality of vulnerability data, you may have to visit VulDB.