Безопасный способ `enable-local-variable`?

13

Я унаследовал свой файл .emacs от друга около 18 лет назад. Посередине находится зловещий комментарий, предупреждающий о последствиях безопасности для этой enable-local-variablesфункции:

;; Date: Wed, 7 Dec 1994 11:57:50 -0600
;; From: blob@syl.dl.nec.com (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 '())

Так что я никогда не использовал эту local-variablesфункцию, хотя кажется, что она может быть довольно полезной. Есть ли способ сделать enable-local-variablesчто-то полезное, не подвергая меня произвольным атакам с использованием кода?

Блуждающая логика
источник

Ответы:

13

18 лет назад ты был прав, что беспокоился. Но время шло. Начиная с Emacs 22, существует неплохой встроенный механизм для внесения в белый список безопасных локальных переменных. Подробности документированы в руководстве по Emacs Lisp . Наиболее важные аспекты:

  • Авторы Lisp могут объявлять безопасные значения для каждой переменной. Это белый список: если программист на Лиспе не сделал ничего особенного, все значения считаются небезопасными.
  • Если enable-local-variablesустановлено t(по умолчанию), Emacs автоматически установит безопасные значения и запросит подтверждение, если файл пытается установить небезопасное значение. Как только пользователь утвердит значение для данной переменной, оно будет автоматически записано, и Emacs больше не будет запрашивать одно и то же значение для той же переменной.
  • Если enable-local-variablesустановлено значение :safe, Emacs автоматически установит безопасные значения и проигнорирует другие.

Таким образом, вы можете оставить настройку по умолчанию, если не возражаете против запроса, или использовать ее (setq enable-local-variables :safe)для получения общих преимуществ (стиль отступа, формат отметки времени и т. Д.) Без риска и без вмешательства пользователя.

Жиль "ТАК - перестань быть злым"
источник
(Для полноты / на случай, если кому-то интересно: Emacs 22 был выпущен в 2007 году.)
ShreevatsaR
9

Emacs довольно безопасен, когда дело доходит до локальных переменных. На самом деле он ничего не оценивает для локальных переменных файлов или каталогов, он только анализирует синтаксис Lisp. Кроме того, переменная должна быть объявлена ​​«безопасной», прежде чем она будет установлена ​​Emacs, и это объявление также включает предикат. Таким образом, переменная может сказать «файл может установить это, но только если это строка».

Это означает, что вы можете безопасно включить локальные переменные. На самом деле вы можете просто оставить значение по умолчанию t- Emacs спросит вас, следует ли ему устанавливать переменные, которые он не считает безопасными, и вы можете сначала проверить их.

Убедитесь , что вы не установите эту переменную :all, и сделать взгляд на значения переменных , прежде чем устанавливать их , если Emacs спросит вас. Вы можете использовать :safeтолько те переменные, которые Emacs считает безопасными, и игнорировать остальные, но вы можете пропустить некоторые вещи таким образом.

Йорген Шефер
источник