Unterdrücken Sie Wiederherstellungsdateien beim Bearbeiten vertraulicher Dateien in vi, nvi und vim

Unterdrücken Sie Wiederherstellungsdateien beim Bearbeiten vertraulicher Dateien in vi, nvi und vim

Ich schreibe eine Anwendung, die eine verschlüsselte Datenbank verwaltet, die äußerst vertrauliche Informationen wie kryptografische Schlüssel und Passwörter enthält. Die Anwendung ist paranoid, was die Verwendung von Memlock, das Blockieren von Ptrace, das Verhindern von Coredumps usw. angeht, verfügt jedoch über einen Befehl, mit dem der Datenbankbesitzer den Inhalt der Datenbank bearbeiten kann. Dieser Befehl schreibt die gesamte Datenbank in eine temporäre Datei im menschenlesbaren ASCII-Format und ermöglicht dem Benutzer die Bearbeitung. Insbesondere erstellt er eine neue Datei in einem neu erstellten Verzeichnis /tmp/XXXXXXXX/(wobei /tmp idealerweise ein Speicherdateisystem ist) und führt dann den bevorzugten Editor des Benutzers für die Datei aus. Wenn der Editor beendet wird, analysiert die Anwendung den Dateiinhalt und vernichtet die Datei und alles andere darunter, /tmp/XXXXXXXX/bevor sie das Verzeichnis endgültig löscht.

Leider funktioniert diese Strategie mit keiner der vi-Varianten besonders gut, da der Editor Kopien der Datei in /var/tmp/vi.recover schreibt, wo sie wahrscheinlich auf der Festplatte verbleiben, selbst nachdem vi sie gelöscht hat. (Die Daten enthalten wertvolle private Schlüssel, nach denen man leicht eine ganze Rohpartition durchsuchen könnte.) Ich suche nach einer allgemeinen Möglichkeit, diese Wiederherstellungsdateien zu unterdrücken oder sie zumindest nach zu verschieben /tmp/XXXXXXXX/.

Meine ideale Lösung würde für die meisten vi-Varianten funktionieren, aber ich bin auch zufrieden damit, die EDITORUmgebungsvariable zu analysieren und für jeden Editor etwas anderes zu tun. Wenn Sie also eine Lösung haben, die für vim funktioniert, aber nicht für die anderen, ist das zumindest ein guter Anfang. (Ich habe vim bereits als Spezialfall so eingerichtet, dass der Editor bei einem Analysefehler bis zur genauen Spaltennummer erneut geöffnet wird, während andere vi-Varianten nur bis zur entsprechenden Zeile geöffnet werden können.)

Da es sich um eine Anwendung handelt, die an andere Personen verteilt werden soll, kann ich das Problem nicht dadurch lösen, dass ich die .exrc- oder .vimrc-Dateien anderer Benutzer bearbeite. Im Notfall könnte ich vermutlich die HOME-Umgebungsvariable ändern, bevor ich den Editor ausführe, und eine temporäre .vimrc-Datei erstellen, die die echte des Benutzers mit einigen Befehlen zur Unterdrückung der Wiederherstellung zusammenführt. Ich würde jedoch eine Befehlszeilen- oder Kommentarlösung bei weitem bevorzugen.

Das Beste, was ich einem minimalen funktionierenden Beispiel geben kann, ist, mitzuteilen, was ich für Emacs mache. Dabei füge ich den folgenden Kommentar an das Ende der Datei an:

# Local Variables:
# make-backup-files: nil
# auto-save-default: nil
# End:

Am einfachsten ist zwar eine Befehlszeilenoption, aber es wäre auch toll, wenn ein entsprechender Kommentar für vim oder eine der anderen vi-Varianten funktionieren würde.

aktualisieren:

Nach einigen Experimenten mit strace scheint der folgende Befehlkönntetue, was ich für vim will:

vim -n -c 'set viminfo=' /tmp/XXX/secret.ini

Es funktioniert jedoch nicht mit --cmd, was die vorgeschlagene Option war, sondern nur mit -c. Außerdem verstehe ich nicht wirklich, was es -ntut, habe aber gerade gesehen, dass auf der Manpage steht, dass es die Wiederherstellung unterbricht. Ich würde mich also trotzdem über eine Antwort von jemandem freuen, der sich mit Vim auskennt, falls das überhaupt funktioniert. Und natürlich sind Lösungen für die anderen vi-Varianten willkommen.

Aktualisierung 2:

Die Umgebungsvariable EXINITkönntefunktioniert für vi und nvi, wenn ich es auf einstelle EXINIT=set dir=/tmp/XXX|set recdir=. nvi gibt beim Start eine Warnung über eine fehlende Wiederherstellung aus, was ermutigend ist, während vi Dateien zwar im Dateisystem ablegt, diese sich aber zumindest in /tmp befinden, was häufig ein Speicherdateisystem ist.

Antwort1

Sie vimkönnen den Speicherort der Wiederherstellungsdatei mit demdirectoryMöglichkeit.

set directory=/tmp/XXXXXXXX

Dies kann der Befehlszeile für eine einzelne Instanz wie diese hinzugefügt werden

mkdir -m700 /tmp/xyz
vim --cmd "set directory=/tmp/xyz" /path/to/secure.file

Antwort2

Mir fallen mehrere Möglichkeiten ein, den Benutzern einen vernünftigen Editor mit möglichst viel Paranoia zu bieten. Da es sich hier um eine sicherheitsrelevante Anwendung handelt, nehmen Sie bitte alles hier mit Vorsicht zur Kenntnis und korrigieren Sie etwaige Fehler.

Ich schlage vor, eine dieser Optionen als Standard zu verwenden, es den Benutzern jedoch auf klar dokumentierte Weise zu ermöglichen, ihre eigene vimOption zu verwenden, damit sie nicht versuchen, Daten aus der gesperrten Umgebung zu kopieren vi.

Außerdem könnten einige dieser Vorschläge (insbesondere das Herumspielen mit LD_PRELOAD) in Ihrer Umgebung völlig inakzeptabel, deaktiviert (soweit möglich) oder eingeschränkt sein.

Hier sind einige sich möglicherweise gegenseitig ausschließende Optionen in keiner bestimmten Reihenfolge.

  1. Führen Sie den Editor als nicht privilegierter Benutzer aus, wie sudoedites der Fall ist.
  2. Versehen Sie Ihren eigenen Editor mit Funktionen, die Sie nicht gepatcht oder herauskompiliert haben möchten
  3. Abfangen von Aufrufen problematischer libcFunktionen mit LD_PRELOAD.
  4. überspringen Sie den Benutzer .vimrcvollständig.

1) Führen Sie den Editor als nicht privilegierter Benutzer aus

Wenn Sie die Möglichkeit haben, zusätzliche Benutzer zu erstellen oder von Benutzern der Software verlangen können, einen dedizierten, nicht privilegierten Benutzer zu erstellen, können Sie denselben Trick verwenden wie sudoeditbei: Erstellen Sie eine temporäre Datei und lassen Sie den Benutzer diese als nicht privilegierten Benutzer bearbeiten. Ich weiß nicht, wie ich garantieren kann, dass die temporäre Datei niemals die Festplatte berührt.

Es hört sich so an, als ob Sie bereits etwas Ähnliches tun, jedoch ohne den nicht privilegierten Benutzer.

Hier ist einSuperuser-Antwort erklärt, wie sudoeditfunktioniert.

Außerdem würde ich empfehlen, zu studieren, wie die sudoeditFunktionalität sudofunktioniert.hier ist ein relevanter Code.

2) Bündeln Sie Ihr eigenes vi.

nviist klein und unter BSD-Lizenz, Sie können es möglicherweise patchen, damit es keine Auslagerungsdateien erstellt oder ohne Auslagerungsdatei-Unterstützung kompiliert wird. Ich weiß es eigentlich nicht, denn als ich das letzte Mal versucht habe, es zu erstellen, nvikonnte ich nicht herausfinden, wie ich die alte Version von Autotools dazu bringen kann, OS X zu erkennen.

Als Teil des Builds Ihres Hauptprodukts können Sie den Hash Ihrer nviausführbaren Datei nehmen und ihn als Build-Zeitkonstante einbacken.

Emacs-Benutzer können eine Kopie von erhalten mg. Hier ist eineLink zu einer Gabel von mg. Die Variante, die tatsächlich im Quellcode von OpenBSD vorhanden ist, ist ISC-lizenziert. Sie müssen sie möglicherweise patchen, da sie manchmal Shells ausgibt (beispielsweise zur Interaktion mit cscope).

Nano-Benutzer haben meiner Meinung nach Pech.

3)LD_PRELOAD

Verwenden Sie LD_PRELOADes, um ld.so(unter Linux) das Laden eines Shims anzuweisen, Aufrufe von libcFunktionen wie fwrite, fork, usw. abzufangen.

4) Überspringen Sie die Konfigurationsoptionen des Benutzers vimund führen Sie stattdessen Ihre eigene Minimalkonfiguration aus.

Dies ist die sicherste Befehlszeile, vimdie mir einfällt, aber ich habe vielleicht etwas übersehen. Ich habe es nur herausgefunden, als ich die Manpage von Vim gelesen und mir meine angesehen habe .vimrc.

  • -u NONE-- keine Initialisierung
  • -i NONE-- NEIN.viminfo
  • -U NONE- keine Initialisierung ( gvimaber man kann nie vorsichtig genug sein)
  • -Z -- Beginnen Sie, als ob Sie es argv[0]wären rvim.
  • set nocompatible-- sei nicht -kompatibel vi.
  • set backspace=indent,eol,start-- die Rücktaste intuitiver gestalten
  • set noexrc-- wahrscheinlich überflüssig, liest keine rcDateien.
  • set secure– nein autocmd, nein shell, nein write, Anzeige – mapBefehle.
  • set nobackup-- keine Backup-Optionen
  • set laststatus=2-- Zeigen Sie die Datei an, die Sie bearbeiten

Hier ist also die Befehlszeile, die alles zusammenfügt.

vim -n -u NONE -i NONE -U NONE -Z \
        --cmd "set nocompatible | set backspace=indent,eol,start | set noexrc | set secure | set nomodeline | set nobackup | set laststatus=2" \
         --

verwandte Informationen