Qu'est ce qu'un retpoline et comment ça fonctionne?
Afin d'atténuer les effets du noyau ou de la croix-mémoire pour le processus de divulgation (le Spectre attaque), le noyau Linux1 sera compilé avec une nouvelle option, -mindirect-branch=thunk-extern
introduit à gcc
pour effectuer des appels indirects par le biais d'un retpoline.
Ce qui semble être un nouveau terme inventé comme une recherche sur Google tourne que très récent (en général tous les en 2018).
Qu'est ce qu'un retpoline et comment faut-il prévenir le noyau récent, la divulgation d'informations attaques?
1 Ce n'est pas spécifique à Linux, cependant, similaires ou identiques construire semble être utilisé dans le cadre de la des stratégies d'atténuation sur d'autres Systèmes d'exploitation.
- Un intéressant support à partir de Google.
- oh, il est donc prononcé /ˌtræmpəˈlin/ (Américain) ou /ˈtræmpəˌliːn/ (Anglais)
- Vous pouvez mentionner que c'est le Linux noyau, bien que
gcc
points de cette façon! Je n'ai pas reconnaître lkml.org/lkml/2018/1/3/780 comme sur le Noyau Linux Liste de Diffusion du site, même pas une fois j'ai regardé il y a (et il a été servi un instantané comme il était en mode hors connexion). - ajout d'un noyau Linux tag
- bon point, j'ai mis à jour le texte de la question. Notez que je l'ai vu d'abord dans le noyau Linux, car il est relativement ouvert le processus de développement, mais sans doute de la même ou d'autres techniques similaires sont en cours utilise que des mesures d'atténuation à travers le spectre de code source ouvert et fermé de Systèmes d'exploitation. Donc je ne vois pas cela comme spécifique à Linux, mais le lien est certainement.
Vous devez vous connecter pour publier un commentaire.
L'article mentionné par sgbj dans les commentaires écrits par Google-Paul Turner explique plus en détail, mais je vais donner un coup de feu:
Aussi loin que je peux pièce de cet ensemble, à partir du peu d'informations pour le moment, un retpoline est un retour trampoline qui utilise une boucle infinie qui n'est jamais exécutée pour empêcher le PROCESSEUR de spéculer sur la cible indirecte sauter.
L'approche de base peut être vu dans Andi Kleen du noyau de la branche résoudre ce problème:
Il introduit le nouveau
__x86.indirect_thunk
appel que les charges de l'appel cible dont l'adresse mémoire (que je vais appelerADDR
) est stocké sur le haut de la pile et exécute le saut à l'aide d'un l'RET
instruction. Le thunk lui-même est alors appelé à l'aide de la NOSPEC_JMP/APPEL macro, qui a été utilisé pour remplacer la plupart (si pas tous) indirecte des appels et des sauts. La macro simplement des lieux de l'appel de la cible sur la pile et définit l'adresse de retour correctement, si nécessaire (à noter la non-linéaires de flux de contrôle):Le placement de
call
en fin de compte est nécessaire de sorte que lorsque l'appel indirect est terminée, le contrôle de flux continue derrière l'utilisation de laNOSPEC_CALL
macro, de sorte qu'il peut être utilisé à la place d'un réguliercall
Le thunk lui-même se présente comme suit:
Le contrôle de flux peut être un peu déroutant ici, permettez-moi de préciser:
call
pousse le pointeur d'instruction en cours (maison 2) de la pile.lea
ajoute 8 à la pointeur de pile, de manière efficace de les jeter le plus récemment poussé quadword, qui est la dernière adresse de retour (pour l'étiquette 2). Après cela, le haut de la pile des points de rendement réel de l'adresse ADDR nouveau.ret
sauts de*ADDR
et réinitialise le pointeur de pile pour le début de la pile d'appel.En fin de compte, l'ensemble de ce comportement est pratiquement équivalent à sauter directement à
*ADDR
. Le seul avantage que nous avons est que la direction de la prédicteur utilisé pour l'instruction return (Retour de mémoire Tampon de la Pile, RSB), lors de l'exécution de lacall
instruction, suppose que le correspondantret
instruction de saut à l'étiquette 2.La partie après l'étiquette 2 en fait n'est jamais exécutée, c'est tout simplement une boucle infinie qui serait, en théorie, remplir le pipeline d'instruction avec
JMP
instructions. En utilisantLFENCE
,PAUSE
ou plus généralement une instruction provoquant l'instruction pipeline être de décrochage s'arrête la CPU de perdre de la puissance et de temps en temps sur ce spéculative de l'exécution. C'est parce que dans le cas où l'appel à retpoline_call_target serait de retour normalement, leLFENCE
serait la prochaine instruction à exécuter. C'est aussi ce que la direction générale prédicteur permettront de prédire basé sur l'original de l'adresse de retour (l'étiquette 2)Pour citer Intel architecture du manuel:
Toutefois noter que la spécification ne mentionne jamais que LFENCE et la PAUSE de la cause à la canalisation de décrochage, donc je suis en train de lire un peu entre les lignes ici.
Maintenant, revenons à votre question initiale:
La mémoire du noyau de divulgation d'informations est possible en raison de la combinaison de deux idées:
Même si spéculative d'exécution devraient être sans effets secondaires lorsque la spéculation était mauvais, spéculative de l'exécution affecte encore la hiérarchie du cache. Cela signifie que lorsqu'une charge mémoire est exécutée de manière spéculative, il peut encore avoir causé une ligne de cache à être expulsés. Ce changement dans la hiérarchie du cache peuvent être identifiés par l'soigneusement mesurer le temps d'accès à la mémoire qui est mappé sur le même jeu de cache.
Vous pouvez même fuite de quelques bribes de mémoire arbitraire lorsque l'adresse source de la lecture de la mémoire elle-même, était de lire à partir de la mémoire du noyau.
Indirect à la branche prédicteur de Processeurs Intel utilise uniquement le plus bas des 12 bits de la source de l'instruction, il est ainsi facile d'empoisonner tous les 2^12 prédiction possible d'histoires contrôlées par l'utilisateur des adresses de mémoire. Ceux-ci peuvent alors, lorsque le saut indirect est prévue au sein du noyau), la spéculation exécuté avec les privilèges du noyau. En utilisant le cache-synchronisation du canal latéral, vous pouvez donc fuite arbitraire de la mémoire du noyau.
Mise à JOUR: Sur le noyau liste de diffusion, il y a une discussion en cours qui m'amène à croire retpolines ne pas réduire à la direction de la prévision questions, comme quand le Retour à la mémoire Tampon de la Pile (RSB) tourne à vide, plus récente, des architectures Intel (Skylake+) à l'automne de retour pour les personnes vulnérables Branch Target Buffer (BTB):
ret
à un emplacement de pile qui doit être remplie avant que ce thunk a été appelé.push
/ret
que ne pas le déséquilibre de l'adresse de retour prédicteur de la pile. Il y a une mispredict (aller à lalfence
avant l'adresse de retour est utilisé), mais à l'aide d'uncall
+ modifiantrsp
équilibré queret
.push
/ret
(dans mon dernier commentaire). re: vos edit: RSB dépassement de capacité devrait être impossible parce que le retpoline comprend uncall
. Si le noyau de préemption a fait un changement de contexte là, nous aimerions reprendre l'exécution avec le RSB amorcée à partir de lacall
dans le planificateur. Mais peut-être un gestionnaire d'interruption pourrait mettre fin avec assez deret
s pour vider le RSB.Un retpoline est conçu pour protéger contre la direction de la cible d'injection (CVE-2017-5715) exploiter. C'est une attaque où indirects de la branche de l'instruction dans le noyau est utilisé pour forcer l'exécution spéculative de l'arbitraire d'un morceau de code. Le code choisi est un "gadget" qui est en quelque sorte utile à l'attaquant. Par exemple, le code peut être choisi de sorte que les fuites de données du noyau à travers la façon dont elle affecte le cache. Le retpoline empêche cet exploit par le simple remplacement de tous indirecte les instructions de branchement avec une instruction de retour.
Je pense que ce qui est important à propos de la retpoline est juste le "ret" partie, qu'il remplace l'indirects de la branche avec une instruction de retour de sorte que le PROCESSEUR utilise le rendement de la pile prédicteur au lieu de l'exploitables branche prédicteur. Si une simple pression et une instruction de retour a été utilisé à la place le code qui serait éventuellement exécutées serait le code de la fonction finira par revenir à de toute façon, pas un gadget utile pour l'attaquant. Le principal avantage de la trampoline partie semble être de maintenir le rendement de la pile ainsi, lorsque la fonction ne fait retour à son appelant cela est prédit correctement.
L'idée de base derrière la direction de la cible d'injection est simple. Il profite du fait que le CPU n'a pas d'enregistrer la totalité de l'adresse de la source et de la destination de branches dans le secteur cible des tampons. Ainsi, l'attaquant peut remplir la mémoire tampon à l'aide de sauts dans son propre espace d'adressage qui aura pour résultat de prédiction de frappe quand un particulier indirects saut est exécuté dans l'espace d'adressage du noyau.
Noter que retpoline n'empêche pas de noyau de divulgation de l'information directement, il n'empêche qu'indirecte les instructions de branchement d'être utilisés pour la spéculation exécuter un gadget qui pourraient divulguer des informations. Si l'attaquant peut trouver d'autres moyens pour éventuellement exécuter le gadget puis le retpoline n'empêche pas l'attaque.
Le papier Le Spectre Des Attaques: L'Exploitation Spéculative De L'Exécution par Paul Kocher, Daniel Genkin, Daniel Gruss, Werner Haas, Mike Hambourg,
Moritz Lipp, Stefan Mangard, Thomas Prescher, Michael Schwarz, et Yuval Yarom donner l'aperçu ci-dessous de façon indirecte, les branches peuvent être exploitées:
Une entrée de blog intitulé La lecture privilégié de la mémoire avec un canal latéral par le Projet de l'équipe de Zéro à Google fournit un autre exemple de la façon dont direction de la cible d'injection peut être utilisé pour créer un exploit.
Cette question a été posée tout à l'heure, et qui mérite une nouvelle réponse.
Résumé:
“Retpoline” des séquences d'un logiciel de construction qui permettent indirects branches d'être isolé à partir de spéculative de l'exécution. Cela peut être appliqué pour protéger les fichiers binaires (comme le système d'exploitation ou de l'hyperviseur mises en œuvre) de la direction de la cible d'attaques par injection à l'encontre de leurs indirects branches.
Le mot "retpoline" est un valise des mots "retour" et "trampoline", à l'instar de l'amélioration "relpoline" a été forgé à partir de "par rapport appeler" et "trampoline". C'est un trampoline de construire construit à l'aide d'opérations de retour qui, aussi au sens figuré garantit que tous les associés spéculative exécution “rebondir” à l'infini.
L'utilisation de cette option du compilateur seulement protège contre Spectre V2 dans les processeurs qui ont la mise à jour de microcode nécessaire pour CVE-2017-5715. Elle sera " travail' sur n'importe quel code (pas seulement d'un noyau), mais seulement le code contenant "secrets" vaut la peine d'attaquer.
La Compilateur LLVM a eu un
-mretpoline
commutateur depuis avant de Jan 4 2018. Cette date est lorsque la vulnérabilité a été d'abord présenté au public. GCC fait leurs correctifs disponibles 7 janvier 2018.Le CVE ce jour suggère que la vulnérabilité était " découvert' en 2017, mais elle affecte certains des processeurs fabriqués au cours des deux dernières décennies (donc il a probablement été découvert il y a longtemps).
Tout d'abord, quelques définitions:
Trampoline Que l'on appelle parfois indirecte sauter vecteurs trampolines sont les emplacements de la mémoire tenue adresses pointant vers des routines de service d'interruption, I/O routines, etc. L'exécution des sauts sur le trampoline puis saute immédiatement, ou de rebonds, d'où le terme de trampoline. GCC a traditionnellement pris en charge les fonctions imbriquées par la création d'un exécutable trampoline au moment de l'exécution lorsque l'adresse d'une fonction imbriquée est pris. C'est un petit morceau de code qui se trouve normalement sur la pile, dans le cadre de la pile de la fonction contenante. Le trampoline charges statiques de la chaîne d'enregistrer et puis saute à l'adresse réelle de la fonction imbriquée.
Thunk - Un thunk est un sous-programme utilisé pour injecter un calcul supplémentaire dans une autre sous-routine. Les Thunks sont principalement utilisées pour retarder un calcul jusqu'à ce que son résultat est nécessaire, ou pour les opérations d'insertion au début ou à la fin de l'autre sous-routine
Memoization - Un memoized fonction "se souvient" les résultats correspondant à un ensemble de données spécifiques. Les appels suivants à rappeler les entrées de retour le rappeler résultat plutôt que de recalculer il, éliminant ainsi le coût principal d'appel avec des paramètres donnés de tous, mais le premier appel de la fonction avec les paramètres.
Très grossièrement, un retpoline est un trampoline avec un retour comme un thunk, à " gâcher' memoization dans le indirects de la branche prédicteur.
Source: Le retpoline inclut une PAUSE d'instruction pour Intel, mais un LFENCE instruction est nécessaire pour AMD depuis sur ce processeur la PAUSE instruction n'est pas une sérialisation de l'instruction, de sorte que la pause/jmp boucle d'utiliser l'excès de pouvoir, tel qu'il est spéculé sur l'attente pour le retour à mispredict à la bonne cible.
Arstechnica a une explication simple du problème:
De Intel papier: "Retpoline: Une Direction De La Cible D'Injection D'Atténuation" (.PDF):