Un modo sicuro per abilitare le variabili locali?


13

Ho ereditato il mio file .emacs da un amico circa 18 anni fa. Sepolto nel mezzo c'è il seguente minaccioso commento di avviso sulle implicazioni di sicurezza della enable-local-variablesfunzione:

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

Quindi non ho mai usato la local-variablesfunzionalità, anche se sembra che potrebbe essere abbastanza utile. C'è un modo per enable-local-variablesfare qualcosa di utile senza esponermi ad attacchi arbitrari di iniezione di codice?

Risposte:


13

18 anni fa, avevi ragione a essere preoccupato. Ma il tempo è andato avanti. Da Emacs 22, esiste un discreto meccanismo incorporato per autorizzare le variabili locali sicure. I dettagli sono documentati nel manuale di Emacs Lisp . Gli aspetti più importanti sono:

  • Gli autori di Lisp possono dichiarare valori sicuri per ogni variabile. Questa è una lista bianca: se il programmatore Lisp non ha fatto nulla di speciale, tutti i valori sono considerati non sicuri.
  • Se enable-local-variablesè impostato sut (impostazione predefinita), Emacs imposterà automaticamente valori sicuri e chiederà conferma se un file tenta di impostare un valore non sicuro. Una volta che l'utente ha approvato un valore per una determinata variabile, questo viene automaticamente registrato ed Emacs non chiederà nuovamente lo stesso valore per la stessa variabile.
  • Se enable-local-variablesimpostato su :safe, Emacs imposterà automaticamente valori sicuri e ignorerà gli altri.

Quindi puoi mantenere l'impostazione predefinita se non ti dispiace essere richiesto o utilizzare (setq enable-local-variables :safe)per ottenere i vantaggi comuni (stile di rientro, formato data / ora, ecc.) Senza rischi e senza invasione dell'interfaccia utente.


(Per completezza / nel caso qualcuno fosse curioso: Emacs 22 è stato rilasciato nel 2007.)
ShreevatsaR

9

Emacs è abbastanza sicuro quando si tratta di variabili locali. In realtà non valuta nulla per le variabili locali di file o directory, ma analizza solo la sintassi di Lisp. Inoltre, una variabile deve essere dichiarata "sicura" prima di essere impostata da Emacs e tale dichiarazione include anche un predicato. Quindi una variabile può dire "un file può impostare questo, ma solo se è una stringa".

Ciò significa che puoi abilitare in sicurezza le variabili locali. In realtà puoi semplicemente lasciare il valore predefinito di t- Emacs ti chiederà se deve impostare variabili che non ritiene sicure e puoi esaminarle prima.

Assicurati di non impostare questa variabile su :all, e fallo un'occhiata ai valori delle variabili prima prima di loro se Emacs ti chiede. Puoi usare :safesolo per impostare le variabili che Emacs ritiene sicure e ignorare il resto, ma puoi perdere alcune cose in questo modo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.