Apakah Vim kebal terhadap serangan copy-paste?

112

Anda tidak boleh menempel dari web ke terminal Anda . Sebaliknya, Anda harus menempel ke editor teks Anda, periksa perintah dan kemudian tempel ke terminal.

Tidak apa-apa, tetapi bagaimana jika Vim adalah editor teks saya? Bisakah seseorang memalsukan konten yang mengalihkan Vim ke mode perintah dan menjalankan perintah jahat?

Adam Trhon
sumber
2
@ryekayo Saya tahu cara menjalankan perintah di latar belakang. Pertanyaannya lebih lanjut tentang apakah mungkin untuk beralih vim dari mode insert ke mode perintah dan kemudian menjalankan apa pun
Adam Trhon
3
Versi terbaru Vim telah di-paste, yang seharusnya mencegah serangan semacam ini.
Satō Katsura
2
@ EmilJeřábek Tautan di pos memberi Anda cukup alasan untuk lari ke bukit daripada melakukannya.
Satō Katsura
1
@ EmilJeřábek Karena Anda dapat memalsukan teks tersembunyi dengan karakter Escape, saya berasumsi Anda juga dapat memalsukan teks dengan EOF. Maka teks yang disembunyikan dapat berisi sesuatu sebagai /bin/bash ; EOF rm -rf ~. Ketika disisipkan ke terminal itu akan mulai bash, menghentikannya dan kemudian menghapus rumah Anda. Ketika disisipkan ke kucing, itu akan membiarkan kucing mencetak perintah, mengakhiri kucing dan menghapus rumah Anda.
Adam Trhon

Jawaban:

106

Jawaban singkat: Dalam banyak situasi, Vim rentan terhadap serangan semacam ini (saat menempelkan teks dalam mode Sisipkan).

Bukti dari konsep

Menggunakan artikel yang ditautkan sebagai titik awal, saya dapat dengan cepat membuat halaman web dengan kode berikut, menggunakan elemen rentang HTML dan CSS untuk menyembunyikan bagian tengah teks sehingga hanya ls -ladapat dilihat oleh pengunjung biasa (tidak melihat sumber). Catatan: ^[adalah karakter Escape dan ^Madalah karakter carriage return. Stack Exchange membersihkan input pengguna dan melindungi dari penyembunyian konten menggunakan CSS jadi saya telah mengunggah bukti konsep .

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

Jika Anda berada dalam mode Sisipkan dan menempelkan teks ini ke terminal Vim (dengan beberapa kualifikasi, lihat di bawah) Anda akan melihat ls -latetapi jika Anda menjalankan :messagesperintah, Anda dapat melihat hasil dari perintah Vim tersembunyi.

Pertahanan

Untuk bertahan melawan serangan ini, yang terbaik adalah tetap dalam mode Normal dan menempelkan menggunakan "*patau "+p. Dalam mode Normal, ketika p mengucapkan teks dari register, teks lengkap (termasuk bagian tersembunyi) ditempel. Hal yang sama tidak terjadi pada mode Sisipkan (bahkan jika :set paste) telah ditetapkan.

Mode pasta braket

Versi terbaru Vim mendukung mode tempel kurung yang memitigasi jenis serangan salin-tempel ini. Sato Katsura telah mengklarifikasi bahwa "Dukungan untuk pasta braket muncul di Vim 8.0.210, dan yang terbaru diperbaiki dalam versi 8.0.303 (dirilis pada 2 Februari 2017)".

Catatan: Seperti yang saya pahami, versi Vim dengan dukungan untuk mode tempel kurung akan melindungi Anda saat menempel menggunakan Ctrl- Shift- V(sebagian besar lingkungan desktop GNU / Linux), Ctrl- V(MS Windows), Command- V(Mac OS X), Shift- Insertatau mouse klik tengah.

Pengujian

Saya melakukan beberapa pengujian dari mesin desktop Lubuntu 16.04 kemudian, tetapi hasil saya membingungkan dan tidak meyakinkan. Saya sejak menyadari bahwa ini adalah karena saya selalu menggunakan layar GNU tetapi ternyata layar menyaring urutan melarikan diri yang digunakan untuk mengaktifkan / menonaktifkan mode tempel kurung (ada tambalan tetapi sepertinya itu disampaikan pada saat ketika proyek tidak dipelihara secara aktif). Dalam pengujian saya, bukti konsep selalu berfungsi ketika menjalankan Vim melalui layar GNU, terlepas dari apakah Vim atau terminal emulator mendukung mode tempel kurung.

Pengujian lebih lanjut akan bermanfaat tetapi, sejauh ini, saya menemukan bahwa dukungan untuk mode rekatkan kurung oleh emulator terminal memblokir Bukti Konsep saya - selama layar GNU tidak memblokir urutan pelarian yang relevan. Namun, pengguna nneonneo melaporkan bahwa pembuatan urutan escape yang hati-hati dapat digunakan untuk keluar dari mode tempel di kurung.

Perhatikan bahwa bahkan dengan versi terbaru Vim, Bukti Konsep selalu berfungsi jika pengguna menempel dari *register saat dalam mode Sisipkan dengan mengetik ( Ctrl- R*). Ini juga berlaku untuk GVim yang dapat membedakan antara input yang diketik dan yang ditempel. Dalam hal ini, Vim menyerahkannya kepada pengguna untuk mempercayai konten dari konten register mereka. Jadi jangan pernah menggunakan metode ini ketika menempelkan dari sumber yang tidak terpercaya (ini adalah sesuatu yang sering saya lakukan - tapi sekarang saya sudah mulai melatih diri untuk tidak melakukannya).

Tautan yang berhubungan

Kesimpulan

Gunakan mode Normal saat menempelkan teks (dari +atau *mendaftar).

... atau gunakan Emacs. Saya dengar ini sistem operasi yang bagus. :)

Anthony Geoghegan
sumber
2
Anda seharusnya mengaktifkan pastemode ( :set paste) sebelum menempel di Vim. Kemudian braket tempel akan berlaku, asalkan terminal Anda juga mendukungnya. Bukti konsep Anda tidak berfungsi saat pastemode diaktifkan.
Satō Katsura
1
Saya tidak melihat bagaimana mode tempel kurung aman. Jika penyerang tahu bahwa Anda menggunakan pasta yang diberi tanda kurung, mereka hanya akan menempelkan \e[201~urutan pada perintah tempel untuk keluar dari mode tempel tanda kurung, dan tetap melanjutkan ke pwn Anda. (Kecuali saya melewatkan beberapa detail tentang cara kerja braket tempel?)
nneonneo
2
@SatoKatsura: Saya mencobanya di Vim 8.0.540, yang tidak rentan terhadap serangan aslinya. Setelah menambahkan \x1b[201~, exploit berfungsi seperti sebelumnya (yaitu hanya ls -laditulis ke buffer dan echomperintah dieksekusi). Oleh karena itu, saya berpikir bahwa braket tempel masih rentan terhadap serangan yang ditargetkan, dan bukan solusi yang cukup kuat. (Memang, segala bentuk pensinyalan in-band rentan!)
nneonneo
2
Saya mencoba keduanya dengan dan tanpa :set paste- eksploitasi masih bekerja. Untuk menjadi jelas, saya disisipkan berikut (base64-encoded) gumpalan: bHMgG1syMDF+GzplY2hvbSAiVGhpcyBjb3VsZCBiZSBhIHNpbGVudCBjb21tYW5kLiIKaSAtbGE=. Pada OS X, Anda dapat menyalinnya, menjalankan pbpaste | base64 -D | pbcopyuntuk mendapatkan versi mentah untuk ditempel vim.
nneonneo
1
Untuk lebih jelas, saya sedang menguji dengan koneksi SSH ke kotak Ubuntu 16.04, menggunakan macOS Terminal.app. Jika emulator terminal Anda melepaskan urutan escape pada paste, Anda mungkin bisa membuat sarang urutan (misalnya \x1b\x1b[201~[201~) atau sesuatu untuk menipu filter.
nneonneo
0

Jika Anda menggunakan fitur papan klip X11, atau yang setara dengan platform khusus, dan Anda menggunakan tempel tombol tengah dengan dukungan tetikus diaktifkan atau perintah tempel vim dan bukan perintah tempel terminal (tombol-tengah-shift atau apa pun pintasan terminal) penawaran) maka Anda mungkin aman.

Jika tidak, maka jika Anda memiliki emulator terminal yang mendukung mode tempel kurung, dan Anda telah mengaktifkannya di terminal dan di vim, dan bahwa emulator terminal menerapkan perlindungan terhadap injeksi urutan pelarian yang mengakhiri mode tempel kurung, maka kamu mungkin aman.

Jika tidak, maka Anda mungkin rentan terhadap serangan yang dijelaskan di sini .

sh1
sumber