安全的启用本地变量的方法?


13

大约18年前,我从一个朋友那里继承了.emacs文件。中间隐藏着以下关于此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不让我受到任意代码注入攻击的情况下做有用的事情?

Answers:


13

18年前,您担心是正确的。但是时间在前进。从Emacs 22开始,有一个不错的内置机制可以将安全的局部变量列入白名单。详细信息记录在Emacs Lisp手册中。最重要的方面是:

  • 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认为安全的变量,而忽略其余变量,但是您可能会错过这种方式。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.