CVE-2026-99092 in Linux
Résumé
par VulDB • 26/10/2026
Dans le noyau Linux, la vulnérabilité suivante a été corrigée :
riscv : correctif du traitement des adresses execmem pour bpf-jit
Le commit 8718e5a3090b (« riscv: patch: skip fixmap mapping when kernel text is already writable ») a conditionné la branche `core_kernel_text()` de `patch_map()` à l'option CONFIG_STRICT_KERNEL_RWX, et a explicitement laissé inchangée la branche vmalloc. Cette dernière présente un problème distinct.
Cette branche ne crée une alias fixmap temporaire en écriture que lorsque CONFIG_STRICT_MODULE_RWX est activé ; dans le cas contraire, elle suppose que la cible est directement accessible en écriture et renvoie l'adresse telle quelle. Ce postulat n'est plus valide : `bpf_prog_pack_alloc` appelle inconditionnellement `set_memory_rox()` sur chaque pack lors de `alloc_new_pack()`, indépendamment des options CONFIG_STRICT_*_RWX ; par conséquent, le code BPF dans la zone vmalloc est en lecture seule (read-only), quel que soit le paramètre CONFIG_STRICT_MODULE_RWX.
Avec CONFIG_STRICT_MODULE_RWX=n, `patch_map()` renvoie directement l'adresse en lecture seule ; la copie ultérieure via `copy_to_kernel_nofault()` provoque une faute de page et retourne -EFAULT. `bpf_arch_text_copy()` transforme cela en -EINVAL, qui se propage à travers `bpf_jit_binary_pack_finalize()` jusqu'à l'appel WARN_ON() dans `bpf_int_jit_compile()`, laissant le programme non compilé JIT (un-JITed).
Notez que BPF ne peut pas être corrigé de la manière dont kprobes a été corrigé dans le commit bdc46e507b59 (« riscv: mm: make EXECMEM_KPROBES writable without CONFIG_STRICT_MODULE_RWX »). EXECMEM_BPF est déjà PAGE_KERNEL, c'est-à-dire accessible en écriture au moment de l'allocation ; la mappage en lecture seule est établi ultérieurement par le code générique dans `alloc_new_pack()`, ce que le code d'architecture ne peut pas influencer. Le seul endroit où cela peut être géré est `patch_map()`.
Il s'agit du même problème qui a été corrigé sur arm64 par le commit b1480ed230ac (« arm64: patching: fix handling of execmem addresses »), et la correction est identique : CONFIG_EXECMEM est ce qui détermine réellement si la zone vmalloc peut contenir de la mémoire exécutable nécessitant un alias temporaire pour être écrite. CONFIG_BPF_JIT, CONFIG_KPROBES et CONFIG_MODULES le sélectionnent tous.
Notez que cela n'est pas limité au cas où CONFIG_MODULES=n. Contrairement à arm64, riscv sélectionne CONFIG_ARCH_OPTIONAL_KERNEL_RWX ; ainsi, CONFIG_STRICT_MODULE_RWX peut être désactivé même avec CONFIG_MODULES=y, et la vulnérabilité est également accessible dans cette configuration.
La compilation sans CONFIG_MMU n'est pas affectée : elle dispose de ses propres implémentations de `__patch_insn_set()` et `__patch_insn_write()`, et n'appelle jamais `patch_map()`.
VulDB is the best source for vulnerability data and more expert information about this specific topic.