Réponse courte: dans de nombreuses situations, Vim est vulnérable à ce type d'attaque (lors du collage de texte en mode Insertion).
Preuve de concept
En utilisant l'article lié comme point de départ, j'ai pu créer rapidement une page Web avec le code suivant, en utilisant des éléments HTML span et CSS pour masquer la partie centrale du texte de sorte que seul ls -la
le spectateur occasionnel puisse le visualiser la source). Remarque: le ^[
est le caractère d'échappement et le ^M
retour de chariot. Stack Exchange supprime les entrées de l'utilisateur et protège contre le masquage de contenu à l'aide de CSS. J'ai donc téléchargé la preuve de concept .
ls ^[:echom "This could be a silent command."^Mi -la
Si vous étiez en mode Insertion et que vous colliez ce texte dans le terminal Vim (avec quelques qualificateurs, voir ci-dessous), vous verriez, ls -la
mais si vous exécutez la :messages
commande, vous pouvez voir les résultats de la commande masquée Vim.
La défense
Pour se défendre contre cette attaque, il est préférable de rester en mode normal et de coller avec "*p
ou "+p
. En mode normal, lorsque p texte Utting d'un registre, le texte intégral (y compris la partie cachée) est collé. Cela ne se produit pas en mode Insertion (même si :set paste
) a été défini.
Mode coller entre crochets
Les versions récentes de Vim prennent en charge le mode coller entre crochets qui atténue ce type d'attaque par copier-coller. Sato Katsura a précisé que «le support pour la pâte entre crochets est apparu dans Vim 8.0.210 et a été corrigé pour la dernière fois dans la version 8.0.303 (publié le 2 février 2017)».
Remarque: Si j'ai bien compris, les versions de Vim prenant en charge le mode coller entre crochets devraient vous protéger lors du collage à l'aide de Ctrl- Shift- V(la plupart des environnements de bureau GNU / Linux), Ctrl- V(MS Windows), Command- V(Mac OS X), Shift- Insertou d'une souris. Clic du milieu.
Essai
J'ai fait des tests sur une machine de bureau Lubuntu 16.04 plus tard, mais mes résultats ont été confus et peu concluants. Depuis, j’ai réalisé que c’est parce que j’utilise toujours l’ écran GNU, mais il apparaît que cet écran filtre la séquence d’échappement utilisée pour activer / désactiver le mode coller entre crochets (il existe un patch, mais il semble qu’il ait été soumis à un moment donné. le projet n’était pas activement maintenu). Lors de mes tests, la preuve de concept fonctionne toujours lors de l'exécution de Vim via un écran GNU, que Vim ou l'émulateur de terminal prenne en charge le mode de collage entre crochets.
Des tests supplémentaires seraient utiles mais, jusqu'à présent, j'ai constaté que la prise en charge du mode coller entre crochets par l'émulateur de terminal bloquait ma validation de principe, tant que l'écran GNU ne bloquait pas les séquences d'échappement correspondantes. Cependant, l’utilisateur nneonneo signale qu’il est possible d’ utiliser un assemblage soigneux des séquences d’échappement pour quitter le mode coller entre crochets.
Notez que même avec une version mise à jour de Vim, la preuve de concept fonctionne toujours si l'utilisateur colle depuis le *
registre en mode Insertion en tapant ( Ctrl- R*). Ceci s'applique également à GVim, qui peut différencier les entrées tapées et collées. Dans ce cas, Vim laisse à l'utilisateur le soin de faire confiance au contenu du contenu de leur registre. Par conséquent, n'utilisez jamais cette méthode lorsque vous collez à partir d'une source non fiable (c'est quelque chose que je fais souvent - mais je commence à m'entraîner moi-même).
Liens connexes
Conclusion
Utilisez le mode Normal lors du collage de texte (à partir des registres +
ou *
).
… Ou utilisez Emacs. J'entends dire que c'est un système d'exploitation décent. :)