Deux nouvelles vulnérabilités ont été identifiées dans le sous-système eBPF, permettant d'exécuter des gestionnaires à l'intérieur du noyau Linux dans une machine virtuelle spéciale avec JIT. Les deux vulnérabilités permettent d'exécuter son propre code avec des droits de noyau, en dehors de la machine virtuelle isolée eBPF. Les informations sur ces problèmes ont été publiées par l'équipe Zero Day Initiative, qui organise les compétitions Pwn2Own, où cette année, trois attaques sur Ubuntu Linux ont été démontrées en utilisant des vulnérabilités auparavant inconnues (il n'est pas précisé si les vulnérabilités dans eBPF sont liées à ces attaques).
- CVE-2021-3490 — la vulnérabilité est causée par l'absence de vérification des dépassements de limites des valeurs 32 bits lors de l'exécution des opérations bit à bit AND, OR et XOR dans eBPF ALU32. Un attaquant peut exploiter cette erreur pour lire et écrire des données en dehors des limites du tampon alloué. Le problème avec l'opération XOR apparaît à partir de la version de noyau 5.7-rc1, tandis que AND et OR apparaissent à partir de la version 5.10-rc1.
- CVE-2021-3489 — la vulnérabilité est causée par une erreur dans l'implémentation du tampon circulaire et est liée au fait que la fonction bpf_ringbuf_reserve ne vérifiait pas si la taille de la zone mémoire allouée pouvait être inférieure à la taille réelle du tampon circulaire ringbuf. Le problème apparaît à partir de la version 5.8-rc1.
Le statut des corrections des vulnérabilités dans les distributions peut être suivi sur ces pages : Ubuntu, Debian, RHEL, Fedora, SUSE, Arch). Les corrections sont également disponibles sous forme de correctifs (CVE-2021-3489, CVE-2021-3490). La possibilité d'exploiter le problème dépend de la disponibilité pour l'utilisateur de l'appel système eBPF. Par exemple, dans la configuration par défaut de RHEL, l'exploitation de la vulnérabilité nécessite que l'utilisateur ait des droits CAP_SYS_ADMIN.
Il convient également de noter une autre vulnérabilité dans le noyau Linux — CVE-2021-32606, permettant à un utilisateur local d'élever ses privilèges au niveau root. Le problème apparaît à partir du noyau Linux 5.11 et est causé par une condition de concurrence dans l'implémentation du protocole CAN ISOTP, ce qui permet de modifier les paramètres de liaison au socket en raison de l'absence de verrouillage approprié dans la fonction isotp_setsockopt() lors du traitement du drapeau CAN_ISOTP_SF_BROADCAST.
Après la fermeture du socket ISOTP, le lien avec le socket destinataire reste actif, ce qui peut permettre l'utilisation continue des structures associées au socket après la libération de la mémoire qui leur est associée (use-after-free en raison d'un appel à isotp_rcv() sur une structure isotp_sock déjà libérée). Par des manipulations de données, il est possible de redéfinir le pointeur vers la fonction sk_error_report() et d'exécuter son propre code au niveau du noyau.
Source : opennet.ru
