¿Vim es inmune al ataque de copiar y pegar?

112

Nunca debe pegar desde la web a su terminal . En su lugar, debe pegar en su editor de texto, verificar el comando y luego pegar en el terminal.

Está bien, pero ¿y si Vim es mi editor de texto? ¿Se podría falsificar un contenido que cambie Vim al modo de comando y ejecute el comando malicioso?

Adam Trhon
fuente
2
@ryekayo Sé cómo ejecutar el comando en segundo plano. La pregunta es más acerca de si es posible cambiar vim del modo de inserción al modo de comando y luego ejecutar algo
Adam Trhon el
3
Las versiones recientes de Vim tienen pasta entre corchetes, que se supone que previene este tipo de ataques.
Satō Katsura
2
@ EmilJeřábek El enlace en la publicación te da suficientes razones para correr por las colinas en lugar de hacerlo.
Satō Katsura el
1
@ EmilJeřábek Como puede falsificar texto oculto con el carácter Escape, supongo que también puede falsificar texto con EOF. Entonces el texto oculto podría contener algo como /bin/bash ; EOF rm -rf ~. Cuando se pega en la terminal, comenzará bash, terminará y luego eliminará su casa. Cuando se pega en cat, le permite a cat imprimir el comando, finalizar cat y eliminar su hogar.
Adam Trhon el

Respuestas:

106

Respuesta corta: en muchas situaciones, Vim es vulnerable a este tipo de ataque (al pegar texto en modo Insertar).

Prueba de concepto

Utilizando el artículo vinculado como punto de partida, pude crear rápidamente una página web con el siguiente código, usando elementos de extensión HTML y CSS para ocultar la parte media del texto de modo que solo ls -lasea ​​visible para el espectador casual (sin ver el fuente). Nota: ^[es el carácter de escape y ^Mes el carácter de retorno de carro. Stack Exchange desinfecta los comentarios de los usuarios y protege contra la ocultación de contenido mediante CSS, por lo que he subido la prueba de concepto .

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

Si estuviera en modo Insertar y pegue este texto en el terminal Vim (con algunos calificadores, vea más abajo), verá ls -lapero si ejecuta el :messagescomando, puede ver los resultados del comando Vim oculto.

Defensa

Para defenderse de este ataque, es mejor permanecer en modo Normal y pegar usando "*po "+p. En el modo normal, cuando p texto Utting de un registro, el texto completo (incluyendo la parte oculta) se pega. Esto mismo no sucede en el modo Insertar (incluso si :set paste) se ha configurado.

Modo de pasta entre corchetes

Las versiones recientes de Vim admiten el modo de pegado entre corchetes que mitiga este tipo de ataque de copiar y pegar. Sato Katsura ha aclarado que "El soporte para la pasta entre corchetes apareció en Vim 8.0.210, y se reparó recientemente en la versión 8.0.303 (lanzada el 2 de febrero de 2017)".

Nota: Según tengo entendido, las versiones de Vim con soporte para el modo de pegado entre corchetes deberían protegerlo al pegar usando Ctrl- Shift- V(la mayoría de los entornos de escritorio GNU / Linux), Ctrl- V(MS Windows), Command- V(Mac OS X), Shift- Inserto un mouse clic medio.

Pruebas

Hice algunas pruebas desde una máquina de escritorio Lubuntu 16.04 más tarde, pero mis resultados fueron confusos y poco concluyentes. Desde entonces me di cuenta de que esto se debe a que siempre uso la pantalla GNU, pero resulta que la pantalla filtra la secuencia de escape utilizada para habilitar / deshabilitar el modo de pegado entre paréntesis (hay un parche pero parece que se envió en un momento en que proyecto no se mantenía activamente). En mis pruebas, la prueba de concepto siempre funciona cuando ejecuto Vim a través de la pantalla GNU, independientemente de si Vim o el emulador de terminal admiten el modo de pegado entre paréntesis.

Sería útil realizar más pruebas, pero, hasta ahora, descubrí que la compatibilidad con el modo de pegado entre paréntesis del emulador de terminal bloquea mi Prueba de concepto, siempre que la pantalla GNU no esté bloqueando las secuencias de escape relevantes. Sin embargo, el usuario nneonneo informa que se puede utilizar una cuidadosa elaboración de secuencias de escape para salir del modo de pegado entre paréntesis.

Tenga en cuenta que incluso con una versión actualizada de Vim, la Prueba de concepto siempre funciona si el usuario pega desde el *registro mientras está en modo Insertar escribiendo ( Ctrl- R*). Esto también se aplica a GVim, que puede diferenciar entre la entrada escrita y pegada. En este caso, Vim deja que el usuario confíe en el contenido de su contenido de registro. Por lo tanto, nunca use este método cuando pegue desde una fuente no confiable (es algo que hago a menudo, pero ahora he comenzado a entrenarme para no hacerlo).

Enlaces relacionados

Conclusión

Use el modo Normal al pegar texto (desde los registros +o *).

... o usa Emacs. Escuché que es un sistema operativo decente. :)

Anthony Geoghegan
fuente
2
Se supone que debes habilitar pastemode ( :set paste) antes de pegar en Vim. Luego, la pasta entre corchetes debería tener efecto, siempre que su terminal también lo admita. Su prueba de concepto no funciona cuando el pastemodo está habilitado.
Satō Katsura el
1
No veo cómo el modo pegado entre paréntesis es seguro. Si el atacante sabe que estás usando pasta entre corchetes, solo pegarán una \e[201~secuencia en el comando de pegar para salir del modo de pasta entre corchetes, y de todos modos procederán a mostrarte. (A menos que me he perdido algunos detalles de cómo funciona corchetes pasta?)
nneonneo
2
@SatoKatsura: Lo probé en Vim 8.0.540, que no era vulnerable al ataque original. Después de agregar \x1b[201~, el exploit funcionó como antes (es decir, solo ls -lase escribió en el búfer y echomse ejecutó el comando). Por lo tanto, creo que la pasta entre corchetes sigue siendo vulnerable a un ataque dirigido, y no es una solución lo suficientemente fuerte. (De hecho, ¡ cualquier forma de señalización dentro de banda es vulnerable!)
nneonneo
2
Lo intenté con y sin él :set paste: el exploit todavía funciona. Para ser perfectamente claro, me pega el blob (codificado en base 64) siguiente: bHMgG1syMDF+GzplY2hvbSAiVGhpcyBjb3VsZCBiZSBhIHNpbGVudCBjb21tYW5kLiIKaSAtbGE=. En OS X, puede copiar eso, ejecutar pbpaste | base64 -D | pbcopypara obtener una versión sin procesar para pegar vim.
nneonneo
1
Para ser aún más claro, estoy probando con una conexión SSH a un cuadro de Ubuntu 16.04, usando macOS Terminal.app. Si su emulador de terminal está eliminando la secuencia de escape al pegar, probablemente podría anidar la secuencia (por ejemplo \x1b\x1b[201~[201~) o algo para engañar al filtro.
nneonneo
0

Si está utilizando la función del portapapeles X11, o un equivalente específico de la plataforma, y ​​utiliza el botón central pegar con el soporte del mouse habilitado o un comando de pegar vim y no cualquier comando de pegar terminal (shift-middle-button o cualquier acceso directo al terminal ofertas) entonces podría estar seguro.

De lo contrario, si tiene un emulador de terminal que admite el modo de pegado entre paréntesis, y lo ha habilitado en su terminal y en vim, y ese emulador de terminal implementa protección contra la inyección de la secuencia de escape que termina el modo de pegado entre corchetes, entonces podrías estar a salvo.

De lo contrario, podría ser vulnerable al ataque descrito aquí .

sh1
fuente