Un moyen sûr d'activer les variables locales?


13

J'ai hérité mon fichier .emacs d'un ami il y a environ 18 ans. Enterré au milieu se trouve l'avertissement inquiétant suivant sur les implications de sécurité de la enable-local-variablesfonctionnalité:

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

Je n'ai donc jamais réellement utilisé la local-variablesfonctionnalité même si elle semble être très utile. Existe-t-il un moyen de faire enable-local-variablesquelque chose d'utile sans m'exposer à des attaques arbitraires par injection de code?

Réponses:


13

Il y a 18 ans, vous aviez raison de vous inquiéter. Mais le temps a marché. Depuis Emacs 22, il existe un mécanisme intégré décent pour mettre en liste blanche les variables locales sûres. Les détails sont documentés dans le manuel Emacs Lisp . Les aspects les plus importants sont:

  • Les auteurs Lisp peuvent déclarer des valeurs sûres pour chaque variable. Ceci est une liste blanche: si le programmeur Lisp n'a rien fait de spécial, toutes les valeurs sont considérées comme dangereuses.
  • Si enable-local-variablesest défini sur t(valeur par défaut), Emacs définira automatiquement des valeurs sûres et demandera une confirmation si un fichier tente de définir une valeur non sûre. Une fois que l'utilisateur a approuvé une valeur pour une variable donnée, celle-ci est automatiquement enregistrée et Emacs ne posera plus de question sur la même valeur pour la même variable.
  • Si enable-local-variablesest défini sur :safe, Emacs définira automatiquement des valeurs sûres et ignorera les autres.

Vous pouvez donc conserver le paramètre par défaut si cela ne vous dérange pas d'être invité, ou utiliser (setq enable-local-variables :safe)pour obtenir les avantages communs (style de retrait, format d'horodatage, etc.) sans risque et sans empiètement sur l'interface utilisateur.


(Pour être complet / au cas où quelqu'un serait curieux: Emacs 22 a été publié en 2007.)
ShreevatsaR

9

Emacs est assez sûr en ce qui concerne les variables locales. Il n'évalue en fait rien pour les variables locales de fichier ou de répertoire, il analyse uniquement la syntaxe Lisp. De plus, une variable doit être déclarée "sûre" avant d'être définie par Emacs, et cette déclaration inclut également un prédicat. Ainsi, une variable peut dire "un fichier peut définir cela, mais seulement s'il s'agit d'une chaîne".

Cela signifie que vous pouvez activer en toute sécurité les variables locales. Vous pouvez en fait simplement laisser la valeur par défaut de t- Emacs vous demandera s'il doit définir des variables qu'il ne juge pas sûres, et vous pouvez les examiner en premier.

Assurez-vous de ne pas définir cette variable :all, et faire examiner les valeurs des variables avant de les mettre si Emacs vous demande. Vous pouvez utiliser :safeuniquement pour définir des variables qu'Emacs juge sûres et ignorer le reste, mais vous pouvez passer à côté de certaines choses de cette façon.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.