Memory Tagging Extension (MTE)

Reading time: 6 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks

Informations de base

Memory Tagging Extension (MTE) est conçu pour améliorer la fiabilité et la sécurité des logiciels en détectant et en prévenant les erreurs liées à la mémoire, telles que les débordements de tampon et les vulnérabilités d'utilisation aprÚs libération. MTE, en tant que partie de l'architecture ARM, fournit un mécanisme pour attacher un petit tag à chaque allocation de mémoire et un tag correspondant à chaque pointeur référencant cette mémoire. Cette approche permet de détecter les accÚs mémoire illégaux à l'exécution, réduisant ainsi considérablement le risque d'exploiter de telles vulnérabilités pour exécuter du code arbitraire.

Comment fonctionne l'extension de balisage de mémoire

MTE fonctionne en divisant la mémoire en petits blocs de taille fixe, chaque bloc se voyant attribuer un tag, généralement de quelques bits.

Lorsqu'un pointeur est crĂ©Ă© pour pointer vers cette mĂ©moire, il reçoit le mĂȘme tag. Ce tag est stockĂ© dans les bits inutilisĂ©s d'un pointeur mĂ©moire, liant efficacement le pointeur Ă  son bloc de mĂ©moire correspondant.

https://www.youtube.com/watch?v=UwMt0e_dC_Q

Lorsqu'un programme accÚde à la mémoire via un pointeur, le matériel MTE vérifie que le tag du pointeur correspond au tag du bloc de mémoire. Si les tags ne correspondent pas, cela indique un accÚs mémoire illégal.

Tags de pointeur MTE

Les tags à l'intérieur d'un pointeur sont stockés dans 4 bits à l'intérieur du premier octet :

https://www.youtube.com/watch?v=UwMt0e_dC_Q

Par conséquent, cela permet jusqu'à 16 valeurs de tag différentes.

Tags de mémoire MTE

Chaque 16B de mémoire physique a un tag de mémoire correspondant.

Les tags de mémoire sont stockés dans une région RAM dédiée (non accessible pour un usage normal). Avoir des tags de 4 bits pour chaque tag de mémoire de 16B jusqu'à 3 % de la RAM.

ARM introduit les instructions suivantes pour manipuler ces tags dans la mémoire RAM dédiée :

STG [<Xn/SP>], #<simm>    Store Allocation (memory) Tag
LDG <Xt>, [<Xn/SP>]       Load Allocatoin (memory) Tag
IRG <Xd/SP>, <Xn/SP>      Insert Random [pointer] Tag
...

VĂ©rification des modes

Sync

Le CPU vérifie les tags pendant l'exécution de l'instruction, s'il y a un décalage, il lÚve une exception.
C'est le plus lent et le plus sécurisé.

Async

Le CPU vérifie les tags asynchrone, et lorsqu'un décalage est trouvé, il définit un bit d'exception dans l'un des registres systÚme. C'est plus rapide que le précédent mais il est incapable de pointer l'instruction exacte qui a causé le décalage et il ne lÚve pas l'exception immédiatement, donnant un peu de temps à l'attaquant pour compléter son attaque.

Mixed

???

Exemples d'implémentation et de détection

Appelé KASAN basé sur des tags matériels, KASAN basé sur MTE ou MTE dans le noyau.
Les allocateurs du noyau (comme kmalloc) vont appeler ce module qui préparera le tag à utiliser (de maniÚre aléatoire) pour l'attacher à l'espace noyau alloué et au pointeur retourné.

Notez qu'il marquera uniquement suffisamment de granules de mémoire (16B chacune) pour la taille demandée. Donc, si la taille demandée était de 35 et qu'une plaque de 60B était donnée, il marquera les premiers 16*3 = 48B avec ce tag et le reste sera marqué avec un soi-disant tag invalide (0xE).

Le tag 0xF est le pointeur qui correspond Ă  tout. Une mĂ©moire avec ce pointeur permet d'utiliser n'importe quel tag pour accĂ©der Ă  sa mĂ©moire (pas de dĂ©calages). Cela pourrait empĂȘcher le MET de dĂ©tecter une attaque si ce tag est utilisĂ© dans la mĂ©moire attaquĂ©e.

Par consĂ©quent, il n'y a que 14 valeurs qui peuvent ĂȘtre utilisĂ©es pour gĂ©nĂ©rer des tags car 0xE et 0xF sont rĂ©servĂ©s, donnant une probabilitĂ© de rĂ©utilisation des tags de 1/17 -> environ 7%.

Si le noyau accĂšde Ă  la granule de tag invalide, le dĂ©calage sera dĂ©tectĂ©. S'il accĂšde Ă  un autre emplacement mĂ©moire, si la mĂ©moire a un tag diffĂ©rent (ou le tag invalide), le dĂ©calage sera dĂ©tectĂ©. Si l'attaquant a de la chance et que la mĂ©moire utilise le mĂȘme tag, cela ne sera pas dĂ©tectĂ©. Les chances sont d'environ 7%.

Un autre bug se produit dans la derniĂšre granule de la mĂ©moire allouĂ©e. Si l'application a demandĂ© 35B, elle a reçu la granule de 32 Ă  48. Par consĂ©quent, les octets de 36 Ă  47 utilisent le mĂȘme tag mais n'ont pas Ă©tĂ© demandĂ©s. Si l'attaquant accĂšde Ă  ces octets supplĂ©mentaires, cela n'est pas dĂ©tectĂ©.

Lorsque kfree() est exécuté, la mémoire est retagged avec le tag de mémoire invalide, donc dans un use-after-free, lorsque la mémoire est à nouveau accédée, le décalage est détecté.

Cependant, dans un use-after-free, si le mĂȘme chunk est rĂ©allouĂ© Ă  nouveau avec le MÊME tag qu'auparavant, un attaquant pourra utiliser cet accĂšs et cela ne sera pas dĂ©tectĂ© (environ 7% de chance).

De plus, seuls slab et page_alloc utilisent de la mĂ©moire taguĂ©e mais Ă  l'avenir, cela sera Ă©galement utilisĂ© dans vmalloc, stack et globals (au moment de la vidĂ©o, ceux-ci peuvent encore ĂȘtre abusĂ©s).

Lorsqu'un décalage est détecté, le noyau va panic pour prévenir toute exploitation supplémentaire et les tentatives de l'exploit (MTE n'a pas de faux positifs).

Références

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks