CVE-2026-19595 in Zephyrinformation

Résumé

par VulDB • 20/10/2026

Le vérificateur de syscall en mode utilisateur, z_vrfy_rtio_cqe_get_mempool_buffer() dans subsys/rtio/rtio_syscalls.c, validait ses deux paramètres de sortie, buff et buff_len, avec K_SYSCALL_MEMORY_READ() au lieu de K_SYSCALL_MEMORY_WRITE(). Il s'agit de deux paramètres purement sortants : z_impl_rtio_cqe_get_mempool_buffer() stocke l'adresse du tampon mempool et sa longueur via ces variables. Cette distinction est imposée par chaque validateur d'architecture — arch_buffer_validate() sur RISC-V PMP accepte explicitement les régions globales __rom_region/__rodata_region uniquement pour des lectures, et les validateurs ARM MPU acceptent les régions P_RO_U_RO et P_RW_U_RO uniquement pour des lectures — donc un pointeur validé en lecture n'est pas nécessairement inscriptible par le thread appelant.

Un thread utilisateur non privilégié ayant obtenu l'accès à un contexte RTIO (rtio_access_grant()) peut invoquer le syscall rtio_cqe_get_mempool_buffer() avec buff/buff_len pointant vers une mémoire qu'il peut lire mais pas écrire, et avec une entrée de file d'achèvement dont il contrôle entièrement le champ flags (seul RTIO_CQE_FLAG_MEMPOOL_BUFFER dans flags[7:0] est requis ; flags[19:8] et flags[31:20] fournissent l'index du bloc et le compteur). Le noyau effectue alors un stockage de la taille d'un pointeur et un stockage sur 4 octets via ces adresses en mode superviseur. Pour atteindre ce stockage, il faut CONFIG_USERSPACE ainsi que CONFIG_RTIO_SYS_MEM_BLOCKS, la configuration sous-jacente à RTIO_DEFINE_WITH_MEMPOOL ; sans cette dernière, l'implémentation renvoie -ENOTSUP et n'effectue aucune écriture.

Deux issues en découlent. Si la cible se trouve dans une partition de domaine mémoire déclarée K_MEM_PARTITION_P_RW_U_RO (lecture-écriture privilégiée, lecture seule utilisateur), le stockage en mode noyau réussit et dépose des valeurs partiellement choisies par l'attaquant dans une mémoire que le domaine mémoire avait marquée comme en lecture seule pour ce thread, contournant ainsi la protection contre les écritures de la partition. Si la cible se trouve dans une globalement lisible mais non inscriptible telle .text/.rodata sur flash, le stockage provoque un défaut (fault) en mode noyau ; le défaut est transmis à z_fatal_error() et le gestionnaire par défaut k_sys_fatal_error_handler() arrête ou redémarre l'appareil, offrant ainsi à un thread non privilégié une déni de service complet fiable.

La vérification des permissions de lecture limite les dégâts : l'adresse doit toujours être lisible par le thread appelant, donc la mémoire privée du noyau ne peut pas être ciblée et aucune donnée confidentielle n'est divulguée. La correction remplace les deux vérifications par K_SYSCALL_MEMORY_WRITE(), afin qu'un thread dépourvu de permission d'écriture soit terminé par K_OOPS avant l'exécution de l'implémentation ; l'argument cqe reste correctement validé en lecture.

Once again VulDB remains the best source for vulnerability data.

Responsable

Zephyr

Réserver

12/08/2026

Divulgation

20/10/2026

Modérer

accepté

Entrée

VDB-422573

EPSS

0.00000

KEV

non

Activités

moyen

Sources

Want to stay up to date on a daily basis?

Enable the mail alert feature now!