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 -la
sia 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 -la
ma se esegui il :messages
comando, puoi vedere i risultati del comando Vim nascosto.
Difesa
Per difendersi da questo attacco è meglio rimanere in modalità Normale e incollare usando "*p
o "+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. :)