Bezpieczny sposób na włączenie „lokalnych zmiennych”?

13

Mój plik .emacs odziedziczyłem około 18 lat temu od znajomego. Pośrodku znajduje się złowieszczy komentarz ostrzegający o konsekwencjach bezpieczeństwa dla tej enable-local-variablesfunkcji:

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

Tak naprawdę nigdy nie korzystałem z tej local-variablesfunkcji, chociaż wydaje się, że może być całkiem przydatna. Czy istnieje sposób na enable-local-variablesto, aby działał coś przydatnego bez narażania mnie na ataki polegające na wstrzykiwaniu kodu?

Wędrująca logika
źródło

Odpowiedzi:

13

18 lat temu miałeś rację, że się martwisz. Ale czas mijał. Od Emacsa 22 istnieje przyzwoity wbudowany mechanizm do białej listy bezpiecznych zmiennych lokalnych. Szczegóły są udokumentowane w podręczniku Emacs Lisp . Najważniejsze aspekty to:

  • Autorzy Lisp mogą zadeklarować bezpieczne wartości dla każdej zmiennej. To jest biała lista: jeśli programista Lisp nie zrobił nic specjalnego, wszystkie wartości są uważane za niebezpieczne.
  • Jeśli enable-local-variablesjest ustawiony na t(domyślny), Emacs automatycznie ustawi bezpieczne wartości i wyświetli monit o potwierdzenie, jeśli plik spróbuje ustawić niebezpieczną wartość. Gdy użytkownik zatwierdzi wartość dla danej zmiennej, jest ona automatycznie rejestrowana i Emacs nie zapyta ponownie o tę samą wartość dla tej samej zmiennej.
  • Jeśli enable-local-variablesjest ustawiony na :safe, Emacs automatycznie ustawi bezpieczne wartości i zignoruje pozostałe.

Możesz więc zachować ustawienie domyślne, jeśli nie masz nic przeciwko wyświetlaniu monitu, lub użyj go, (setq enable-local-variables :safe)aby uzyskać wspólne korzyści (styl wcięcia, format znacznika czasu itp.) Bez ryzyka i naruszenia interfejsu użytkownika.

Gilles „SO- przestań być zły”
źródło
(Dla kompletności / na wypadek, gdyby ktoś był ciekawy: Emacs 22 został wydany w 2007 r.)
ShreevatsaR
9

Emacs jest dość bezpieczny, jeśli chodzi o zmienne lokalne. W rzeczywistości nie ocenia niczego dla zmiennych lokalnych plików lub katalogów, analizuje tylko składnię Lisp. Ponadto zmienną należy określić jako „bezpieczną”, zanim zostanie ustawiona przez Emacsa, a deklaracja ta zawiera także predykat. Zmienna może więc powiedzieć „plik może to ustawić, ale tylko jeśli jest to ciąg znaków”.

Oznacza to, że możesz bezpiecznie włączyć zmienne lokalne. Możesz po prostu zostawić domyślną wartość t- Emacs zapyta cię, czy powinien ustawić zmienne, których nie uważa za bezpieczne, i możesz je najpierw sprawdzić.

Upewnij się, czy nie ustawić tę zmienną :all, i zrobić spojrzeć na wartości zmiennych zanim ustawiając je jeśli Emacs poprosi. Możesz użyć :safetylko do ustawienia zmiennych, które Emacs uważa za bezpieczne, i zignoruj ​​resztę, ale w ten sposób możesz przegapić pewne rzeczy.

Jorgen Schäfer
źródło