Resposta curta: Em muitas situações, o Vim é vulnerável a esse tipo de ataque (ao colar texto no modo Insert).
Prova de conceito
Usando o artigo vinculado como ponto de partida, consegui criar rapidamente uma página da web com o código a seguir, usando elementos de span de HTML e CSS para ocultar a parte do meio do texto, para que apenas ls -la
fosse visível para o texto visualizador casual (não visualiza a fonte). Nota: o ^[
é o caractere Escape e o ^M
é o caractere de retorno de carro. O Stack Exchange limpa a entrada do usuário e protege contra a ocultação de conteúdo usando CSS, por isso fiz o upload da prova de conceito .
ls ^[:echom "This could be a silent command."^Mi -la
Se você estivesse no modo Inserir e colasse este texto no terminal Vim (com alguns qualificadores, veja abaixo), você veria ls -la
, mas se executar o comando :messages
, poderá ver os resultados do comando oculto Vim .
Defesa
Para se defender contra esse ataque, é melhor permanecer no modo normal e colar usando "*p
ou "+p
. No modo Normal, quando p corta o texto de um registrador, o texto completo (incluindo a parte oculta) é colado. Isso não acontece no modo de inserção (mesmo se :set paste
) tiver sido definido.
Modo de colar entre colchetes
Versões recentes do suporte ao Vim modo de colar entre colchetes que atenuam esse tipo de ataque de copiar e colar. Sato Katsura esclareceu que “Suporte para colar entre colchetes apareceu no Vim 8.0.210 e foi corrigido mais recentemente na versão 8.0.303 (lançada em 2 de fevereiro de 2017)”.
Nota: Pelo que entendi, versões do Vim com suporte para o modo de colar entre colchetes devem protegê-lo ao colar usando Ctrl - Shift - V (a maioria dos ambientes de desktop GNU / Linux), Ctrl - V (MS Windows), Comando - V (Mac OS X), Deslocamento - Inserir ou um clique do meio do mouse.
Teste
Eu fiz alguns testes em uma máquina desktop Lubuntu 16.04 mais tarde, mas meus resultados foram confusos e inconclusivos. Eu já percebi que isso é porque eu sempre uso tela GNU mas acontece que tela filtra a seqüência de escape usada para ativar / desativar o modo de colar entre colchetes (existe um patch , mas parece que foi enviado em um momento em que o projeto não estava sendo mantido ativamente). Nos meus testes, a prova de conceito sempre funciona ao executar o Vim através da tela GNU, independentemente de o Vim ou o emulador de terminal suportarem o modo de colar entre colchetes.
Outros testes seriam úteis, mas, até agora, descobri que o suporte para o modo de colar entre colchetes pelo emulador de terminal bloqueia minha Prova de conceito - desde que a tela GNU não esteja bloqueando as sequências de escape relevantes. No entanto, o usuário nneonneo relata que a criação cuidadosa de sequências de escape pode ser usada para sair do modo de colar entre parênteses.
Observe que, mesmo com uma versão atualizada do Vim, a Prova de Conceito sempre funciona se o usuário cola do registro *
no modo Inserir digitando ( Ctrl - < kbd> R * ). Isso também se aplica ao GVim, que pode diferenciar entre entrada digitada e colada. Neste caso, o Vim deixa para o usuário confiar no conteúdo do seu conteúdo de registro. Então, nunca use esse método ao colar de uma fonte não confiável (é algo que geralmente faço, mas agora comecei a treinar para não fazê-lo).
Links relacionados
- O que você vê não é o que você copia (a partir de 2009, a primeira menção disso tipo de exploração que eu encontrei)
- Como posso me proteger desse tipo de abuso da área de transferência?
- Discussão recente sobre a lista de discussão do vim_dev (jan. 2017)
Conclusão
Use o modo Normal ao colar texto (dos registros +
ou *
).
… or use Emacs. I hear it’s a decent operating system. :)