Vim est-il à l'abri de l'attaque copier-coller?

112

Vous ne devriez jamais coller de Web à votre terminal . Au lieu de cela, vous devez coller dans votre éditeur de texte, vérifier la commande puis coller dans le terminal.

Ce n'est pas grave, mais si Vim est mon éditeur de texte? Pourrait-on forger un contenu qui permette à Vim de passer en mode commande et d'exécuter la commande illicite?

Adam Trhon
la source
2
@ryekayo Je sais comment exécuter une commande en arrière-plan. La question est plutôt de savoir s'il est possible de passer de vim du mode insertion au mode commande, puis d'exécuter quoi que ce soit
Adam Trhon
3
Les versions récentes de Vim ont une pâte entre crochets, ce qui est censé empêcher ce type d’attaque.
Satō Katsura
2
@ EmilJeřábek Le lien dans le message vous donne suffisamment de raisons de courir vers les collines plutôt que de le faire.
Satō Katsura
1
@ EmilJeřábek Comme vous pouvez créer du texte masqué avec un caractère d'échappement, je suppose que vous pouvez également créer du texte avec EOF. Ensuite, le texte masqué pourrait contenir quelque chose comme /bin/bash ; EOF rm -rf ~. Une fois collé dans le terminal, il démarrera bash, le terminera et supprimera votre maison. Lorsque collé dans le chat, il laisserait chat imprimer la commande, mettre fin au chat et supprimer votre maison.
Adam Trhon

Réponses:

106

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 -lale spectateur occasionnel puisse le visualiser la source). Remarque: le ^[est le caractère d'échappement et le ^Mretour 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 -lamais si vous exécutez la :messagescommande, 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 "*pou "+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. :)

Anthony Geoghegan
la source
2
Vous êtes censé activer pastemode ( :set paste) avant de coller dans Vim. La pâte entre crochets doit alors prendre effet, à condition que votre terminal la prenne également en charge. Votre preuve de concept ne fonctionne pas lorsque le pastemode est activé.
Satō Katsura
1
Je ne vois pas en quoi le mode coller entre crochets est sans danger. Si l'attaquant sait que vous utilisez une pâte entre crochets, il vous suffit de coller une \e[201~séquence dans la commande Coller pour quitter le mode de pâte entre crochets et de vous poursuivre malgré tout. (Sauf si j'ai manqué quelques détails sur le fonctionnement de la pâte entre crochets?)
nneonneo
2
@SatoKatsura: Je l'ai essayé sur Vim 8.0.540, qui n'était pas vulnérable à l'attaque d'origine. Après l’ajout \x1b[201~, l’exploit a fonctionné comme avant (c’est-à-dire que seul le script a ls -laété écrit et la echomcommande exécutée). Par conséquent, je pense que la pâte entre crochets est toujours vulnérable à une attaque ciblée et n’est pas une solution suffisamment solide. (En effet, toute forme de signalisation dans la bande est vulnérable!)
nneonneo
2
Je l'ai essayé avec et sans :set paste- l'exploit fonctionne toujours. Pour être parfaitement clair, je collais la blob suivante (base64): bHMgG1syMDF+GzplY2hvbSAiVGhpcyBjb3VsZCBiZSBhIHNpbGVudCBjb21tYW5kLiIKaSAtbGE=. Sous OS X, vous pouvez copier cela, exécuter pbpaste | base64 -D | pbcopypour obtenir une version brute à coller vim.
nneonneo
1
Pour être encore plus clair, je teste avec une connexion SSH à une boîte Ubuntu 16.04, en utilisant le macOS Terminal.app. Si votre émulateur de terminal supprime la séquence d'échappement lors du collage, vous pouvez probablement imbriquer la séquence (par exemple \x1b\x1b[201~[201~) ou quelque chose pour tromper le filtre.
nneonneo
0

Si vous utilisez la fonctionnalité Presse-papiers X11, ou un équivalent spécifique à la plate-forme, et que vous utilisez le collage au bouton central avec le support de la souris activé ou une commande vim paste et non une commande de collage de terminal (bouton du milieu, ou tout autre raccourci du terminal) offres) alors vous pourriez être en sécurité.

Sinon, si vous avez un émulateur de terminal qui prend en charge le mode coller entre crochets et que vous l'avez activé dans votre terminal et dans vim et que cet émulateur implémente une protection contre l'injection de la séquence d'échappement qui termine le mode coller entre crochets, alors vous pourriez être en sécurité.

Sinon, vous pourriez être vulnérable à l'attaque décrite ici .

sh1
la source