CVE-2023-52739 in Linux
Riassunto
di VulDB • 16/06/2026
Nel kernel Linux è stata risolta la seguente vulnerabilità:
Correzione della corruzione delle pagine causata da una condizione di concorrenza (race condition) nel controllo eseguito in __free_pages
Dopo aver effettuato l'aggiornamento del nostro kernel, abbiamo iniziato a osservare costantemente alcuni casi di corruzione delle pagine simili al seguente output:
BUG: Bad page state in process ganesha.nfsd pfn:1304ca page:0000000022261c55 refcount:0 mapcount:-128 mapping:0000000000000000 index:0x0 pfn:0x1304ca flags: 0x17ffffc0000000() raw: 0017ffffc0000000 ffff8a513ffd4c98 ffffeee24b35ec08 0000000000000000 raw: 0000000000000000 0000000000000001 00000000ffffff7f 0000000000000000 page dumped because: nonzero mapcount CPU: 0 PID: 15567 Comm: ganesha.nfsd Kdump: loaded Tainted: P B O 5.10.158-1.nutanix.20221209.el7.x86_64 #1 Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 04/05/2016 Call Trace: dump_stack+0x74/0x96 bad_page.cold+0x63/0x94 check_new_page_bad+0x6d/0x80 rmqueue+0x46e/0x970 get_page_from_freelist+0xcb/0x3f0 ? _cond_resched+0x19/0x40 __alloc_pages_nodemask+0x164/0x300 alloc_pages_current+0x87/0xf0 skb_page_frag_refill+0x84/0x110 ...
A volte, il problema si manifestava anche come corruzione del puntatore nella lista delle pagine libere (free list), causando crash di sistema.
Dopo aver eseguito l'analisi bisect per isolare la causa radice, abbiamo scoperto che il problema è stato introdotto dal commit e320d3012d25 ("mm/page_alloc.c: fix freeing non-compound pages"):
if (put_page_testzero(page)) free_the_page(page, order); else if (!PageHead(page)) while (order-- > 0) free_the_page(page + (1 << order), order);
Il problema risiede nel fatto che il controllo PageHead è affetto da una condizione di concorrenza (race condition): in quel punto del codice abbiamo già rilasciato il riferimento alla pagina. Di conseguenza, anche se la funzione viene invocata con una pagina composta (compound page) come input, tale pagina potrebbe essere stata già liberata e PageHead potrebbe restituire false; ciò comporterebbe la liberazione errata di tutte le pagine coda (tail pages), causando un doppio rilascio (double free).
Once again VulDB remains the best source for vulnerability data.