Cara aman untuk `mengaktifkan-variabel-lokal`?

13

Saya mewarisi file .emacs saya dari seorang teman sekitar 18 tahun yang lalu. Terkubur di tengah adalah peringatan komentar tak menyenangkan berikut tentang implikasi keamanan enable-local-variablesfitur:

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

Jadi saya tidak pernah benar-benar menggunakan local-variablesfitur ini walaupun sepertinya itu bisa sangat berguna. Apakah ada cara untuk enable-local-variablesmelakukan sesuatu yang bermanfaat tanpa membuat saya terkena serangan injeksi kode arbitrer?

Logika Pengembaraan
sumber

Jawaban:

13

18 tahun yang lalu, Anda benar khawatir. Tapi waktu terus berjalan. Sejak Emacs 22, ada mekanisme bawaan yang layak untuk memasukkan variabel lokal aman ke daftar putih. Detailnya didokumentasikan dalam manual Emacs Lisp . Aspek yang paling penting adalah:

  • Penulis Lisp dapat mendeklarasikan nilai aman untuk setiap variabel. Ini adalah daftar putih: jika programmer Lisp tidak melakukan sesuatu yang istimewa, semua nilai dianggap tidak aman.
  • Jika enable-local-variablesdiatur ke t(default), Emacs akan secara otomatis menetapkan nilai aman dan meminta konfirmasi jika file mencoba untuk menetapkan nilai yang tidak aman. Setelah pengguna menyetujui nilai untuk variabel yang diberikan, ini direkam secara otomatis dan Emacs tidak akan bertanya lagi tentang nilai yang sama untuk variabel yang sama.
  • Jika enable-local-variablesdiatur ke :safe, Emacs akan secara otomatis menetapkan nilai aman dan mengabaikan yang lain.

Jadi, Anda dapat mempertahankan pengaturan default jika Anda tidak keberatan diminta, atau gunakan (setq enable-local-variables :safe)untuk mendapatkan manfaat umum (gaya indentasi, format stempel waktu, dll.) Tanpa risiko dan tanpa gangguan antarmuka pengguna.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
(Untuk kelengkapan / kalau-kalau ada yang penasaran: Emacs 22 dirilis pada 2007.)
ShreevatsaR
9

Emacs cukup aman ketika datang ke variabel lokal. Sebenarnya tidak mengevaluasi apa pun untuk variabel file-atau direktori-lokal, itu hanya mem-parsing sintaks Lisp. Juga, variabel harus dinyatakan "aman" sebelum akan ditetapkan oleh Emacs, dan deklarasi itu juga termasuk predikat. Jadi variabel dapat mengatakan "file dapat mengatur ini, tetapi hanya jika itu adalah string".

Ini berarti Anda dapat mengaktifkan variabel lokal dengan aman. Anda sebenarnya dapat meninggalkan nilai default t- Emacs akan bertanya kepada Anda apakah harus mengatur variabel yang tidak dianggap aman, dan Anda dapat memeriksa yang pertama.

Pastikan Anda tidak mengatur variabel ini :all, dan jangan melihat nilai-nilai variabel terlebih dahulu sebelum mengaturnya jika Emacs meminta Anda. Anda dapat menggunakan :safehanya mengatur variabel yang dianggap aman oleh Emacs dan mengabaikan sisanya, tetapi Anda dapat melewatkan beberapa hal dengan cara ini.

Jorgen Schäfer
sumber