O Vim é imune a ataques de copiar e colar?

112

Você nunca deve colar da web para o seu terminal . Em vez disso, você deve colar no seu editor de texto, verificar o comando e colar no terminal.

Tudo bem, mas e se o Vim for meu editor de texto? Alguém poderia criar um conteúdo que alterne o Vim para o modo de comando e execute o comando malicioso?

Adam Trhon
fonte
2
@ryekayo Eu sei como executar o comando em segundo plano. A questão é mais sobre se é possível mudar vim do modo de inserção modo de comando e, em seguida, executar qualquer coisa
Adam Trhon
3
Versões recentes do Vim têm pasta entre parênteses, o que deve impedir esse tipo de ataque.
Satō Katsura
2
@ EmilJeřábek O link no post fornece razões suficientes para correr pelas colinas, em vez de fazer isso.
Satō Katsura
1
@ EmilJeřábek Como você pode forjar texto oculto com o caractere Escape, presumo que você também pode forjar texto com EOF. Então o texto oculto pode conter algo como /bin/bash ; EOF rm -rf ~. Quando colado no terminal, ele iniciaria o bash, encerrá-lo e excluir sua casa. Quando colado no gato, ele deixaria o gato imprimir o comando, finalizar o gato e excluir sua casa.
Adam Trhon

Respostas:

106

Resposta curta: Em muitas situações, o Vim é vulnerável a esse tipo de ataque (ao colar texto no modo Inserir).

Prova de conceito

Usando o artigo vinculado como ponto de partida, pude criar rapidamente uma página da Web com o código a seguir, usando elementos de extensão HTML e CSS para ocultar a parte do meio do texto, para que ls -lafique visível apenas para o visualizador casual (sem exibir o 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, então eu enviei a prova de conceito .

ls ^[:echom "This could be a silent command."^Mi -la

Se você estivesse no modo Inserir e colasse esse texto no terminal Vim (com alguns qualificadores, veja abaixo), veria, ls -lamas se executar o :messagescomando, poderá ver os resultados do comando oculto do Vim.

Defesa

Para se defender deste ataque, é melhor permanecer no modo Normal e colar usando "*pou "+p. No modo Normal, quando p texto Utting de um registro, o texto completo (incluindo a parte oculta) é colado. O mesmo não acontece no modo Inserir (mesmo que :set paste) tenha sido definido.

Modo de pasta entre colchetes

Versões recentes do Vim suportam o modo de colar entre colchetes que atenua esse tipo de ataque de copiar e colar. Sato Katsura esclareceu que "O suporte para pasta 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, as versões do Vim com suporte ao 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), Command- V(Mac OS X), Shift- Insertou um mouse clique no meio.

Testando

Fiz alguns testes em uma máquina desktop Lubuntu 16.04 mais tarde, mas meus resultados foram confusos e inconclusivos. Desde então, percebi que isso acontece porque eu sempre uso a tela GNU, mas acontece que a tela filtra a sequência de escape usada para ativar / desativar o modo de colagem entre colchetes (há um patch, mas parece que ele foi enviado no momento em que o projeto não estava sendo mantido ativamente). Nos meus testes, a prova de conceito sempre funciona quando o Vim é executado na tela GNU, independentemente de o Vim ou o emulador de terminal suportar o modo de pasta entre colchetes.

Testes adicionais seriam úteis, mas até agora descobri que o suporte ao modo de colagem entre colchetes do emulador de terminal bloqueia minha Prova de Conceito - desde que a tela GNU não esteja bloqueando as seqüê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 colagem entre colchetes.

Observe que, mesmo com uma versão atualizada do Vim, a Prova de conceito sempre funciona se o usuário cola o *registro no modo Inserir, digitando ( Ctrl- R*). Isso também se aplica ao GVim, que pode diferenciar entre entrada digitada e colada. Nesse caso, o Vim deixa ao usuário confiar no conteúdo do seu registro. Portanto, nunca use esse método ao colar de uma fonte não confiável (é algo que muitas vezes faço - mas agora comecei a me treinar para não usar).

Links Relacionados

Conclusão

Use o modo Normal ao colar texto (dos +ou *registradores).

... ou use o Emacs. Ouvi dizer que é um sistema operacional decente. :)

Anthony Geoghegan
fonte
2
Você deve ativar o pastemode ( :set paste) antes de colar no Vim. A pasta entre colchetes deve entrar em vigor, desde que o seu terminal também suporte. Sua prova de conceito não funciona quando o pastemodo está ativado.
Satō Katsura 03/04
1
Não vejo como o modo de colar entre colchetes é seguro. Se o invasor souber que você está usando pasta entre parênteses, ele colocará uma \e[201~sequência no comando colar para sair do modo de pasta entre parênteses e continuará pressionando você de qualquer maneira. (A menos que eu perdi alguns detalhes sobre como enquadradas obras colar?)
nneonneo
2
@SatoKatsura: Eu tentei no Vim 8.0.540, que não era vulnerável ao ataque original. Após a adição \x1b[201~, a exploração funcionou como antes (ou seja, apenas ls -lafoi gravada no buffer e o echomcomando foi executado). Portanto, acho que a pasta entre colchetes ainda está vulnerável a um ataque direcionado e não é uma solução suficientemente forte. (Na verdade, qualquer forma de sinalização in-band é vulnerável!)
nneonneo
2
Eu tentei com e sem :set paste- a exploração ainda funciona. Para ser perfeitamente claro, eu colei o seguinte blob (codificado em base64): bHMgG1syMDF+GzplY2hvbSAiVGhpcyBjb3VsZCBiZSBhIHNpbGVudCBjb21tYW5kLiIKaSAtbGE=. No OS X, você pode copiar isso e executar pbpaste | base64 -D | pbcopypara obter uma versão bruta na qual colar vim.
Nseonneo 3/04
1
Para ficar ainda mais claro, estou testando com uma conexão SSH com uma caixa Ubuntu 16.04, usando o macOS Terminal.app. Se o emulador de terminal estiver removendo a sequência de escape na colagem, você provavelmente poderá aninhar a sequência (por exemplo \x1b\x1b[201~[201~) ou algo para enganar o filtro.
Nneonneo 3/04
0

Se você estiver usando o recurso da área de transferência X11, ou um equivalente específico da plataforma, e usar colar com o botão do meio com o suporte ao mouse ativado ou um comando vim paste e não com nenhum comando de colar no terminal (shift-middle-button ou qualquer atalho no terminal ofertas), então você pode estar seguro.

Caso contrário, se você possui um emulador de terminal que suporta o modo de colar entre parênteses, e ativou isso no seu terminal e no vim, e esse emulador de terminal implementa proteção contra a injeção da sequência de escape que termina o modo de colar entre parênteses, então você pode estar seguro.

Caso contrário, você pode estar vulnerável ao ataque descrito aqui .

sh1
fonte