Sichere Möglichkeit, lokale Variablen zu aktivieren?

13

Ich habe meine .emacs-Datei vor ungefähr 18 Jahren von einem Freund geerbt. In der Mitte ist der folgende ominöse Kommentar vergraben, der vor den Sicherheitsauswirkungen des enable-local-variablesFeatures warnt :

;; Date: Wed, 7 Dec 1994 11:57:50 -0600
;; From: [email protected] (David Blob)
;; Subject: Self-extracting emacs elisp code
;;
;; With all this talk about self extracting mail "viruses", a friend
;; showed me that in emacs (which I use to read mail, along with vm)
;; has the ability to self-extract elisp code. This feature seems to
;; be turned on by default, and it not only applies to mail read with
;; emacs, but rather every file visited (when the feature is on, of
;; course).
;;
;; The way it works is by having a line which reads "Local Variables:"
;; followed by the lisp variables you would like to set...well, it may
;; seem petty, but you can execute programs, make connections and much
;; more through cleverly written elisp code contained within.
;;
;; It's simple to turn off, at any rate...
;;
;; (setq enable-local-variables  f) ;; turns off feature  (in emacs 19)
;; (setq enable-local-variables  1) ;; makes it ask first (in emacs 19)
;; (setq inhibit-local-variables t) ;; turns off feature  (in emacs 18)
;;
;; Anyhow, I think the risks here speak for themselves...
;;
(setq enable-local-variables '())

Ich habe die local-variablesFunktion also noch nie benutzt , obwohl es so aussieht, als ob sie ziemlich nützlich sein könnte. Gibt es eine Möglichkeit enable-local-variables, etwas Nützliches zu tun, ohne mich willkürlichen Code-Injection-Angriffen auszusetzen?

Wandering Logic
quelle

Antworten:

13

Vor 18 Jahren hatten Sie Recht, besorgt zu sein. Aber die Zeit ist vergangen. Seit Emacs 22 gibt es einen angemessenen Mechanismus, um sichere lokale Variablen auf die Whitelist zu setzen. Die Details sind im Emacs Lisp- Handbuch dokumentiert. Die wichtigsten Aspekte sind:

  • Lisp-Autoren können für jede Variable sichere Werte deklarieren. Dies ist eine Whitelist: Wenn der Lisp-Programmierer nichts Besonderes getan hat, gelten alle Werte als unsicher.
  • Wenn auf enable-local-variablesgesetzt istt (Standardeinstellung) gesetzt ist, legt Emacs automatisch sichere Werte fest und fordert zur Bestätigung auf, wenn eine Datei versucht, einen unsicheren Wert festzulegen. Sobald der Benutzer einen Wert für eine bestimmte Variable genehmigt hat, wird dieser automatisch aufgezeichnet und Emacs fragt nicht erneut nach dem gleichen Wert für dieselbe Variable.
  • Wenn auf enable-local-variablesgesetzt, :safesetzt Emacs automatisch sichere Werte und ignoriert die anderen.

So können Sie die Standardeinstellung beibehalten, wenn Sie nicht dazu aufgefordert werden, oder (setq enable-local-variables :safe)die allgemeinen Vorteile (Einrückungsstil, Zeitstempelformat usw.) ohne Risiko und ohne Eingriffe in die Benutzeroberfläche nutzen.

Gilles 'SO - hör auf böse zu sein'
quelle
(Der Vollständigkeit
halber
9

Emacs ist ziemlich sicher, wenn es um lokale Variablen geht. Tatsächlich wird nichts für datei- oder verzeichnislokale Variablen ausgewertet, sondern nur die Lisp-Syntax analysiert. Außerdem muss eine Variable als "sicher" deklariert werden, bevor sie von Emacs gesetzt wird, und diese Deklaration enthält auch ein Prädikat. Eine Variable kann also sagen, "eine Datei kann dies festlegen, aber nur, wenn es sich um eine Zeichenfolge handelt".

Dies bedeutet, dass Sie lokale Variablen sicher aktivieren können. Sie können den Standardwert von einfach beibehalten t- Emacs fragt Sie, ob Variablen gesetzt werden sollen, die als nicht sicher eingestuft werden, und Sie können diese zuerst untersuchen.

Stellen Sie sicher, dass Sie diese Variable nicht auf setzen :all, und überprüfen Sie zuerst die Werte der Variablen, bevor Sie sie setzen, wenn Emacs Sie dazu auffordert . Sie können :safenur Variablen festlegen, die Emacs als sicher erachtet, und den Rest ignorieren. Auf diese Weise können Sie jedoch einige Dinge übersehen.

Jorgen Schäfer
quelle