Vim è immune all'attacco copia-incolla?


112

Non dovresti mai incollare dal web al tuo terminale . Invece, dovresti incollare il tuo editor di testo, controllare il comando e quindi incollare sul terminale.

Va bene, ma cosa succede se Vim è il mio editor di testo? Si potrebbe forgiare un contenuto che passa Vim in modalità comando ed esegue il comando dannoso?


2
@ryekayo So eseguire il comando in background. La domanda riguarda se è possibile cambiare vim dalla modalità di inserimento alla modalità di comando e quindi eseguire qualsiasi cosa
Adam Trhon,

3
Le versioni recenti di Vim hanno un incolla tra parentesi, che dovrebbe prevenire questo tipo di attacchi.
Satō Katsura,

2
@ EmilJeřábek Il link nel post ti dà abbastanza motivi per correre per le colline piuttosto che farlo.
Satō Katsura,

1
@ EmilJeřábek Dato che puoi forgiare testo nascosto con il carattere Escape, suppongo che tu possa anche forgiare testo con EOF. Quindi il testo nascosto potrebbe contenere qualcosa come /bin/bash ; EOF rm -rf ~. Una volta incollato nel terminale, si avvia bash, lo termina e quindi elimina la tua casa. Se incollato in cat, lascia che cat stampi il comando, termina cat ed elimina la tua casa.
Adam Trhon,

Risposte:


106

Risposta breve: in molte situazioni, Vim è vulnerabile a questo tipo di attacco (quando si incolla il testo in modalità Inserisci).

Verifica teorica

Utilizzando l'articolo collegato come punto di partenza, sono stato in grado di creare rapidamente una pagina Web con il seguente codice, utilizzando elementi di span HTML e CSS per nascondere la parte centrale del testo in modo che ls -lasia visibile solo al visualizzatore casuale (non visualizzare il fonte). Nota: ^[è il carattere Escape e ^Mè il carattere di ritorno a capo. Stack Exchange igienizza l'input dell'utente e protegge dal nascondere i contenuti utilizzando i CSS, quindi ho caricato la dimostrazione del concetto .

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

Se tu fossi in modalità Inserisci e incollassi questo testo nel terminale Vim (con alcuni qualificatori, vedi sotto) vedresti ls -lama se esegui il :messagescomando, puoi vedere i risultati del comando Vim nascosto.

Difesa

Per difendersi da questo attacco è meglio rimanere in modalità Normale e incollare usando "*po "+p. In modalità normale, quando p testo Utting da un registro, il testo completo (compresa la parte nascosta) viene incollato. Lo stesso non accade nella modalità Inserisci (anche se :set paste) è stata impostata.

Modalità incolla parentesi

Le versioni recenti di Vim supportano la modalità incolla tra parentesi che mitiga questo tipo di attacco copia-incolla. Sato Katsura ha chiarito che "Il supporto per la pasta tra parentesi è apparso in Vim 8.0.210 ed è stato recentemente riparato nella versione 8.0.303 (rilasciata il 2 febbraio 2017)".

Nota: a quanto ho capito, le versioni di Vim con supporto per la modalità incolla tra parentesi dovrebbero proteggerti quando si incolla usando Ctrl- Shift- V(la maggior parte degli ambienti desktop GNU / Linux), Ctrl- V(MS Windows), Command- V(Mac OS X), Shift- Inserto un mouse middle-click.

analisi

Ho fatto alcuni test da una macchina desktop Lubuntu 16.04 più tardi, ma i miei risultati sono stati confusi e inconcludenti. Da allora mi sono reso conto che questo perché uso sempre lo schermo GNU ma risulta che lo schermo filtra la sequenza di escape utilizzata per abilitare / disabilitare la modalità incolla tra parentesi (esiste una patch ma sembra che sia stata inviata in un momento in cui il il progetto non veniva mantenuto attivamente). Nei miei test, la prova del concetto funziona sempre quando eseguo Vim tramite la schermata GNU, indipendentemente dal fatto che Vim o l'emulatore di terminale supportino la modalità incolla tra parentesi.

Ulteriori test sarebbero utili ma, finora, ho scoperto che il supporto per la modalità incolla tra parentesi da parte dell'emulatore di terminale blocca la mia Proof of Concept - purché lo schermo GNU non blocchi le sequenze di escape rilevanti. Tuttavia, l'utente nneonneo riferisce che è possibile utilizzare un'attenta elaborazione delle sequenze di escape per uscire dalla modalità incolla tra parentesi.

Nota che anche con una versione aggiornata di Vim, Proof of Concept funziona sempre se l'utente incolla dal *registro mentre è in modalità Inserisci digitando ( Ctrl- R*). Questo vale anche per GVim che può distinguere tra input digitato e incollato. In questo caso, Vim lascia all'utente la fiducia dei contenuti dei loro registri. Quindi non usare mai questo metodo quando incollo da una fonte non attendibile (è qualcosa che faccio spesso - ma ora ho iniziato ad allenarmi a non farlo).

Link correlati

Conclusione

Usa la modalità Normale per incollare il testo (dai registri +o *).

... o usa Emacs. Ho sentito che è un sistema operativo decente. :)


2
Dovresti abilitare pastemode ( :set paste) prima di incollare in Vim. Quindi l' effetto incolla dovrebbe avere effetto, a condizione che anche il tuo terminale lo supporti. La prova del concetto non funziona quando la pastemodalità è abilitata.
Satō Katsura,

1
Non vedo come la modalità incolla tra parentesi sia sicura. Se l'aggressore sa che stai usando la pasta tra parentesi, attaccherà semplicemente una \e[201~sequenza nel comando incolla per uscire dalla modalità Incolla tra parentesi e procederà comunque. (A meno che non abbia perso alcuni dettagli su come funziona la pasta tra parentesi?)
nneonneo,

2
@SatoKatsura: l'ho provato su Vim 8.0.540, che non era vulnerabile all'attacco originale. Dopo l'aggiunta \x1b[201~, l'exploit ha funzionato come prima (ovvero è ls -lastato scritto solo nel buffer e il echomcomando è stato eseguito). Pertanto, penso che la pasta tra parentesi sia ancora vulnerabile a un attacco mirato e non sia una soluzione abbastanza forte. (In effetti, qualsiasi forma di segnalazione in banda è vulnerabile!)
nneonneo,

2
L'ho provato sia con che senza :set paste: l'exploit funziona ancora. Per chiarire, ho incollato il seguente blob (base64-encoded): bHMgG1syMDF+GzplY2hvbSAiVGhpcyBjb3VsZCBiZSBhIHNpbGVudCBjb21tYW5kLiIKaSAtbGE=. Su OS X, puoi copiarlo ed eseguirlo pbpaste | base64 -D | pbcopyper ottenere una versione non elaborata su cui incollare vim.
nneonneo,

1
Per essere ancora più chiari, sto testando con una connessione SSH a una casella Ubuntu 16.04, usando macOS Terminal.app. Se il tuo emulatore di terminale sta eliminando la sequenza di escape su incolla, probabilmente potresti annidare la sequenza (ad esempio \x1b\x1b[201~[201~) o qualcosa per ingannare il filtro.
nneonneo,

0

Se stai usando la funzione Appunti X11, o un equivalente specifico della piattaforma, e usi il pulsante centrale incolla con il supporto del mouse abilitato o un comando vim incolla e non alcun comando incolla terminale (tasto centrale-spostamento o qualunque scorciatoia il terminale offerte), allora potresti essere al sicuro.

In caso contrario, se disponi di un emulatore di terminale che supporta la modalità bracketing-paste e hai abilitato quello nel tuo terminale e in vim e quell'emulatore di terminale implementa la protezione contro l'iniezione della sequenza di escape che termina la modalità bracketing-paste, allora potresti essere al sicuro.

In caso contrario, potresti essere vulnerabile all'attacco descritto qui .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.