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-99016

HIGH · 7.8 CVSS Gepubliceerd:

Beschrijving NL

In de Linux kernel is de volgende kwetsbaarheid verholpen:

riscv: futex: verwijder de tag van de gebruikersaanwijzer voordat de atomaire toegang

access_ok() controleert untagged_addr(uaddr), maar arch_futex_atomic_op_inuser()
en futex_atomic_cmpxchg_inatomic() overhandig de ruwe uaddr aan de inline asm
amoswap/amoadd/.../lr.w+sc.w via de operand "+m" (* uaddr). Wanneer de
Getagde adres-ABI is ingeschakeld (CONFIG_RISCV_ISA_SUPM, prctl)
PR_SET_TAGGED_ADDR_CTRL met PMLEN != 0), die twee adressen verschillen: a
De gebruikersaanwijzer waarvan de bovenste PMLEN-bits een tag bevatten, slaagt voor access_ok() na
ontlabelen, maar de atomaire bewerking wordt vervolgens uitgevoerd op de nog steeds gelabelde ruwe data.
adres. Toegang tot gegevens in supervisormodus is niet onderworpen aan de U-moduspointer.
maskering (die wordt geregeld door menvcfg.PMM, wat de kernel niet instelt),
De hardware verwijdert de tag dus niet voor de eigen toegang van de kernel.
Bij Sv57 en PMLEN=16 overlappen de tagbits de canonieke-adresbits, dus een
Een getagde pointer kan een canoniek virtueel kerneladres benoemen (bijvoorbeeld in de
lineaire kaart) waarvan de ongelabelde vorm een ​​geldig gebruikersadres is. Een kansarme
Het proces kan er dus voor zorgen dat FUTEX_WAKE_OP een atomaire lees-wijzig-schrijfbewerking uitvoert op
een willekeurig kerneladres, met het bijbehorende FUTEX_OP_CMP_* resultaat
dient als leesorakel. get_user()/put_user()/raw_copy_{to,from}_user() hebben de pointer al onttagd.
Na de access_ok() controle, doe hetzelfde in de futex helpers, zodat de
Atomic werkt op het adres dat daadwerkelijk is gevalideerd.

Origineel (Engels) tonen

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

riscv: futex: untag the user pointer before the atomic access

access_ok() checks untagged_addr(uaddr), but arch_futex_atomic_op_inuser()
and futex_atomic_cmpxchg_inatomic() hand the raw uaddr to the inline asm
amoswap/amoadd/.../lr.w+sc.w through the "+m" (*uaddr) operand. When the
tagged address ABI is enabled (CONFIG_RISCV_ISA_SUPM, prctl
PR_SET_TAGGED_ADDR_CTRL with PMLEN != 0), those two addresses differ: a
user pointer whose top PMLEN bits hold a tag passes access_ok() after
untagging, but the atomic is then performed on the still-tagged raw
address.

Supervisor-mode data accesses are not subject to the U-mode pointer
masking (that is governed by menvcfg.PMM, which the kernel does not set),
so hardware does not strip the tag for the kernel's own access. With
Sv57 and PMLEN=16 the tag bits overlap the canonical-address bits, so a
tagged pointer can name a canonical kernel virtual address (e.g. in the
linear map) whose untagged form is a valid user address. An unprivileged
process can thus make FUTEX_WAKE_OP perform an atomic read-modify-write on
an arbitrary kernel address, with the matching FUTEX_OP_CMP_* result
serving as a read oracle.

get_user()/put_user()/raw_copy_{to,from}_user() already untag the pointer
after the access_ok() check; do the same in the futex helpers so the
atomic operates on the address that was actually validated.

References