Является ли Vim невосприимчивым к атаке копирования-вставки?


112

Вы никогда не должны вставлять из Интернета в свой терминал . Вместо этого вы должны вставить в текстовый редактор, проверить команду, а затем вставить в терминал.

Это нормально, но что, если Vim - мой текстовый редактор? Можно ли подделать контент, который переключает Vim в командный режим и выполняет вредоносную команду?


2
@ryekayo Я знаю, как запустить команду в фоновом режиме. Вопрос больше в том, можно ли переключить vim из режима вставки в командный режим и затем выполнить что-либо
Адам Трон

3
В последних версиях Vim есть вставка в скобках, которая должна предотвращать подобные атаки.
Satō

2
@ EmilJeřábek Ссылка в посте дает вам достаточно причин, чтобы бежать за холмы, а не делать это.
Satō

1
@ EmilJeřábek Поскольку вы можете подделывать скрытый текст с помощью символа Escape, я предполагаю, что вы также можете подделывать текст с помощью EOF. Тогда скрытый текст может содержать что-то как /bin/bash ; EOF rm -rf ~. При вставке в терминал он запускает bash, завершает его, а затем удаляет ваш дом. При вставке в cat, кошка может распечатать команду, завершить cat и удалить ваш дом.
Адам Трон

Ответы:


106

Краткий ответ: во многих ситуациях Vim уязвим для такого рода атак (при вставке текста в режиме вставки).

Доказательство концепции

Используя связанную статью в качестве отправной точки, я смог быстро создать веб-страницу со следующим кодом, используя элементы span HTML и CSS, чтобы скрыть среднюю часть текста, чтобы ls -laона была видна только случайному зрителю (не просматривая источник). Примечание: ^[символ Escape и символ ^Mвозврата каретки. Stack Exchange очищает пользовательский ввод и защищает от сокрытия содержимого с помощью CSS, поэтому я загрузил подтверждение концепции .

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

Если бы вы были в режиме вставки и вставили этот текст в терминал Vim (с некоторыми квалификаторами, см. Ниже), вы увидите, ls -laно если вы запустите :messagesкоманду, вы увидите результаты скрытой команды Vim.

Оборона

Чтобы защититься от этой атаки, лучше оставаться в обычном режиме и вставлять, используя "*pили "+p. В нормальном режиме, когда р Utting текст из регистра, полный текст (включая скрытую часть) приклеивается. Этого не происходит в режиме вставки (даже если :set paste).

Режим вставки в скобках

Последние версии Vim поддерживают режим вставки в скобках, который уменьшает этот тип атаки копирования-вставки. Сато Кацура пояснил, что «Поддержка вставки в скобках появилась в Vim 8.0.210 и была исправлена ​​в версии 8.0.303 (выпущена 2 февраля 2017 г.)».

Примечание: Как я понимаю, версии Vim с поддержкой режима в квадратных скобках паста должна защитить вас при вставке с помощью Ctrl- Shift- V(большинство настольных сред GNU / Linux), Ctrl- V(MS Windows), Command- V(Mac OS X), Shift- Insertили мышь щелчок средней кнопкой мыши.

тестирование

Позже я провел некоторое тестирование на настольном компьютере Lubuntu 16.04, но мои результаты были запутанными и неубедительными. С тех пор я понял, что это потому, что я всегда использую экран GNU, но оказывается, что экран фильтрует escape-последовательность, используемую для включения / отключения режима вставки в скобках ( патч есть, но похоже, что он был представлен в то время, когда проект активно не обслуживался). В моем тестировании проверка концепции всегда работает при запуске Vim через экран GNU, независимо от того, поддерживает ли Vim или эмулятор терминала режим вставки в скобках.

Дальнейшее тестирование было бы полезно, но пока я обнаружил, что поддержка режима вставки в квадратных скобках эмулятором терминала блокирует мое подтверждение концепции - до тех пор, пока экран GNU не блокирует соответствующие escape-последовательности. Однако пользователь nneonneo сообщает, что для выхода из режима вставки в скобках можно использовать тщательную обработку escape-последовательностей.

Обратите внимание, что даже в обновленной версии Vim Proof of Concept всегда работает, если пользователь вставляет данные из *регистра в режиме вставки, набирая ( Ctrl- R*). Это также относится к GVim, который может различать типизированный и вставленный ввод. В этом случае Vim оставляет за пользователем право доверять содержимому их содержимого регистра. Так что никогда не используйте этот метод при вставке из ненадежного источника (это то, что я часто делаю - но сейчас я начал учиться не делать этого).

Ссылки по теме

Заключение

Используйте обычный режим при вставке текста (из регистров +или *).

... или используйте Emacs. Я слышал, что это достойная операционная система. :)


2
Вы должны включить pastemode ( :set paste) перед вставкой в ​​Vim. Затем вступит в силу вставка в скобках при условии, что ваш терминал также поддерживает ее. Ваше подтверждение концепции не работает, когда pasteвключен режим.
Satō

1
Я не вижу, насколько безопасен режим вставки в скобках. Если злоумышленник узнает, что вы используете вставку в скобках, он просто вставит \e[201~последовательность в команду вставки, чтобы выйти из режима вставки в скобках, и в любом случае продолжит отбивать вас. (Разве я пропустил некоторые подробности о том, как работает
nneonneo

2
@SatoKatsura: я попробовал это на Vim 8.0.540, который не был уязвим для первоначальной атаки. После добавления \x1b[201~эксплойт функционировал как прежде (то есть ls -laбыл записан только в буфер и echomкоманда была выполнена). Поэтому я думаю, что вставленная в скобки паста все еще уязвима для целевой атаки и не является достаточно сильным решением. (Действительно, любая форма внутриполосной сигнализации уязвима!)
nneonneo

2
Я пробовал как с, так и без :set paste- эксплойт все еще работает. Чтобы быть совершенно ясно, я вставил следующий ( в кодировке base64) блоб: bHMgG1syMDF+GzplY2hvbSAiVGhpcyBjb3VsZCBiZSBhIHNpbGVudCBjb21tYW5kLiIKaSAtbGE=. В OS X вы можете скопировать его, запустить, pbpaste | base64 -D | pbcopyчтобы получить необработанную версию для вставки vim.
nneonneo

1
Чтобы быть еще более понятным, я тестирую SSH-соединение с коробкой Ubuntu 16.04, используя macOS Terminal.app. Если ваш эмулятор терминала удаляет escape-последовательность при вставке, вы, вероятно, могли бы вложить последовательность (например \x1b\x1b[201~[201~) или что-то , что могло бы обмануть фильтр.
nneonneo

0

Если вы используете функцию буфера обмена X11 или эквивалент для конкретной платформы и используете вставку средней кнопкой с включенной поддержкой мыши или команду vim paste, а не любую команду вставки терминала (shift-middle-button или что-либо другое, вызывающее ярлыки на терминале) предложения) тогда вы можете быть в безопасности.

Если нет, то, если у вас есть эмулятор терминала, который поддерживает режим вставки в скобки, и вы включили его в своем терминале и в vim, и этот эмулятор терминала реализует защиту от внедрения escape-последовательности, которая завершает режим вставки в скобки, тогда вы можете быть в безопасности.

Если нет, то вы можете быть уязвимы для атаки, описанной здесь .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.