
CVE-2023-6931 PoC de panique du noyau
PoC de panique noyau pour CVE-2023-6931
CVE-2023-6931 est une vulnérabilité dans perf_event qui conduit à un débordement de tampon de tas causé par un dépassement d'entier dans le read_size d'un groupe.
perf_events est un cadre de surveillance et d'analyse des performances fourni par le noyau Linux. Ce cadre permet le suivi de diverses données liées aux performances générées par des composants matériels et logiciels.
perf_event_open
Une interface qui permet à l'espace utilisateur de configurer et contrôler les événements de performance dans le noyau.
Il est utilisé pour créer, regrouper, contrôler ou lire des données d'événements./proc/sys/kernel/perf_event_paranoid doit être 1 ou inférieureulimit -n.CONFIG_PERF_EVENTS doit être activée.La vulnérabilité découle d'un dépassement d'entier dans le read_size d'un groupe. La fonction perf_event_validate_size effectue une validation sur le read_size. Cependant, la manière dont le read_size est validé ne vérifie que le read_size de l'événement actuel.
Le point clé est que lors de chaque validation, seul l'événement actuel est validé, tandis que les événements précédents ne le sont pas. Si PERF_FORMAT_GROUP est défini pour le chef de groupe, l'ajout d'un événement actuel peut augmenter le read_size du chef de groupe.
Cela provoque finalement un problème dans perf_read_group. Le calcul de event->read_size est basé sur le read_format du chef de groupe, multiplié par nr_siblings. Étant donné que la variable read_size est un u16 de 2 octets, la valeur maximale qu'elle peut contenir est 0xffff.
Pour exploiter cela, l'attaquant crée d'abord un événement chef de groupe avec toutes les options read_format possibles définies. Ensuite, de nombreux événements frères sont créés. Ces frères ne définissent que PERF_FORMAT_TOTAL_TIME_RUNNING dans le read_format pour garantir qu'il n'y ait pas de problèmes de validation dans perf_event_validate_size. En conséquence, la valeur nr_siblings devient extrêmement grande, mais comme chaque événement frère passe la validation individuellement, il n'y a pas de problèmes à ce stade.
Lorsque perf_read_group est appelé dans cet état, le read_size du chef de groupe continue d'augmenter car PERF_FORMAT_GROUP est défini. Finalement, cela conduit à un dépassement d'entier, et kzalloc alloue un très petit tampon. Cependant, comme le nombre réel d'événements est très grand, un débordement de tampon de tas se produit, provoquant une panique noyau.