Maneira segura de `enable-local-variables`?

13

Eu herdei meu arquivo .emacs de um amigo há cerca de 18 anos. Enterrado no meio, está o seguinte comentário ameaçador sobre as implicações de segurança do enable-local-variablesrecurso:

;; 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 '())

Então, eu nunca usei o local-variablesrecurso, mesmo que pareça ser bastante útil. Existe uma maneira de enable-local-variablesfazer algo útil sem me expor a ataques arbitrários de injeção de código?

Lógica Errante
fonte

Respostas:

13

18 anos atrás, você estava certo em estar preocupado. Mas o tempo passou. Desde o Emacs 22, existe um mecanismo embutido decente para colocar na lista branca variáveis ​​locais seguras. Os detalhes estão documentados no manual Emacs Lisp . Os aspectos mais importantes são:

  • Os autores do Lisp podem declarar valores seguros para cada variável. Esta é uma lista de permissões: se o programador Lisp não fez nada de especial, todos os valores são considerados inseguros.
  • Se enable-local-variablesestiver definido como t(o padrão), o Emacs definirá automaticamente valores seguros e solicitará confirmação se um arquivo tentar definir um valor não seguro. Depois que o usuário aprova um valor para uma determinada variável, isso é registrado automaticamente e o Emacs não pergunta novamente sobre o mesmo valor para a mesma variável.
  • Se enable-local-variablesestiver definido como :safe, o Emacs definirá automaticamente valores seguros e ignorará os outros.

Portanto, você pode manter a configuração padrão se não se importar em ser avisado ou usar (setq enable-local-variables :safe)para obter os benefícios comuns (estilo de recuo, formato de carimbo de data e hora, etc.) sem risco e sem invasão da interface do usuário.

Gilles 'SO- parar de ser mau'
fonte
(Para completar / no caso de alguém é curioso: Emacs 22 foi lançado em 2007.)
ShreevatsaR
9

O Emacs é bastante seguro quando se trata de variáveis ​​locais. Na verdade, ele não avalia nada para variáveis ​​locais de arquivo ou diretório, apenas analisa a sintaxe do Lisp. Além disso, uma variável deve ser declarada "segura" antes de ser definida pelo Emacs, e essa declaração também inclui um predicado. Portanto, uma variável pode dizer "um arquivo pode definir isso, mas apenas se for uma string".

Isso significa que você pode habilitar com segurança variáveis ​​locais. Você pode simplesmente deixar o valor padrão de t- o Emacs perguntará se ele deve definir variáveis ​​que não considere seguras, e você pode examiná-las primeiro.

Certifique-se de não definir esta variável como :all, e fazer olhar para os valores das variáveis antes de colocá-los se Emacs pede para você. Você pode usar :safeapenas para definir variáveis ​​que o Emacs julgue seguras e ignorar o resto, mas você pode perder algumas coisas dessa maneira.

Jorgen Schäfer
fonte