Ist Vim immun gegen Copy-Paste-Angriffe?

112

Sie sollten niemals aus dem Internet in Ihr Terminal einfügen . Stattdessen sollten Sie in Ihren Texteditor einfügen, den Befehl überprüfen und dann in das Terminal einfügen.

Das ist in Ordnung, aber was ist, wenn Vim mein Texteditor ist? Könnte man einen Inhalt fälschen, der Vim in den Befehlsmodus versetzt und den böswilligen Befehl ausführt?

Adam Trhon
quelle
2
@ryekayo Ich weiß, wie man einen Befehl im Hintergrund ausführt. Die Frage ist eher, ob es möglich ist, vim vom Einfügemodus in den Befehlsmodus umzuschalten und dann etwas auszuführen
Adam Trhon,
3
Neuere Versionen von Vim haben Paste in Klammern, die diese Art von Angriffen verhindern soll.
Satō Katsura
2
@ EmilJeřábek Der Link im Beitrag gibt dir genug Gründe, lieber für die Hügel zu laufen, als das zu tun.
Satō Katsura
1
@ EmilJeřábek Da Sie versteckten Text mit Escape-Zeichen fälschen können, gehe ich davon aus, dass Sie auch Text mit EOF fälschen können. Dann könnte der versteckte Text so etwas enthalten /bin/bash ; EOF rm -rf ~. Wenn es in das Terminal eingefügt wird, wird die Bash gestartet, beendet und Ihr Zuhause gelöscht. Beim Einfügen in cat gab cat den Befehl aus, beendete cat und löschte Ihr Zuhause.
Adam Trhon

Antworten:

106

Kurze Antwort: In vielen Situationen ist Vim für diese Art von Angriff anfällig (beim Einfügen von Text im Einfügemodus).

Konzeptioneller Beweiß

Unter Verwendung des verlinkten Artikels als Ausgangspunkt konnte ich schnell eine Webseite mit folgendem Code erstellen, wobei HTML - Elemente und CSS verwendet wurden, um den mittleren Teil des Texts auszublenden, sodass nur ls -lader gelegentliche Betrachter (nicht der Betrachter) darauf zugreifen kann Quelle). Hinweis: Das ^[ist das Escape-Zeichen und das ^Mist das Wagenrücklaufzeichen. Stack Exchange bereinigt Benutzereingaben und schützt vor dem Ausblenden von Inhalten mithilfe von CSS, sodass ich den Proof of Concept hochgeladen habe .

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

Wenn Sie sich im Einfügemodus befinden und diesen Text in Terminal Vim einfügen (mit einigen Qualifikationen, siehe unten), wird dies angezeigt. ls -laWenn Sie jedoch den :messagesBefehl ausführen , werden die Ergebnisse des Befehls hidden Vim angezeigt.

Verteidigung

Um sich gegen diesen Angriff zu verteidigen, ist es am besten, im normalen Modus zu bleiben und mit "*poder einzufügen "+p. Im Normal - Modus, wenn p utting Text aus einem Register, der vollständige Text (einschließlich der versteckten Teil) eingefügt wird. Das gleiche passiert nicht im Einfügemodus (auch wenn :set paste) eingestellt wurde.

Eingeklammerter Einfügemodus

Neuere Versionen von Vim unterstützen den Einfügemodus in eckigen Klammern , der diese Art von Kopier-Einfüge-Angriff abschwächt. Sato Katsura hat klargestellt, dass "Unterstützung für eingeklammerte Paste in Vim 8.0.210 erschienen ist und zuletzt in Version 8.0.303 (veröffentlicht am 2. Februar 2017) behoben wurde".

Hinweis: Wie ich es verstehe, Versionen von Vim mit Unterstützung für klammert Paste - Modus sollten Sie schützen bei der Verwendung von Einfügen Ctrl- Shift- V( die meisten GNU / Linux - Desktop - Umgebungen), Ctrl- V(MS Windows), Command- V(Mac OS X), Shift- Insertoder eine Maus Mittelklick.

Testen

Ich habe später einige Tests auf einem Lubuntu 16.04-Desktopcomputer durchgeführt, aber meine Ergebnisse waren verwirrend und nicht schlüssig. Ich habe seitdem gemerkt, dass dies daran liegt, dass ich immer den GNU-Bildschirm verwende, aber es stellt sich heraus, dass der Bildschirm die Escape-Sequenz filtert, die zum Aktivieren / Deaktivieren des Einfügemodus in Klammern verwendet wird (es gibt einen Patch, aber es sieht so aus, als wäre er zu einem Zeitpunkt gesendet worden, als der Projekt wurde nicht aktiv gepflegt). In meinen Tests funktioniert der Proof of Concept immer, wenn Vim über den GNU-Bildschirm ausgeführt wird, unabhängig davon, ob Vim oder der Terminal-Emulator den Einfügemodus in Klammern unterstützen.

Weitere Tests wären nützlich, aber bisher stellte ich fest, dass die Unterstützung des Einfügemodus in Klammern durch den Terminalemulator meinen Proof of Concept blockiert - solange der GNU-Bildschirm die relevanten Escape-Sequenzen nicht blockiert. Benutzer nneonneo meldet jedoch, dass das sorgfältige Erstellen von Escape-Sequenzen verwendet werden kann, um den Modus für das Einfügen in eckigen Klammern zu beenden.

Beachten Sie, dass der Proof of Concept auch mit einer aktuellen Version von Vim immer funktioniert, wenn der Benutzer *im Einfügemodus durch Eingabe von ( Ctrl- R*) aus dem Register einfügt . Dies gilt auch für GVim, bei dem zwischen typisierten und eingefügten Eingaben unterschieden werden kann. In diesem Fall überlässt Vim es dem Benutzer, dem Inhalt seines Registers zu vertrauen. Verwenden Sie diese Methode also niemals, wenn Sie von einer nicht vertrauenswürdigen Quelle einfügen (das ist etwas, was ich häufig mache - aber ich habe jetzt begonnen, mich selbst dazu zu schulen, dies nicht zu tun).

Verwandte Links

Fazit

Verwenden Sie den normalen Modus, wenn Sie Text (aus den Registern +oder) *einfügen.

... oder benutze Emacs. Ich höre, es ist ein anständiges Betriebssystem. :)

Anthony Geoghegan
quelle
2
Sie müssen pastemode ( :set paste) aktivieren, bevor Sie Vim einfügen. Dann sollte die eingeklammerte Paste wirksam werden, sofern Ihr Terminal dies ebenfalls unterstützt. Ihr Proof of Concept funktioniert nicht, wenn der pasteModus aktiviert ist.
Satō Katsura
1
Ich sehe nicht, wie sicher der Einfügemodus in Klammern ist. Wenn der Angreifer weiß, dass Sie \e[201~das Einfügen in eckigen Klammern verwenden, setzt er einfach eine Sequenz in den Befehl Einfügen, um den Einfügemodus in eckigen Klammern zu beenden, und fährt trotzdem mit pwn fort. (Es sei denn, ich habe ein paar Details darüber übersehen, wie geklammerte Paste funktioniert?)
nneonneo
2
@SatoKatsura: Ich habe es mit Vim 8.0.540 versucht, das für den ursprünglichen Angriff nicht anfällig war. Nach dem Hinzufügen \x1b[201~funktionierte der Exploit wie zuvor (dh es wurde nur ls -lain den Puffer geschrieben und der echomBefehl ausgeführt). Daher denke ich, dass eingeklammerte Paste immer noch anfällig für einen gezielten Angriff ist und keine ausreichend starke Lösung darstellt. (In der Tat ist jede Form von In-Band-Signalisierung anfällig!)
Nneonneo
2
Ich habe es sowohl mit als auch ohne ausprobiert :set paste- der Exploit funktioniert immer noch. Um ganz klar zu sein, klebte ich den folgenden (Base64-kodiert) Blob: bHMgG1syMDF+GzplY2hvbSAiVGhpcyBjb3VsZCBiZSBhIHNpbGVudCBjb21tYW5kLiIKaSAtbGE=. Unter OS X können Sie das kopieren und ausführen pbpaste | base64 -D | pbcopy, um eine Rohversion zum Einfügen zu erhalten vim.
Nneonneo
1
Um es noch klarer zu machen, teste ich mit einer SSH-Verbindung zu einer Ubuntu 16.04-Box unter Verwendung der macOS Terminal.app. Wenn Ihr Terminal-Emulator die Escape-Sequenz beim Einfügen entfernt, können Sie möglicherweise die Sequenz (z. B. \x1b\x1b[201~[201~) oder etwas verschachteln , um den Filter zu täuschen.
Nneonneo
0

Wenn Sie die X11-Zwischenablage-Funktion oder ein plattformspezifisches Äquivalent verwenden und das Einfügen mit mittlerer Taste und aktivierter Mausunterstützung oder einen Befehl zum Einfügen von VIM und nicht einen Befehl zum Einfügen von Terminals (Umschalt-Mitteltaste oder eine beliebige Verknüpfung zum Terminal) verwenden Angebote), dann könnten Sie sicher sein.

Wenn nicht, haben Sie einen Terminalemulator, der den Modus für das Einfügen in Klammern unterstützt, und Sie haben diesen in Ihrem Terminal und in vim aktiviert. Dieser Terminalemulator implementiert einen Schutz gegen das Einfügen der Escape-Sequenz, die den Modus für das Einfügen in Klammern beendet. dann bist du vielleicht in Sicherheit.

Wenn nicht, sind Sie möglicherweise anfällig für den hier beschriebenen Angriff .

sh1
quelle