Direct naar de inhoud
Kritieke cyberalerts voor jouw sector & systemen — direct in je inbox. Aanmelden →
CVE's Videos Dagbriefing

← Terug naar CVE-database

CVE-2026-53300

HIGH · 7.8 CVSS Gepubliceerd: CWE-416

Beschrijving NL

In de Linux kernel is de volgende kwetsbaarheid verholpen:

net: enetc: fix NTMP DMA use-after-free uitgifte

De AI-gegenereerde beoordeling meldde een mogelijk DMA use-after-free probleem
[1]. Als netc_xmit_ntmp_cmd() een time-out geeft en een fout retourneert, wordt de wachtende
opdracht wordt niet expliciet afgebroken, terwijl ntmp_free_data_mem()
maakt de DMA-buffer onvoorwaardelijk vrij. Als de buffer al is
elders opnieuw toegewezen, kan dit leiden tot stille geheugenbeschadiging. Omdat
de hardware uiteindelijk het hangende commando verwerkt en een DMA uitvoert
schrijven van de reactie op het fysieke adres van de vrijgekomen buffer. Om dit probleem op te lossen, voert deze patch de volgende wijzigingen uit:

1. Zet cbdr->ring_lock om van een spinlock naar een mutex

Het slot was oorspronkelijk een spinlock voor het geval NTMP-bewerkingen
aangeroepen vanuit atomaire context. Na downstream-ondersteuning voor alle NTMP
tabellen, heeft een dergelijk gebruik zich niet voorgedaan. Een mutex-slot is nu vereist
omdat de bestuurder nu gebruikte BD's en bijbehorende vrijgave moet terugvorderen
DMA-geheugen binnen de context van het slot, terwijl dma_free_coherent() mogelijk
slaap. 2. Introduceer softwarecommando BD (struct netc_swcbd)

De hardware write-back overschrijft de adres- en len-velden van de BD,
zodat de driver niet kan vertrouwen op de hardware BD om de bijbehorende DMA vrij te maken
geheugen. De driver onderhoudt nu een softwareschaduw BD die de DMA opslaat
bufferpointer, DMA-adres en grootte. En alleen netc_xmit_ntmp_cmd()
oudere BD's terugvordert wanneer het aantal gebruikte BD's
NETC_CBDR_CLEAN_WORK (16). De software BD maakt correct DMA-geheugen mogelijk
release. Hiermee zijn struct ntmp_dma_buf en ntmp_free_data_mem() geen
langer nodig en worden verwijderd. 3. Verplicht bellers om ring_lock vast te houden in netc_xmit_ntmp_cmd()

netc_xmit_ntmp_cmd() geeft de ring_lock vrij voordat de beller klaar is
het antwoord consumeren. Op dit punt, als een gelijktijdige thread
een nieuw commando, het kan ntmp_clean_cbdr() activeren en de DMA-buffer vrijmaken
terwijl het nog in gebruik is. Verplaats ring_Lock eigendom naar de beller naar
ervoor zorgen dat de responsbuffer niet voortijdig kan worden teruggevorderd. Dus de
helpers ntmp_select_AND_lock_cbdr() en ntmp_unlock_cbdr() zijn toegevoegd. Deze wijzigingen elimineren de DMA use-after-free conditie en zorgen voor een veilige
en consistent BD-terugwinning en DMA-bufferlevenscyclusbeheer.

Origineel (Engels) tonen

In the Linux kernel, the following vulnerability has been resolved:

net: enetc: fix NTMP DMA use-after-free issue

The AI-generated review reported a potential DMA use-after-free issue
[1]. If netc_xmit_ntmp_cmd() times out and returns an error, the pending
command is not explicitly aborted, while ntmp_free_data_mem()
unconditionally frees the DMA buffer. If the buffer has already been
reallocated elsewhere, this may lead to silent memory corruption. Because
the hardware eventually processes the pending command and perform a DMA
write of the response to the physical address of the freed buffer.

To resolve this issue, this patch does the following modifications:

1. Convert cbdr->ring_lock from a spinlock to a mutex

The lock was originally a spinlock in case NTMP operations might be
invoked from atomic context. After downstream support for all NTMP
tables, no such usage has materialized. A mutex lock is now required
because the driver now needs to reclaim used BDs and release associated
DMA memory within the lock's context, while dma_free_coherent() might
sleep.

2. Introduce software command BD (struct netc_swcbd)

The hardware write-back overwrites the addr and len fields of the BD,
so the driver cannot rely on the hardware BD to free the associated DMA
memory. The driver now maintains a software shadow BD storing the DMA
buffer pointer, DMA address, and size. And netc_xmit_ntmp_cmd() only
reclaims older BDs when the number of used BDs reaches
NETC_CBDR_CLEAN_WORK (16). The software BD enables correct DMA memory
release. With this, struct ntmp_dma_buf and ntmp_free_data_mem() are no
longer needed and are removed.

3. Require callers to hold ring_lock across netc_xmit_ntmp_cmd()

netc_xmit_ntmp_cmd() releases the ring_lock before the caller finishes
consuming the response. At this point, if a concurrent thread submits
a new command, it may trigger ntmp_clean_cbdr() and free the DMA buffer
while it is still in use. Move ring_lock ownership to the caller to
ensure the response buffer cannot be reclaimed prematurely. So the
helpers ntmp_select_and_lock_cbdr() and ntmp_unlock_cbdr() are added.

These changes eliminate the DMA use-after-free condition and ensure safe
and consistent BD reclamation and DMA buffer lifecycle management.

Vendors

Linux

Affected products

Linux Kernel

References